Changeset c888102 in mainline for uspace/lib/libfs/libfs.c


Ignore:
Timestamp:
2010-01-25T22:25:17Z (14 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
4557462, ce8c848
Parents:
3c11713
Message:

Finish implementation of libfs_unmount().

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/libfs/libfs.c

    r3c11713 rc888102  
    228228void libfs_unmount(libfs_ops_t *ops, ipc_callid_t rid, ipc_call_t *request)
    229229{
    230         ipc_answer_0(rid, ENOTSUP);
     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);
    231271}
    232272
Note: See TracChangeset for help on using the changeset viewer.