Changeset 00aece0 in mainline for uspace/srv/vfs/vfs_ops.c


Ignore:
Timestamp:
2012-02-18T16:47:38Z (13 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
4449c6c
Parents:
bd5f3b7 (diff), f943dd3 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge mainline changes.

File:
1 edited

Legend:

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

    rbd5f3b7 r00aece0  
    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;
    224         }
    225        
     229                return rc;
     230        }
     231       
     232        /*
     233         * Wait for the answer before releasing the exchange to avoid deadlock
     234         * in case the answer depends on further calls to the same file system.
     235         * Think of a case when mounting a FS on a file_bd backed by a file on
     236         * the same FS.
     237         */
     238        async_wait_for(msg, &rc);
    226239        vfs_exchange_release(exch);
    227         async_wait_for(msg, &rc);
    228240       
    229241        if (rc == EOK) {
     
    251263        async_answer_0(rid, rc);
    252264        fibril_rwlock_write_unlock(&namespace_rwlock);
     265        return rc;
    253266}
    254267
     
    270283       
    271284        /*
    272          * For now, don't make use of ARG3, but it can be used to
    273          * carry mount options in the future.
    274          */
    275        
     285         * Instance number is passed as ARG3.
     286         */
     287        unsigned int instance = IPC_GET_ARG3(*request);
     288
    276289        /* We want the client to send us the mount point. */
    277290        char *mp;
     
    329342        fs_handle_t fs_handle;
    330343recheck:
    331         fs_handle = fs_name_to_handle(fs_name, false);
     344        fs_handle = fs_name_to_handle(instance, fs_name, false);
    332345        if (!fs_handle) {
    333346                if (flags & IPC_FLAG_BLOCKING) {
     
    345358        }
    346359        fibril_mutex_unlock(&fs_list_lock);
    347        
    348         /* Acknowledge that we know fs_name. */
    349         async_answer_0(callid, EOK);
    350        
     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
    351372        /* Do the mount */
    352         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
    353399        free(mp);
    354400        free(fs_name);
    355401        free(opts);
     402
     403        /* Acknowledge that we know fs_name. */
     404        async_answer_0(callid, EOK);
    356405}
    357406
     
    426475                 */
    427476               
    428                 free(mp);
    429                
    430477                exch = vfs_exchange_grab(mr_node->fs_handle);
    431478                rc = async_req_1_0(exch, VFS_OUT_UNMOUNTED,
     
    435482                if (rc != EOK) {
    436483                        fibril_rwlock_write_unlock(&namespace_rwlock);
     484                        free(mp);
    437485                        vfs_node_put(mr_node);
    438486                        async_answer_0(rid, rc);
     
    452500               
    453501                rc = vfs_lookup_internal(mp, L_MP, &mp_res, NULL);
    454                 free(mp);
    455502                if (rc != EOK) {
    456503                        fibril_rwlock_write_unlock(&namespace_rwlock);
     504                        free(mp);
    457505                        vfs_node_put(mr_node);
    458506                        async_answer_0(rid, rc);
     
    463511                if (!mp_node) {
    464512                        fibril_rwlock_write_unlock(&namespace_rwlock);
     513                        free(mp);
    465514                        vfs_node_put(mr_node);
    466515                        async_answer_0(rid, ENOMEM);
     
    475524                if (rc != EOK) {
    476525                        fibril_rwlock_write_unlock(&namespace_rwlock);
     526                        free(mp);
    477527                        vfs_node_put(mp_node);
    478528                        vfs_node_put(mr_node);
     
    492542         */
    493543        vfs_node_forget(mr_node);
    494        
    495544        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
    496567        async_answer_0(rid, EOK);
    497568}
     
    12821353}
    12831354
     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
    12841420/**
    12851421 * @}
Note: See TracChangeset for help on using the changeset viewer.