Changeset f49b0ea in mainline for uspace/srv/vfs/vfs_ops.c


Ignore:
Timestamp:
2008-06-06T15:16:41Z (16 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
cde485d
Parents:
f86c184
Message:

Split the 'mount another filesystem here' and 'you are being mounted and the
device is this' mount semantics. Add VFS_MOUNTED VFS operation that corresponds
to the latter and reserve VFS_MOUNT only for the former. Because of this
change, the VFS server does not maintain the mr_node VFS node for the name space
root anymore and the VFS_LOOKUP operation is now not meant to be used on
unmounted file system, not even for looking up the root node of unmounted file
systems. In the light of these changes, TMPFS is now initialized from
tmpfs_mounted() function.

File:
1 edited

Legend:

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

    rf86c184 rf49b0ea  
    6363
    6464futex_t rootfs_futex = FUTEX_INITIALIZER;
    65 vfs_triplet_t rootfs = {
     65vfs_pair_t rootfs = {
    6666        .fs_handle = 0,
    67         .dev_handle = 0,
    68         .index = 0,
     67        .dev_handle = 0
    6968};
    70 
    71 static int
    72 lookup_root(fs_handle_t fs_handle, dev_handle_t dev_handle,
    73     vfs_lookup_res_t *result)
    74 {
    75         vfs_pair_t altroot = {
    76                 .fs_handle = fs_handle,
    77                 .dev_handle = dev_handle,
    78         };
    79 
    80         return vfs_lookup_internal("/", L_DIRECTORY, result, &altroot);
    81 }
    8269
    8370void vfs_mount(ipc_callid_t rid, ipc_call_t *request)
     
    164151        buf[size] = '\0';
    165152
    166         /*
    167          * Lookup the root node of the filesystem being mounted.
    168          * In this case, we don't need to take the namespace_futex as the root
    169          * node cannot be removed. However, we do take a reference to it so
    170          * that we can track how many times it has been mounted.
    171          */
    172         vfs_lookup_res_t mr_res;
    173         rc = lookup_root(fs_handle, dev_handle, &mr_res);
    174         if (rc != EOK) {
    175                 free(buf);
    176                 ipc_answer_0(rid, rc);
    177                 return;
    178         }
    179         vfs_node_t *mr_node = vfs_node_get(&mr_res);
    180         if (!mr_node) {
    181                 free(buf);
    182                 ipc_answer_0(rid, ENOMEM);
    183                 return;
    184         }
    185 
    186         /* Finally, we need to resolve the path to the mountpoint. */
     153        /* Resolve the path to the mountpoint. */
    187154        vfs_lookup_res_t mp_res;
    188155        futex_down(&rootfs_futex);
     
    194161                        rwlock_write_unlock(&namespace_rwlock);
    195162                        futex_up(&rootfs_futex);
    196                         vfs_node_put(mr_node);
    197163                        free(buf);
    198164                        ipc_answer_0(rid, EBUSY);
     
    204170                        rwlock_write_unlock(&namespace_rwlock);
    205171                        futex_up(&rootfs_futex);
    206                         vfs_node_put(mr_node);  /* failed -> drop reference */
    207172                        free(buf);
    208173                        ipc_answer_0(rid, rc);
     
    213178                        rwlock_write_unlock(&namespace_rwlock);
    214179                        futex_up(&rootfs_futex);
    215                         vfs_node_put(mr_node);  /* failed -> drop reference */
    216180                        free(buf);
    217181                        ipc_answer_0(rid, ENOMEM);
     
    233197                        free(buf);
    234198                       
    235                         /* Inform the mount point about the root mount. */
    236                         phone = vfs_grab_phone(mr_res.triplet.fs_handle);
    237                         rc = async_req_5_0(phone, VFS_MOUNT,
    238                             (ipcarg_t) mr_res.triplet.dev_handle,
    239                             (ipcarg_t) mr_res.triplet.index,
    240                             (ipcarg_t) mr_res.triplet.fs_handle,
    241                             (ipcarg_t) mr_res.triplet.dev_handle,
    242                             (ipcarg_t) mr_res.triplet.index);
     199                        /* Tell the mountee that it is being mounted. */
     200                        phone = vfs_grab_phone(fs_handle);
     201                        rc = async_req_1_0(phone, VFS_MOUNTED,
     202                            (ipcarg_t) dev_handle);
    243203                        vfs_release_phone(phone);
    244204
    245                         if (rc == EOK)
    246                                 rootfs = mr_res.triplet;
    247                         else
    248                                 vfs_node_put(mr_node);
     205                        if (rc == EOK) {
     206                                rootfs.fs_handle = fs_handle;
     207                                rootfs.dev_handle = dev_handle;
     208                        }
    249209
    250210                        futex_up(&rootfs_futex);
     
    258218                        futex_up(&rootfs_futex);
    259219                        free(buf);
    260                         vfs_node_put(mr_node);  /* failed -> drop reference */
    261220                        ipc_answer_0(rid, ENOENT);
    262221                        return;
     
    269228        /*
    270229         * At this point, we have all necessary pieces: file system and device
    271          * handles, and we know the mount point VFS node and also the root node
    272          * of the file system being mounted.
    273          */
    274 
    275         /**
    276          * @todo
    277          * Add more IPC parameters so that we can send mount mode/flags.
    278          */
     230         * handles, and we know the mount point VFS node.
     231         */
     232
    279233        phone = vfs_grab_phone(mp_res.triplet.fs_handle);
    280         rc = async_req_5_0(phone, VFS_MOUNT,
     234        rc = async_req_4_0(phone, VFS_MOUNT,
    281235            (ipcarg_t) mp_res.triplet.dev_handle,
    282236            (ipcarg_t) mp_res.triplet.index,
    283             (ipcarg_t) mr_res.triplet.fs_handle,
    284             (ipcarg_t) mr_res.triplet.dev_handle,
    285             (ipcarg_t) mr_res.triplet.index);
     237            (ipcarg_t) fs_handle,
     238            (ipcarg_t) dev_handle);
    286239        vfs_release_phone(phone);
    287240
    288241        if (rc != EOK) {
    289                 /* Mount failed, drop references to mr_node and mp_node. */
    290                 vfs_node_put(mr_node);
     242                /* Mount failed, drop reference to mp_node. */
    291243                if (mp_node)
    292244                        vfs_node_put(mp_node);
Note: See TracChangeset for help on using the changeset viewer.