Changeset 4b995b92 in mainline


Ignore:
Timestamp:
2010-01-24T13:02:17Z (14 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
203a090
Parents:
c1a8e5e6
Message:

Introduce the L_NOCROSS_LAST_MP lookup flag and treat the last mount point node
according to it in libfs_lookup().

Location:
uspace
Files:
3 edited

Legend:

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

    rc1a8e5e6 r4b995b92  
    148148#define L_OPEN  64
    149149
     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
     156
    150157#endif
    151158
  • uspace/lib/libfs/libfs.c

    rc1a8e5e6 r4b995b92  
    304304                on_error(rc, goto out_with_answer);
    305305               
    306                 if ((tmp) && (tmp->mp_data.mp_active)) {
     306                /*
     307                 * If the matching component is a mount point, there are two
     308                 * legitimate semantics of the lookup operation. The first is
     309                 * the commonly used one in which the lookup crosses each mount
     310                 * point into the mounted file system. The second semantics is
     311                 * used mostly during unmount() and differs from the first one
     312                 * only in that the last mount point in the looked up path,
     313                 * which is also its last component, is not crossed.
     314                 */
     315
     316                if ((tmp) && (tmp->mp_data.mp_active) &&
     317                    (!(lflag & L_NOCROSS_LAST_MP) || (next <= last))) {
    307318                        if (next > last)
    308319                                next = last = first;
  • uspace/srv/vfs/vfs_ops.c

    rc1a8e5e6 r4b995b92  
    459459        /*
    460460         * Make sure that we are called with exactly one of L_FILE and
    461          * L_DIRECTORY. Make sure that the user does not pass L_OPEN.
     461         * L_DIRECTORY. Make sure that the user does not pass L_OPEN or
     462         * L_NOCROSS_LAST_MP.
    462463         */
    463464        if (((lflag & (L_FILE | L_DIRECTORY)) == 0) ||
    464465            ((lflag & (L_FILE | L_DIRECTORY)) == (L_FILE | L_DIRECTORY)) ||
    465             ((lflag & L_OPEN) != 0)) {
     466            (lflag & L_OPEN) || (lflag & L_NOCROSS_LAST_MP)) {
    466467                ipc_answer_0(rid, EINVAL);
    467468                return;
Note: See TracChangeset for help on using the changeset viewer.