Changes in / [3a67d63:224174f] in mainline


Ignore:
Files:
3 added
15 edited

Legend:

Unmodified
Added
Removed
  • boot/Makefile.common

    r3a67d63 r224174f  
    202202        $(USPACE_PATH)/app/websrv/websrv \
    203203        $(USPACE_PATH)/app/date/date \
    204         $(USPACE_PATH)/app/vdemo/vdemo
     204        $(USPACE_PATH)/app/vdemo/vdemo \
     205        $(USPACE_PATH)/app/df/df
    205206
    206207ifeq ($(CONFIG_PCC),y)
  • uspace/Makefile

    r3a67d63 r224174f  
    8080        app/vlaunch \
    8181        app/vterm \
     82        app/df \
    8283        srv/clipboard \
    8384        srv/locsrv \
  • uspace/app/trace/trace.c

    r3a67d63 r224174f  
    724724        o = oper_new("stat", 0, arg_def, V_ERRNO, 0, resp_def);
    725725        proto_add_oper(p, VFS_IN_STAT, o);
     726        o = oper_new("statfs", 0, arg_def, V_ERRNO, 0, resp_def);
     727        proto_add_oper(p, VFS_IN_STATFS, o);
    726728
    727729        proto_register(SERVICE_VFS, p);
  • uspace/lib/c/generic/vfs/vfs.c

    r3a67d63 r224174f  
    4343#include <stdio.h>
    4444#include <sys/stat.h>
     45#include <sys/statfs.h>
    4546#include <sys/types.h>
    4647#include <ipc/services.h>
     
    892893}
    893894
     895int statfs(const char *path, struct statfs *statfs)
     896{
     897        sysarg_t rc;
     898        sysarg_t rc_orig;
     899        aid_t req;
     900        size_t pa_size;
     901       
     902        char *pa = absolutize(path, &pa_size);
     903        if (!pa)
     904                return ENOMEM;
     905        async_exch_t *exch = vfs_exchange_begin();
     906       
     907        req = async_send_0(exch, VFS_IN_STATFS, NULL);
     908        rc = async_data_write_start(exch, pa, pa_size);
     909        if (rc != EOK) {
     910                vfs_exchange_end(exch);
     911                free(pa);
     912                async_wait_for(req, &rc_orig);
     913                if (rc_orig == EOK)
     914                        return (int) rc;
     915                else
     916                        return (int) rc_orig;
     917        }
     918        rc = async_data_read_start(exch, (void *) statfs, sizeof(struct statfs));
     919        if (rc != EOK) {
     920                vfs_exchange_end(exch);
     921                free(pa);
     922                async_wait_for(req, &rc_orig);
     923                if (rc_orig == EOK)
     924                        return (int) rc;
     925                else
     926                        return (int) rc_orig;
     927        }
     928        vfs_exchange_end(exch);
     929        free(pa);
     930        async_wait_for(req, &rc);
     931        return rc;
     932}
     933
    894934/** @}
    895935 */
  • uspace/lib/c/include/ipc/vfs.h

    r3a67d63 r224174f  
    8282        VFS_IN_WAIT_HANDLE,
    8383        VFS_IN_MTAB_GET,
     84        VFS_IN_STATFS
    8485} vfs_in_request_t;
    8586
     
    9899        VFS_OUT_LOOKUP,
    99100        VFS_OUT_DESTROY,
     101        VFS_OUT_STATFS,
    100102        VFS_OUT_LAST
    101103} vfs_out_request_t;
  • uspace/lib/c/include/vfs/vfs.h

    r3a67d63 r224174f  
    4444#include "vfs_mtab.h"
    4545
     46
    4647enum vfs_change_state_type {
    4748        VFS_PASS_HANDLE
    4849};
     50
    4951
    5052extern char *absolutize(const char *, size_t *);
     
    6163extern async_exch_t *vfs_exchange_begin(void);
    6264extern void vfs_exchange_end(async_exch_t *);
    63 
    6465#endif
    6566
  • uspace/lib/fs/libfs.c

    r3a67d63 r224174f  
    4545#include <mem.h>
    4646#include <sys/stat.h>
     47#include <sys/statfs.h>
    4748#include <stdlib.h>
    4849
     
    7475static void libfs_open_node(libfs_ops_t *, fs_handle_t, ipc_callid_t,
    7576    ipc_call_t *);
     77static void libfs_statfs(libfs_ops_t *, fs_handle_t, ipc_callid_t, ipc_call_t *);
    7678
    7779static void vfs_out_mounted(ipc_callid_t rid, ipc_call_t *req)
     
    219221}
    220222
     223static void vfs_out_statfs(ipc_callid_t rid, ipc_call_t *req)
     224{
     225        libfs_statfs(libfs_ops, reg.fs_handle, rid, req);
     226}
    221227static void vfs_connection(ipc_callid_t iid, ipc_call_t *icall, void *arg)
    222228{
     
    276282                case VFS_OUT_SYNC:
    277283                        vfs_out_sync(callid, &call);
     284                        break;
     285                case VFS_OUT_STATFS:
     286                        vfs_out_statfs(callid, &call);
    278287                        break;
    279288                default:
     
    830839}
    831840
     841void libfs_statfs(libfs_ops_t *ops, fs_handle_t fs_handle, ipc_callid_t rid,
     842    ipc_call_t *request)
     843{
     844        service_id_t service_id = (service_id_t) IPC_GET_ARG1(*request);
     845        fs_index_t index = (fs_index_t) IPC_GET_ARG2(*request);
     846       
     847        fs_node_t *fn;
     848        int rc = ops->node_get(&fn, service_id, index);
     849        on_error(rc, answer_and_return(rid, rc));
     850       
     851        ipc_callid_t callid;
     852        size_t size;
     853        if ((!async_data_read_receive(&callid, &size)) ||
     854            (size != sizeof(struct statfs))) {
     855                ops->node_put(fn);
     856                async_answer_0(callid, EINVAL);
     857                async_answer_0(rid, EINVAL);
     858                return;
     859        }
     860       
     861        struct statfs statfs;
     862        memset(&statfs, 0, sizeof(struct statfs));
     863
     864        if (NULL != ops->size_block)   
     865                statfs.f_bsize = ops->size_block(service_id);
     866       
     867        ops->node_put(fn);
     868       
     869        async_data_read_finalize(callid, &statfs, sizeof(struct statfs));
     870        async_answer_0(rid, EOK);
     871}
     872
     873
    832874/** Open VFS triplet.
    833875 *
  • uspace/lib/fs/libfs.h

    r3a67d63 r224174f  
    9393        bool (* is_file)(fs_node_t *);
    9494        service_id_t (* service_get)(fs_node_t *);
     95        long (* size_block)(service_id_t);
    9596} libfs_ops_t;
    9697
  • uspace/srv/fs/exfat/exfat_ops.c

    r3a67d63 r224174f  
    8989static bool exfat_is_file(fs_node_t *node);
    9090static service_id_t exfat_service_get(fs_node_t *node);
     91static long exfat_size_block(service_id_t);
    9192
    9293/*
     
    912913}
    913914
     915long exfat_size_block(service_id_t service_id)
     916{
     917        exfat_bs_t *bs;
     918        bs = block_bb_get(service_id);
     919       
     920        return BPC(bs);
     921}
    914922
    915923/** libfs operations */
     
    930938        .is_directory = exfat_is_directory,
    931939        .is_file = exfat_is_file,
    932         .service_get = exfat_service_get
     940        .service_get = exfat_service_get,
     941        .size_block = exfat_size_block
    933942};
    934943
  • uspace/srv/fs/ext4fs/ext4fs_ops.c

    r3a67d63 r224174f  
    101101static bool ext4fs_is_file(fs_node_t *node);
    102102static service_id_t ext4fs_service_get(fs_node_t *node);
     103static long ext4fs_size_block(service_id_t);
    103104
    104105/* Static variables */
     
    836837        ext4fs_node_t *enode = EXT4FS_NODE(fn);
    837838        return enode->instance->service_id;
     839}
     840
     841long ext4fs_size_block(service_id_t service_id)
     842{
     843        ext4fs_instance_t *inst;
     844        int rc = ext4fs_instance_get(service_id, &inst);
     845        if (rc != EOK)
     846                return rc;
     847        if (NULL == inst)
     848                return ENOENT;
     849        ext4_superblock_t *sb = inst->filesystem->superblock;
     850        uint32_t block_size = ext4_superblock_get_block_size(sb);
     851        return block_size;
    838852}
    839853
     
    857871        .is_directory = ext4fs_is_directory,
    858872        .is_file = ext4fs_is_file,
    859         .service_get = ext4fs_service_get
     873        .service_get = ext4fs_service_get,
     874        .size_block = ext4fs_size_block
    860875};
    861876
  • uspace/srv/fs/fat/fat_ops.c

    r3a67d63 r224174f  
    9191static bool fat_is_file(fs_node_t *node);
    9292static service_id_t fat_service_get(fs_node_t *node);
     93static long fat_size_block(service_id_t);
    9394
    9495/*
     
    843844}
    844845
     846long fat_size_block(service_id_t service_id)
     847{
     848        fat_bs_t *bs;
     849        bs = block_bb_get(service_id);
     850
     851        return BPC(bs);
     852}
     853
    845854/** libfs operations */
    846855libfs_ops_t fat_libfs_ops = {
     
    860869        .is_directory = fat_is_directory,
    861870        .is_file = fat_is_file,
    862         .service_get = fat_service_get
     871        .service_get = fat_service_get,
     872        .size_block = fat_size_block
    863873};
    864874
  • uspace/srv/fs/mfs/mfs_ops.c

    r3a67d63 r224174f  
    6464static int mfs_check_sanity(struct mfs_sb_info *sbi);
    6565static bool is_power_of_two(uint32_t n);
     66static long mfs_size_block(service_id_t service_id);
    6667
    6768static hash_table_t open_nodes;
     
    8485        .destroy = mfs_destroy_node,
    8586        .has_children = mfs_has_children,
    86         .lnkcnt_get = mfs_lnkcnt_get
     87        .lnkcnt_get = mfs_lnkcnt_get,
     88        .size_block = mfs_size_block
    8789};
    8890
     
    11291131}
    11301132
     1133static long
     1134mfs_size_block(service_id_t service_id)
     1135{
     1136        long block_size;
     1137
     1138        struct mfs_instance *inst;
     1139        int rc = mfs_instance_get(service_id, &inst);
     1140        if (rc != EOK)
     1141                return rc;
     1142        if (NULL == inst)
     1143                return ENOENT;
     1144        block_size = inst->sbi->block_size;
     1145        return block_size;
     1146}
     1147
    11311148vfs_out_ops_t mfs_ops = {
    11321149        .mounted = mfs_mounted,
  • uspace/srv/vfs/vfs.c

    r3a67d63 r224174f  
    130130                        vfs_get_mtab(callid, &call);
    131131                        break;
     132                case VFS_IN_STATFS:
     133                        vfs_statfs(callid, &call);
     134                        break;
    132135                default:
    133136                        async_answer_0(callid, ENOTSUP);
  • uspace/srv/vfs/vfs.h

    r3a67d63 r224174f  
    222222extern void vfs_wait_handle(ipc_callid_t, ipc_call_t *);
    223223extern void vfs_get_mtab(ipc_callid_t, ipc_call_t *);
     224extern void vfs_statfs(ipc_callid_t, ipc_call_t *);
    224225
    225226#endif
  • uspace/srv/vfs/vfs_ops.c

    r3a67d63 r224174f  
    14181418}
    14191419
     1420void vfs_statfs(ipc_callid_t rid, ipc_call_t *request)
     1421{
     1422        char *path;
     1423        int rc = async_data_write_accept((void **) &path, true, 0, 0, 0, NULL);
     1424        if (rc != EOK) {
     1425                async_answer_0(rid, rc);
     1426                return;
     1427        }
     1428       
     1429        ipc_callid_t callid;
     1430        if (!async_data_read_receive(&callid, NULL)) {
     1431                free(path);
     1432                async_answer_0(callid, EINVAL);
     1433                async_answer_0(rid, EINVAL);
     1434                return;
     1435        }
     1436
     1437        vfs_lookup_res_t lr;
     1438        fibril_rwlock_read_lock(&namespace_rwlock);
     1439        rc = vfs_lookup_internal(path, L_NONE, &lr, NULL);
     1440        free(path);
     1441        if (rc != EOK) {
     1442                fibril_rwlock_read_unlock(&namespace_rwlock);
     1443                async_answer_0(callid, rc);
     1444                async_answer_0(rid, rc);
     1445                return;
     1446        }
     1447        vfs_node_t *node = vfs_node_get(&lr);
     1448        if (!node) {
     1449                fibril_rwlock_read_unlock(&namespace_rwlock);
     1450                async_answer_0(callid, ENOMEM);
     1451                async_answer_0(rid, ENOMEM);
     1452                return;
     1453        }
     1454
     1455        fibril_rwlock_read_unlock(&namespace_rwlock);
     1456
     1457        async_exch_t *exch = vfs_exchange_grab(node->fs_handle);
     1458       
     1459        aid_t msg;
     1460        msg = async_send_3(exch, VFS_OUT_STATFS, node->service_id,
     1461            node->index, false, NULL);
     1462        async_forward_fast(callid, exch, 0, 0, 0, IPC_FF_ROUTE_FROM_ME);
     1463       
     1464        vfs_exchange_release(exch);
     1465       
     1466        sysarg_t rv;
     1467        async_wait_for(msg, &rv);
     1468
     1469        async_answer_0(rid, rv);
     1470
     1471        vfs_node_put(node);
     1472}
     1473
    14201474/**
    14211475 * @}
Note: See TracChangeset for help on using the changeset viewer.