Changeset 5bcd5b7 in mainline for uspace/srv/vfs/vfs_ops.c


Ignore:
Timestamp:
2013-07-29T14:36:57Z (12 years ago)
Author:
Jiri Zarevucky <zarevucky.jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
4636a60
Parents:
677745a
Message:

Add support for server-side mounts.

File:
1 edited

Legend:

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

    r677745a r5bcd5b7  
    7070vfs_node_t *root = NULL;
    7171
     72#if 0
     73static int vfs_attach_internal(vfs_node_t *mpoint, vfs_node_t *mountee)
     74{
     75        assert(mpoint != NULL);
     76        assert(mountee != NULL);
     77       
     78        if (mpoint->mount != NULL) {
     79                return EBUSY;
     80        }
     81       
     82        if (mpoint->type != VFS_NODE_DIRECTORY) {
     83                return ENOTDIR;
     84        }
     85       
     86        if (vfs_node_has_children(mpoint)) {
     87                return ENOTEMPTY;
     88        }
     89       
     90        mpoint->mount = mountee;
     91        vfs_node_addref(mountee);
     92        /* Add reference to make sure the node is not freed. Removed in detach_internal(). */
     93        vfs_node_addref(mpoint);
     94        return EOK;
     95}
     96
     97static int vfs_detach_internal(vfs_node_t *mpoint)
     98{
     99        assert(mpoint != NULL);
     100       
     101        if (mpoint->mount == NULL) {
     102                return ENOENT;
     103        }
     104        vfs_node_put(mpoint->mount);
     105        mpoint->mount = NULL;
     106        vfs_node_put(mpoint);
     107}
     108#endif
     109
    72110static int vfs_mount_internal(ipc_callid_t rid, service_id_t service_id,
    73111    fs_handle_t fs_handle, char *mp, char *opts)
     
    153191        }
    154192       
    155         rc = vfs_lookup_internal((vfs_triplet_t *) root, mp, L_DIRECTORY, &mp_res);
     193        rc = vfs_lookup_internal(root, mp, L_DIRECTORY, &mp_res);
    156194        if (rc != EOK) {
    157195                /* The lookup failed. */
     
    424462         * Lookup the mounted root and instantiate it.
    425463         */
    426         rc = vfs_lookup_internal((vfs_triplet_t *) root, mp, 0, &mr_res);
     464        rc = vfs_lookup_internal(root, mp, 0, &mr_res);
    427465        if (rc != EOK) {
    428466                fibril_rwlock_write_unlock(&namespace_rwlock);
     
    487525                 */
    488526               
    489                 rc = vfs_lookup_internal((vfs_triplet_t *) root, mp, L_MP, &mp_res);
     527                rc = vfs_lookup_internal(root, mp, L_MP, &mp_res);
    490528                if (rc != EOK) {
    491529                        fibril_rwlock_write_unlock(&namespace_rwlock);
     
    627665       
    628666        vfs_lookup_res_t lr;
    629         rc = vfs_lookup_internal((vfs_triplet_t *) parent_node, path, walk_lookup_flags(flags), &lr);
     667        rc = vfs_lookup_internal(parent_node, path, walk_lookup_flags(flags), &lr);
    630668        free(path);
    631669
     
    10501088}
    10511089
     1090static void out_destroy(vfs_triplet_t *file)
     1091{
     1092        async_exch_t *exch = vfs_exchange_grab(file->fs_handle);
     1093        async_msg_2(exch, VFS_OUT_DESTROY,
     1094                (sysarg_t) file->service_id, (sysarg_t) file->index);
     1095        vfs_exchange_release(exch);
     1096}
     1097
    10521098void vfs_unlink2(ipc_callid_t rid, ipc_call_t *request)
    10531099{
     
    10891135               
    10901136                vfs_lookup_res_t lr;
    1091                 rc = vfs_lookup_internal((vfs_triplet_t *) parent_node, path, lflag, &lr);
     1137                rc = vfs_lookup_internal(parent_node, path, lflag, &lr);
    10921138                if (rc != EOK) {
    10931139                        goto exit;
     
    11041150       
    11051151        vfs_lookup_res_t lr;
    1106         rc = vfs_lookup_internal((vfs_triplet_t *) parent_node, path, lflag | L_UNLINK, &lr);
     1152        rc = vfs_lookup_internal(parent_node, path, lflag | L_UNLINK, &lr);
    11071153        if (rc != EOK) {
    11081154                goto exit;
    11091155        }
    11101156
    1111         /*
    1112          * The name has already been unlinked by vfs_lookup_internal().
    1113          * We have to get and put the VFS node to ensure that it is
    1114          * VFS_OUT_DESTROY'ed after the last reference to it is dropped.
    1115          */
    1116         vfs_node_put(vfs_node_get(&lr));
     1157        /* If the node is not held by anyone, try to destroy it. */
     1158        if (vfs_node_peek(&lr) == NULL) {
     1159                out_destroy(&lr.triplet);
     1160        }
    11171161
    11181162exit:
     
    11491193}
    11501194
    1151 static int vfs_rename_internal(vfs_triplet_t *base, char *old, char *new)
     1195static int vfs_rename_internal(vfs_node_t *base, char *old, char *new)
    11521196{
    11531197        assert(base != NULL);
     
    11821226                }
    11831227               
    1184                 base = &base_lr.triplet;
     1228                base = vfs_node_get(&base_lr);
    11851229                old[shared] = '/';
    11861230                old += shared;
    11871231                new += shared;
     1232        } else {
     1233                vfs_node_addref(base);
    11881234        }
    11891235       
     
    11931239                orig_unlinked = true;
    11941240        } else if (rc != ENOENT) {
     1241                vfs_node_put(base);
    11951242                fibril_rwlock_write_unlock(&namespace_rwlock);
    11961243                return rc;
     
    12021249                        vfs_link_internal(base, new, &new_lr_orig.triplet);
    12031250                }
     1251                vfs_node_put(base);
    12041252                fibril_rwlock_write_unlock(&namespace_rwlock);
    12051253                return rc;
     
    12121260                        vfs_link_internal(base, new, &new_lr_orig.triplet);
    12131261                }
     1262                vfs_node_put(base);
    12141263                fibril_rwlock_write_unlock(&namespace_rwlock);
    12151264                return rc;
    12161265        }
    12171266       
    1218         if (orig_unlinked) {
    1219                 vfs_node_put(vfs_node_get(&new_lr_orig));
    1220         }
    1221        
     1267        /* If the node is not held by anyone, try to destroy it. */
     1268        if (orig_unlinked && vfs_node_peek(&new_lr_orig) == NULL) {
     1269                out_destroy(&new_lr_orig.triplet);
     1270        }
     1271       
     1272        vfs_node_put(base);
    12221273        fibril_rwlock_write_unlock(&namespace_rwlock);
    12231274        return EOK;
     
    12721323        }
    12731324       
    1274         rc = vfs_rename_internal((vfs_triplet_t *) base_node, oldc, newc);
     1325        rc = vfs_rename_internal(base_node, oldc, newc);
    12751326
    12761327out:
Note: See TracChangeset for help on using the changeset viewer.