Changeset ce8c848 in mainline


Ignore:
Timestamp:
2010-01-25T22:26:16Z (14 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
bb0d3d24
Parents:
64af8f1 (diff), c888102 (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 progress on the unmount feature.

Location:
uspace
Files:
13 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/libc/include/ipc/vfs.h

    r64af8f1 rce8c848  
    101101 * No lookup flags used.
    102102 */
    103 #define L_NONE  0
     103#define L_NONE                  0
    104104
    105105/**
     
    108108 * with L_DIRECTORY.
    109109 */
    110 #define L_FILE  1
     110#define L_FILE                  1
    111111
    112112/**
    113  * Lookup wil succeed only if the object is a directory. If L_CREATE is
     113 * Lookup will succeed only if the object is a directory. If L_CREATE is
    114114 * specified, an empty directory will be created. This flag is mutually
    115115 * exclusive with L_FILE.
    116116 */
    117 #define L_DIRECTORY  2
     117#define L_DIRECTORY             2
     118
     119/**
     120 * Lookup will succeed only if the object is a root directory. The flag is
     121 * mutually exclusive with L_FILE and L_MP.
     122 */
     123#define L_ROOT                  4
     124
     125/**
     126 * Lookup will succeed only if the object is a mount point. The flag is mutually
     127 * exclusive with L_FILE and L_ROOT.
     128 */
     129#define L_MP                    8
     130
    118131
    119132/**
     
    121134 * object already exists. L_EXCLUSIVE is implied when L_DIRECTORY is used.
    122135 */
    123 #define L_EXCLUSIVE  4
     136#define L_EXCLUSIVE             16
    124137
    125138/**
    126139 * L_CREATE is used for creating both regular files and directories.
    127140 */
    128 #define L_CREATE  8
     141#define L_CREATE                32
    129142
    130143/**
    131144 * L_LINK is used for linking to an already existing nodes.
    132145 */
    133 #define L_LINK  16
     146#define L_LINK                  64
    134147
    135148/**
     
    138151 * VFS_UNLINK.
    139152 */
    140 #define L_UNLINK  32
     153#define L_UNLINK                128
    141154
    142155/**
     
    146159 * client.
    147160 */
    148 #define L_OPEN  64
    149 
    150 /**
    151  * L_NOCROSS_LAST_MP is used exclusively during the VFS_IN_UNMOUNT operation. It
    152  * tells the lookup routine not to cross the last mount point in the lookup
    153  * path.
    154  */
    155 #define L_NOCROSS_LAST_MP       128
     161#define L_OPEN                  256
    156162
    157163#endif
  • uspace/lib/libfs/libfs.c

    r64af8f1 rce8c848  
    224224        ipc_answer_3(rid, rc, IPC_GET_ARG1(answer), IPC_GET_ARG2(answer),
    225225            IPC_GET_ARG3(answer));
     226}
     227
     228void libfs_unmount(libfs_ops_t *ops, ipc_callid_t rid, ipc_call_t *request)
     229{
     230        dev_handle_t mp_dev_handle = (dev_handle_t) IPC_GET_ARG1(*request);
     231        fs_index_t mp_fs_index = (fs_index_t) IPC_GET_ARG2(*request);
     232        fs_node_t *fn;
     233        int res;
     234
     235        res = ops->node_get(&fn, mp_dev_handle, mp_fs_index);
     236        if ((res != EOK) || (!fn)) {
     237                ipc_answer_0(rid, combine_rc(res, ENOENT));
     238                return;
     239        }
     240
     241        /*
     242         * We are clearly expecting to find the mount point active.
     243         */
     244        if (!fn->mp_data.mp_active) {
     245                (void) ops->node_put(fn);
     246                ipc_answer_0(rid, EINVAL);
     247                return;
     248        }
     249
     250        /*
     251         * Tell the mounted file system to unmount.
     252         */
     253        res = async_req_1_0(fn->mp_data.phone, VFS_OUT_UNMOUNTED,
     254            fn->mp_data.dev_handle);
     255
     256        /*
     257         * If everything went well, perform the clean-up on our side.
     258         */
     259        if (res == EOK) {
     260                ipc_hangup(fn->mp_data.phone);
     261                fn->mp_data.mp_active = false;
     262                fn->mp_data.fs_handle = 0;
     263                fn->mp_data.dev_handle = 0;
     264                fn->mp_data.phone = 0;
     265                /* Drop the reference created in libfs_mount(). */
     266                (void) ops->node_put(fn);
     267        }
     268
     269        (void) ops->node_put(fn);
     270        ipc_answer_0(rid, res);
    226271}
    227272
     
    315360
    316361                if ((tmp) && (tmp->mp_data.mp_active) &&
    317                     (!(lflag & L_NOCROSS_LAST_MP) || (next <= last))) {
     362                    (!(lflag & L_MP) || (next <= last))) {
    318363                        if (next > last)
    319364                                next = last = first;
     
    486531                goto out;
    487532        }
     533
     534        if ((lflag & L_ROOT) && par) {
     535                ipc_answer_0(rid, EINVAL);
     536                goto out;
     537        }
    488538       
    489539out_with_answer:
  • uspace/lib/libfs/libfs.h

    r64af8f1 rce8c848  
    9595
    9696extern void libfs_mount(libfs_ops_t *, fs_handle_t, ipc_callid_t, ipc_call_t *);
     97extern void libfs_unmount(libfs_ops_t *, ipc_callid_t, ipc_call_t *);
    9798extern void libfs_lookup(libfs_ops_t *, fs_handle_t, ipc_callid_t, ipc_call_t *);
    9899extern void libfs_stat(libfs_ops_t *, fs_handle_t, ipc_callid_t, ipc_call_t *);
  • uspace/srv/fs/devfs/devfs.c

    r64af8f1 rce8c848  
    7575                        devfs_mount(callid, &call);
    7676                        break;
     77                case VFS_OUT_UNMOUNTED:
     78                        devfs_unmounted(callid, &call);
     79                        break;
     80                case VFS_OUT_UNMOUNT:
     81                        devfs_unmount(callid, &call);
     82                        break;
    7783                case VFS_OUT_LOOKUP:
    7884                        devfs_lookup(callid, &call);
  • uspace/srv/fs/devfs/devfs_ops.c

    r64af8f1 rce8c848  
    434434}
    435435
     436void devfs_unmounted(ipc_callid_t rid, ipc_call_t *request)
     437{
     438        ipc_answer_0(rid, ENOTSUP);
     439}
     440
     441void devfs_unmount(ipc_callid_t rid, ipc_call_t *request)
     442{
     443        libfs_unmount(&devfs_libfs_ops, rid, request);
     444}
     445
    436446void devfs_lookup(ipc_callid_t rid, ipc_call_t *request)
    437447{
  • uspace/srv/fs/devfs/devfs_ops.h

    r64af8f1 rce8c848  
    4141extern void devfs_mounted(ipc_callid_t, ipc_call_t *);
    4242extern void devfs_mount(ipc_callid_t, ipc_call_t *);
     43extern void devfs_unmounted(ipc_callid_t, ipc_call_t *);
     44extern void devfs_unmount(ipc_callid_t, ipc_call_t *);
    4345extern void devfs_lookup(ipc_callid_t, ipc_call_t *);
    4446extern void devfs_open_node(ipc_callid_t, ipc_call_t *);
  • uspace/srv/fs/fat/fat.c

    r64af8f1 rce8c848  
    100100                        fat_mount(callid, &call);
    101101                        break;
     102                case VFS_OUT_UNMOUNTED:
     103                        fat_unmounted(callid, &call);
     104                        break;
     105                case VFS_OUT_UNMOUNT:
     106                        fat_unmount(callid, &call);
     107                        break;
    102108                case VFS_OUT_LOOKUP:
    103109                        fat_lookup(callid, &call);
  • uspace/srv/fs/fat/fat.h

    r64af8f1 rce8c848  
    204204extern void fat_mounted(ipc_callid_t, ipc_call_t *);
    205205extern void fat_mount(ipc_callid_t, ipc_call_t *);
     206extern void fat_unmounted(ipc_callid_t, ipc_call_t *);
     207extern void fat_unmount(ipc_callid_t, ipc_call_t *);
    206208extern void fat_lookup(ipc_callid_t, ipc_call_t *);
    207209extern void fat_read(ipc_callid_t, ipc_call_t *);
  • uspace/srv/fs/fat/fat_ops.c

    r64af8f1 rce8c848  
    11171117}
    11181118
     1119void fat_unmounted(ipc_callid_t rid, ipc_call_t *request)
     1120{
     1121        ipc_answer_0(rid, ENOTSUP);
     1122}
     1123
     1124void fat_unmount(ipc_callid_t rid, ipc_call_t *request)
     1125{
     1126        libfs_unmount(&fat_libfs_ops, rid, request);
     1127}
     1128
    11191129void fat_lookup(ipc_callid_t rid, ipc_call_t *request)
    11201130{
  • uspace/srv/fs/tmpfs/tmpfs.c

    r64af8f1 rce8c848  
    106106                        tmpfs_mount(callid, &call);
    107107                        break;
     108                case VFS_OUT_UNMOUNTED:
     109                        tmpfs_unmounted(callid, &call);
     110                        break;
     111                case VFS_OUT_UNMOUNT:
     112                        tmpfs_unmount(callid, &call);
     113                        break;
    108114                case VFS_OUT_LOOKUP:
    109115                        tmpfs_lookup(callid, &call);
  • uspace/srv/fs/tmpfs/tmpfs.h

    r64af8f1 rce8c848  
    8383extern void tmpfs_mounted(ipc_callid_t, ipc_call_t *);
    8484extern void tmpfs_mount(ipc_callid_t, ipc_call_t *);
     85extern void tmpfs_unmounted(ipc_callid_t, ipc_call_t *);
     86extern void tmpfs_unmount(ipc_callid_t, ipc_call_t *);
    8587extern void tmpfs_lookup(ipc_callid_t, ipc_call_t *);
    8688extern void tmpfs_read(ipc_callid_t, ipc_call_t *);
  • uspace/srv/fs/tmpfs/tmpfs_ops.c

    r64af8f1 rce8c848  
    449449}
    450450
     451void tmpfs_unmounted(ipc_callid_t rid, ipc_call_t *request)
     452{
     453        ipc_answer_0(rid, ENOTSUP);
     454}
     455
     456void tmpfs_unmount(ipc_callid_t rid, ipc_call_t *request)
     457{
     458        libfs_unmount(&tmpfs_libfs_ops, rid, request);
     459}
     460
    451461void tmpfs_lookup(ipc_callid_t rid, ipc_call_t *request)
    452462{
  • uspace/srv/vfs/vfs_ops.c

    r64af8f1 rce8c848  
    9292                }
    9393               
    94                 rc = vfs_lookup_internal(mp, L_DIRECTORY, &mp_res, NULL);
     94                rc = vfs_lookup_internal(mp, L_MP, &mp_res, NULL);
    9595                if (rc != EOK) {
    9696                        /* The lookup failed for some reason. */
     
    459459         * Lookup the mounted root and instantiate it.
    460460         */
    461         rc = vfs_lookup_internal(mp, L_NONE, &mr_res, NULL);
     461        rc = vfs_lookup_internal(mp, L_ROOT, &mr_res, NULL);
    462462        if (rc != EOK) {
    463463                fibril_rwlock_write_unlock(&namespace_rwlock);
     
    521521                 */
    522522
    523                 /*
    524                  * The L_NOCROSS_LAST_MP flag is essential if we really want to
    525                  * lookup the mount point and not the mounted root.
    526                  */
    527                 rc = vfs_lookup_internal(mp, L_NOCROSS_LAST_MP, &mp_res, NULL);
     523                rc = vfs_lookup_internal(mp, L_MP, &mp_res, NULL);
    528524                free(mp);
    529525                if (rc != EOK) {
     
    542538
    543539                phone = vfs_grab_phone(mp_node->fs_handle);
    544                 rc = async_req_2_0(phone, VFS_OUT_UNMOUNT, mp_node->fs_handle,
    545                     mp_node->dev_handle);
     540                rc = async_req_2_0(phone, VFS_OUT_UNMOUNT, mp_node->dev_handle,
     541                    mp_node->index);
    546542                vfs_release_phone(phone);
    547543                if (rc != EOK) {
     
    595591        /*
    596592         * Make sure that we are called with exactly one of L_FILE and
    597          * L_DIRECTORY. Make sure that the user does not pass L_OPEN or
    598          * L_NOCROSS_LAST_MP.
     593         * L_DIRECTORY. Make sure that the user does not pass L_OPEN,
     594         * L_ROOT or L_MP.
    599595         */
    600596        if (((lflag & (L_FILE | L_DIRECTORY)) == 0) ||
    601597            ((lflag & (L_FILE | L_DIRECTORY)) == (L_FILE | L_DIRECTORY)) ||
    602             (lflag & L_OPEN) || (lflag & L_NOCROSS_LAST_MP)) {
     598            (lflag & (L_OPEN | L_ROOT | L_MP))) {
    603599                ipc_answer_0(rid, EINVAL);
    604600                return;
Note: See TracChangeset for help on using the changeset viewer.