Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/vfs/vfs_ops.c

    rc69646f8 re6da6d5  
    5252#include <assert.h>
    5353#include <vfs/canonify.h>
     54#include <vfs/vfs_mtab.h>
     55
     56FIBRIL_MUTEX_INITIALIZE(mtab_list_lock);
     57LIST_INITIALIZE(mtab_list);
     58static size_t mtab_size = 0;
    5459
    5560/* Forward declarations of static functions. */
     
    6873};
    6974
    70 static void vfs_mount_internal(ipc_callid_t rid, service_id_t service_id,
     75static int vfs_mount_internal(ipc_callid_t rid, service_id_t service_id,
    7176    fs_handle_t fs_handle, char *mp, char *opts)
    7277{
     
    9196                        fibril_rwlock_write_unlock(&namespace_rwlock);
    9297                        async_answer_0(rid, EBUSY);
    93                         return;
     98                        return EBUSY;
    9499                }
    95100               
     
    99104                        fibril_rwlock_write_unlock(&namespace_rwlock);
    100105                        async_answer_0(rid, rc);
    101                         return;
     106                        return rc;
    102107                }
    103108               
     
    106111                        fibril_rwlock_write_unlock(&namespace_rwlock);
    107112                        async_answer_0(rid, ENOMEM);
    108                         return;
     113                        return ENOMEM;
    109114                }
    110115               
     
    135140                                fibril_rwlock_write_unlock(&namespace_rwlock);
    136141                                async_answer_0(rid, rc);
    137                                 return;
     142                                return rc;
    138143                        }
    139144                        async_wait_for(msg, &rc);
     
    142147                                fibril_rwlock_write_unlock(&namespace_rwlock);
    143148                                async_answer_0(rid, rc);
    144                                 return;
     149                                return rc;
    145150                        }
    146151
    147152                        rindex = (fs_index_t) IPC_GET_ARG1(answer);
    148                         rsize = (aoff64_t) MERGE_LOUP32(IPC_GET_ARG2(answer), IPC_GET_ARG3(answer));
     153                        rsize = (aoff64_t) MERGE_LOUP32(IPC_GET_ARG2(answer),
     154                            IPC_GET_ARG3(answer));
    149155                        rlnkcnt = (unsigned) IPC_GET_ARG4(answer);
    150156                       
     
    165171                        fibril_rwlock_write_unlock(&namespace_rwlock);
    166172                        async_answer_0(rid, rc);
    167                         return;
     173                        return rc;
    168174                } else {
    169175                        /*
     
    173179                        fibril_rwlock_write_unlock(&namespace_rwlock);
    174180                        async_answer_0(rid, ENOENT);
    175                         return;
     181                        return ENOENT;
    176182                }
    177183        }
     
    206212                async_answer_0(rid, rc);
    207213                fibril_rwlock_write_unlock(&namespace_rwlock);
    208                 return;
     214                return rc;
    209215        }
    210216       
     
    221227                fibril_rwlock_write_unlock(&namespace_rwlock);
    222228                async_answer_0(rid, rc);
    223                 return;
     229                return rc;
    224230        }
    225231       
     
    257263        async_answer_0(rid, rc);
    258264        fibril_rwlock_write_unlock(&namespace_rwlock);
     265        return rc;
    259266}
    260267
     
    276283       
    277284        /*
    278          * For now, don't make use of ARG3, but it can be used to
    279          * carry mount options in the future.
    280          */
    281        
     285         * Instance number is passed as ARG3.
     286         */
     287        unsigned int instance = IPC_GET_ARG3(*request);
     288
    282289        /* We want the client to send us the mount point. */
    283290        char *mp;
     
    335342        fs_handle_t fs_handle;
    336343recheck:
    337         fs_handle = fs_name_to_handle(fs_name, false);
     344        fs_handle = fs_name_to_handle(instance, fs_name, false);
    338345        if (!fs_handle) {
    339346                if (flags & IPC_FLAG_BLOCKING) {
     
    351358        }
    352359        fibril_mutex_unlock(&fs_list_lock);
    353        
    354         /* Acknowledge that we know fs_name. */
    355         async_answer_0(callid, EOK);
    356        
     360
     361        /* Add the filesystem info to the list of mounted filesystems */
     362        mtab_ent_t *mtab_ent = malloc(sizeof(mtab_ent_t));
     363        if (!mtab_ent) {
     364                async_answer_0(callid, ENOMEM);
     365                async_answer_0(rid, ENOMEM);
     366                free(mp);
     367                free(fs_name);
     368                free(opts);
     369                return;
     370        }
     371
    357372        /* Do the mount */
    358         vfs_mount_internal(rid, service_id, fs_handle, mp, opts);
     373        rc = vfs_mount_internal(rid, service_id, fs_handle, mp, opts);
     374        if (rc != EOK) {
     375                async_answer_0(callid, ENOTSUP);
     376                async_answer_0(rid, ENOTSUP);
     377                free(mtab_ent);
     378                free(mp);
     379                free(opts);
     380                free(fs_name);
     381                return;
     382        }
     383
     384        /* Add the filesystem info to the list of mounted filesystems */
     385
     386        str_cpy(mtab_ent->mp, MAX_PATH_LEN, mp);
     387        str_cpy(mtab_ent->fs_name, FS_NAME_MAXLEN, fs_name);
     388        str_cpy(mtab_ent->opts, MAX_MNTOPTS_LEN, opts);
     389        mtab_ent->instance = instance;
     390        mtab_ent->service_id = service_id;
     391
     392        link_initialize(&mtab_ent->link);
     393
     394        fibril_mutex_lock(&mtab_list_lock);
     395        list_append(&mtab_ent->link, &mtab_list);
     396        mtab_size++;
     397        fibril_mutex_unlock(&mtab_list_lock);
     398
    359399        free(mp);
    360400        free(fs_name);
    361401        free(opts);
     402
     403        /* Acknowledge that we know fs_name. */
     404        async_answer_0(callid, EOK);
    362405}
    363406
     
    432475                 */
    433476               
    434                 free(mp);
    435                
    436477                exch = vfs_exchange_grab(mr_node->fs_handle);
    437478                rc = async_req_1_0(exch, VFS_OUT_UNMOUNTED,
     
    441482                if (rc != EOK) {
    442483                        fibril_rwlock_write_unlock(&namespace_rwlock);
     484                        free(mp);
    443485                        vfs_node_put(mr_node);
    444486                        async_answer_0(rid, rc);
     
    458500               
    459501                rc = vfs_lookup_internal(mp, L_MP, &mp_res, NULL);
    460                 free(mp);
    461502                if (rc != EOK) {
    462503                        fibril_rwlock_write_unlock(&namespace_rwlock);
     504                        free(mp);
    463505                        vfs_node_put(mr_node);
    464506                        async_answer_0(rid, rc);
     
    469511                if (!mp_node) {
    470512                        fibril_rwlock_write_unlock(&namespace_rwlock);
     513                        free(mp);
    471514                        vfs_node_put(mr_node);
    472515                        async_answer_0(rid, ENOMEM);
     
    481524                if (rc != EOK) {
    482525                        fibril_rwlock_write_unlock(&namespace_rwlock);
     526                        free(mp);
    483527                        vfs_node_put(mp_node);
    484528                        vfs_node_put(mr_node);
     
    498542         */
    499543        vfs_node_forget(mr_node);
    500        
    501544        fibril_rwlock_write_unlock(&namespace_rwlock);
     545
     546        fibril_mutex_lock(&mtab_list_lock);
     547
     548        int found = 0;
     549
     550        list_foreach(mtab_list, cur) {
     551                mtab_ent_t *mtab_ent = list_get_instance(cur, mtab_ent_t,
     552                    link);
     553
     554                if (str_cmp(mtab_ent->mp, mp) == 0) {
     555                        list_remove(&mtab_ent->link);
     556                        mtab_size--;
     557                        free(mtab_ent);
     558                        found = 1;
     559                        break;
     560                }
     561        }
     562        assert(found);
     563        fibril_mutex_unlock(&mtab_list_lock);
     564
     565        free(mp);
     566
    502567        async_answer_0(rid, EOK);
    503568}
     
    12881353}
    12891354
     1355void vfs_get_mtab(ipc_callid_t rid, ipc_call_t *request)
     1356{
     1357        ipc_callid_t callid;
     1358        ipc_call_t data;
     1359        sysarg_t rc = EOK;
     1360        size_t len;
     1361
     1362        fibril_mutex_lock(&mtab_list_lock);
     1363
     1364        /* Send to the caller the number of mounted filesystems */
     1365        callid = async_get_call(&data);
     1366        if (IPC_GET_IMETHOD(data) != VFS_IN_PING) {
     1367                rc = ENOTSUP;
     1368                async_answer_0(callid, rc);
     1369                goto exit;
     1370        }
     1371        async_answer_1(callid, EOK, mtab_size);
     1372
     1373        list_foreach(mtab_list, cur) {
     1374                mtab_ent_t *mtab_ent = list_get_instance(cur, mtab_ent_t,
     1375                    link);
     1376
     1377                rc = ENOTSUP;
     1378
     1379                if (!async_data_read_receive(&callid, &len)) {
     1380                        async_answer_0(callid, rc);
     1381                        goto exit;
     1382                }
     1383
     1384                (void) async_data_read_finalize(callid, mtab_ent->mp,
     1385                    str_size(mtab_ent->mp));
     1386
     1387                if (!async_data_read_receive(&callid, &len)) {
     1388                        async_answer_0(callid, rc);
     1389                        goto exit;
     1390                }
     1391
     1392                (void) async_data_read_finalize(callid, mtab_ent->opts,
     1393                    str_size(mtab_ent->opts));
     1394
     1395                if (!async_data_read_receive(&callid, &len)) {
     1396                        async_answer_0(callid, rc);
     1397                        goto exit;
     1398                }
     1399
     1400                (void) async_data_read_finalize(callid, mtab_ent->fs_name,
     1401                    str_size(mtab_ent->fs_name));
     1402
     1403                callid = async_get_call(&data);
     1404
     1405                if (IPC_GET_IMETHOD(data) != VFS_IN_PING) {
     1406                        async_answer_0(callid, rc);
     1407                        goto exit;
     1408                }
     1409
     1410                rc = EOK;
     1411                async_answer_2(callid, rc, mtab_ent->instance,
     1412                    mtab_ent->service_id);
     1413        }
     1414
     1415exit:
     1416        fibril_mutex_unlock(&mtab_list_lock);
     1417        async_answer_0(rid, rc);
     1418}
     1419
    12901420/**
    12911421 * @}
Note: See TracChangeset for help on using the changeset viewer.