Changeset b79d450 in mainline for uspace/lib/libfs


Ignore:
Timestamp:
2010-01-27T20:35:49Z (16 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/fix-logger-deadlock, topic/msim-upgrade, topic/simplify-dev-export
Children:
fb6f1a5
Parents:
fccc236 (diff), 95e6c4f (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.

Location:
uspace/lib/libfs
Files:
1 deleted
3 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/libfs/Makefile

    rfccc236 rb79d450  
    2828#
    2929
    30 include Makefile.common
     30USPACE_PREFIX = ../..
     31LIBS = $(LIBC_PREFIX)/libc.a
    3132
    32 .PHONY: all clean
     33OUTPUT = libfs.a
    3334
    34 all: $(LIBC_PREFIX)/../../../Makefile.config $(LIBC_PREFIX)/../../../config.h $(LIBC_PREFIX)/../../../config.defs $(LIBC_PREFIX)/libc.a
    35         -[ -f $(DEPEND) ] && mv -f $(DEPEND) $(DEPEND_PREV)
    36         $(MAKE) -f Makefile.build PRECHECK=$(PRECHECK)
     35SOURCES = \
     36        libfs.c
    3737
    38 clean:
    39         rm -f $(DEPEND) $(DEPEND_PREV) $(JOB) $(LIBFS)
    40         find . -name '*.o' -follow -exec rm \{\} \;
     38include ../Makefile.common
  • uspace/lib/libfs/libfs.c

    rfccc236 rb79d450  
    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
     
    304349                on_error(rc, goto out_with_answer);
    305350               
    306                 if ((tmp) && (tmp->mp_data.mp_active)) {
     351                /*
     352                 * If the matching component is a mount point, there are two
     353                 * legitimate semantics of the lookup operation. The first is
     354                 * the commonly used one in which the lookup crosses each mount
     355                 * point into the mounted file system. The second semantics is
     356                 * used mostly during unmount() and differs from the first one
     357                 * only in that the last mount point in the looked up path,
     358                 * which is also its last component, is not crossed.
     359                 */
     360
     361                if ((tmp) && (tmp->mp_data.mp_active) &&
     362                    (!(lflag & L_MP) || (next <= last))) {
    307363                        if (next > last)
    308364                                next = last = first;
     
    475531                goto out;
    476532        }
     533
     534        if ((lflag & L_ROOT) && par) {
     535                ipc_answer_0(rid, EINVAL);
     536                goto out;
     537        }
    477538       
    478539out_with_answer:
  • uspace/lib/libfs/libfs.h

    rfccc236 rb79d450  
    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 *);
Note: See TracChangeset for help on using the changeset viewer.