27 May, 2011

4 commits

  • Signed-off-by: Al Viro

    Al Viro
     
  • ... and kill a useless local variable in follow_dotdot_rcu(), while
    we are at it - follow_mount_rcu(nd, path, inode) *always* assigned
    value to *inode, and always it had been path->dentry->d_inode (aka
    nd->path.dentry->d_inode, since it always got &nd->path as the second
    argument).

    Signed-off-by: Al Viro

    Al Viro
     
  • Signed-off-by: Al Viro

    Al Viro
     
  • * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6: (25 commits)
    cifs: remove unnecessary dentry_unhash on rmdir/rename_dir
    ocfs2: remove unnecessary dentry_unhash on rmdir/rename_dir
    exofs: remove unnecessary dentry_unhash on rmdir/rename_dir
    nfs: remove unnecessary dentry_unhash on rmdir/rename_dir
    ext2: remove unnecessary dentry_unhash on rmdir/rename_dir
    ext3: remove unnecessary dentry_unhash on rmdir/rename_dir
    ext4: remove unnecessary dentry_unhash on rmdir/rename_dir
    btrfs: remove unnecessary dentry_unhash in rmdir/rename_dir
    ceph: remove unnecessary dentry_unhash calls
    vfs: clean up vfs_rename_other
    vfs: clean up vfs_rename_dir
    vfs: clean up vfs_rmdir
    vfs: fix vfs_rename_dir for FS_RENAME_DOES_D_MOVE filesystems
    libfs: drop unneeded dentry_unhash
    vfs: update dentry_unhash() comment
    vfs: push dentry_unhash on rename_dir into file systems
    vfs: push dentry_unhash on rmdir into file systems
    vfs: remove dget() from dentry_unhash()
    vfs: dentry_unhash immediately prior to rmdir
    vfs: Block mmapped writes while the fs is frozen
    ...

    Linus Torvalds
     

26 May, 2011

11 commits

  • Simplify control flow to match vfs_rename_dir.

    Signed-off-by: Sage Weil
    Signed-off-by: Al Viro

    Sage Weil
     
  • Simplify control flow through vfs_rename_dir.

    Signed-off-by: Sage Weil
    Signed-off-by: Al Viro

    Sage Weil
     
  • Simplify the control flow with an out label.

    Signed-off-by: Sage Weil
    Signed-off-by: Al Viro

    Sage Weil
     
  • vfs_rename_dir() doesn't properly account for filesystems with
    FS_RENAME_DOES_D_MOVE. If new_dentry has a target inode attached, it
    unhashes the new_dentry prior to the rename() iop and rehashes it after,
    but doesn't account for the possibility that rename() may have swapped
    {old,new}_dentry. For FS_RENAME_DOES_D_MOVE filesystems, it rehashes
    new_dentry (now the old renamed-from name, which d_move() expected to go
    away), such that a subsequent lookup will find it. Currently all
    FS_RENAME_DOES_D_MOVE filesystems compensate for this by failing in
    d_revalidate.

    The bug was introduced by: commit 349457ccf2592c14bdf13b6706170ae2e94931b1
    "[PATCH] Allow file systems to manually d_move() inside of ->rename()"

    Fix by not rehashing the new dentry. Rehashing used to be needed by
    d_move() but isn't anymore.

    Reported-by: Sage Weil
    Signed-off-by: Miklos Szeredi
    Signed-off-by: Al Viro

    Miklos Szeredi
     
  • The helper is now only called by file systems, not the VFS.

    Signed-off-by: Sage Weil
    Signed-off-by: Al Viro

    Sage Weil
     
  • Only a few file systems need this. Start by pushing it down into each
    rename method (except gfs2 and xfs) so that it can be dealt with on a
    per-fs basis.

    Acked-by: Christoph Hellwig
    Signed-off-by: Sage Weil
    Signed-off-by: Al Viro

    Sage Weil
     
  • Only a few file systems need this. Start by pushing it down into each
    fs rmdir method (except gfs2 and xfs) so it can be dealt with on a per-fs
    basis.

    This does not change behavior for any in-tree file systems.

    Acked-by: Christoph Hellwig
    Signed-off-by: Sage Weil
    Signed-off-by: Al Viro

    Sage Weil
     
  • This serves no useful purpose that I can discern. All callers (rename,
    rmdir) hold their own reference to the dentry.

    A quick audit of all file systems showed no relevant checks on the value
    of d_count in vfs_rmdir/vfs_rename_dir paths.

    Signed-off-by: Sage Weil
    Signed-off-by: Al Viro

    Sage Weil
     
  • This presumes that there is no reason to unhash a dentry if we fail because
    it is a mountpoint or the LSM check fails, and that the LSM checks do not
    depend on the dentry being unhashed.

    Signed-off-by: Sage Weil
    Signed-off-by: Al Viro

    Sage Weil
     
  • new helper: complete_walk(). Done on successful completion
    of walk, drops out of RCU mode, does d_revalidate of final
    result if that hadn't been done already.

    handle_reval_dot() and nameidata_drop_rcu_last() subsumed into
    that one; callers converted to use of complete_walk().

    Signed-off-by: Al Viro

    Al Viro
     
  • Merge these into a single function (unlazy_walk(nd, dentry)),
    kill ..._maybe variants

    Signed-off-by: Al Viro

    Al Viro
     

21 May, 2011

1 commit


14 May, 2011

1 commit

  • It's a hot function, and we're better off not mixing types in the mask
    calculations. The compiler just ends up mixing 16-bit and 32-bit
    operations, for no good reason.

    So do everything in 'unsigned int' rather than mixing 'unsigned int'
    masking with a 'umode_t' (16-bit) mode variable.

    This, together with the parent commit (47a150edc2ae: "Cache user_ns in
    struct cred") makes acl_permission_check() much nicer.

    Signed-off-by: Linus Torvalds

    Linus Torvalds
     

16 Apr, 2011

1 commit

  • During RCU walk in path_lookupat and path_openat, the rcu lookup
    frequently failed if looking up an absolute path, because when root
    directory was looked up, seq number was not properly set in nameidata.

    We dropped out of RCU walk in nameidata_drop_rcu due to mismatch in
    directory entry's seq number. We reverted to slow path walk that need
    to take references.

    With the following patch, I saw a 50% increase in an exim mail server
    benchmark throughput on a 4-socket Nehalem-EX system.

    Signed-off-by: Tim Chen
    Reviewed-by: Andi Kleen
    Cc: stable@kernel.org (v2.6.38)
    Signed-off-by: Linus Torvalds

    Tim Chen
     

31 Mar, 2011

1 commit


25 Mar, 2011

1 commit


24 Mar, 2011

3 commits

  • * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6:
    deal with races in /proc/*/{syscall,stack,personality}
    proc: enable writing to /proc/pid/mem
    proc: make check_mem_permission() return an mm_struct on success
    proc: hold cred_guard_mutex in check_mem_permission()
    proc: disable mem_write after exec
    mm: implement access_remote_vm
    mm: factor out main logic of access_process_vm
    mm: use mm_struct to resolve gate vma's in __get_user_pages
    mm: arch: rename in_gate_area_no_task to in_gate_area_no_mm
    mm: arch: make in_gate_area take an mm_struct instead of a task_struct
    mm: arch: make get_gate_vma take an mm_struct instead of a task_struct
    x86: mark associated mm when running a task in 32 bit compatibility mode
    x86: add context tag to mark mm when running a task in 32-bit compatibility mode
    auxv: require the target to be tracable (or yourself)
    close race in /proc/*/environ
    report errors in /proc/*/*map* sanely
    pagemap: close races with suid execve
    make sessionid permissions in /proc/*/task/* match those in /proc/*
    fix leaks in path_lookupat()

    Fix up trivial conflicts in fs/proc/base.c

    Linus Torvalds
     
  • And give it a kernel-doc comment.

    [akpm@linux-foundation.org: btrfs changed in linux-next]
    Signed-off-by: Serge E. Hallyn
    Cc: "Eric W. Biederman"
    Cc: Daniel Lezcano
    Acked-by: David Howells
    Cc: James Morris
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Serge E. Hallyn
     
  • Cheat for now and say all files belong to init_user_ns. Next step will be
    to let superblocks belong to a user_ns, and derive inode_userns(inode)
    from inode->i_sb->s_user_ns. Finally we'll introduce more flexible
    arrangements.

    Changelog:
    Feb 15: make is_owner_or_cap take const struct inode
    Feb 23: make is_owner_or_cap bool

    [akpm@linux-foundation.org: coding-style fixes]
    Signed-off-by: Serge E. Hallyn
    Acked-by: "Eric W. Biederman"
    Acked-by: Daniel Lezcano
    Acked-by: David Howells
    Cc: James Morris
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Serge E. Hallyn
     

23 Mar, 2011

1 commit


18 Mar, 2011

2 commits


16 Mar, 2011

8 commits


15 Mar, 2011

4 commits

  • At that point we can't do almost nothing with them. They can be opened
    with O_PATH, we can manipulate such descriptors with dup(), etc. and
    we can see them in /proc/*/{fd,fdinfo}/*.

    We can't (and won't be able to) follow /proc/*/fd/* symlinks for those;
    there's simply not enough information for pathname resolution to go on
    from such point - to resolve a symlink we need to know which directory
    does it live in.

    We will be able to do useful things with them after the next commit, though -
    readlinkat() and fchownat() will be possible to use with dfd being an
    O_PATH-opened symlink and empty relative pathname. Combined with
    open_by_handle() it'll give us a way to do realink-by-handle and
    lchown-by-handle without messing with more redundant syscalls.

    Signed-off-by: Al Viro

    Al Viro
     
  • New flag for open(2) - O_PATH. Semantics:
    * pathname is resolved, but the file itself is _NOT_ opened
    as far as filesystem is concerned.
    * almost all operations on the resulting descriptors shall
    fail with -EBADF. Exceptions are:
    1) operations on descriptors themselves (i.e.
    close(), dup(), dup2(), dup3(), fcntl(fd, F_DUPFD),
    fcntl(fd, F_DUPFD_CLOEXEC, ...), fcntl(fd, F_GETFD),
    fcntl(fd, F_SETFD, ...))
    2) fcntl(fd, F_GETFL), for a common non-destructive way to
    check if descriptor is open
    3) "dfd" arguments of ...at(2) syscalls, i.e. the starting
    points of pathname resolution
    * closing such descriptor does *NOT* affect dnotify or
    posix locks.
    * permissions are checked as usual along the way to file;
    no permission checks are applied to the file itself. Of course,
    giving such thing to syscall will result in permission checks (at
    the moment it means checking that starting point of ....at() is
    a directory and caller has exec permissions on it).

    fget() and fget_light() return NULL on such descriptors; use of
    fget_raw() and fget_raw_light() is needed to get them. That protects
    existing code from dealing with those things.

    There are two things still missing (they come in the next commits):
    one is handling of symlinks (right now we refuse to open them that
    way; see the next commit for semantics related to those) and another
    is descriptor passing via SCM_RIGHTS datagrams.

    Signed-off-by: Al Viro

    Al Viro
     
  • Add inode->i_nlink == 0 check in VFS. Some of the file systems
    do this internally. A followup patch will remove those instance.
    This is needed to ensure that with link by handle we don't allow
    to create hardlink of an unlinked file. The check also prevent a race
    between unlink and link

    Signed-off-by: Aneesh Kumar K.V
    Signed-off-by: Al Viro

    Aneesh Kumar K.V
     
  • For name_to_handle_at(2) we'll want both ...at()-style syscall that
    would be usable for non-directory descriptors (with empty relative
    pathname). Introduce new flag (AT_EMPTY_PATH) to deal with that and
    corresponding LOOKUP_EMPTY; teach user_path_at() and path_init() to
    deal with the latter.

    Signed-off-by: Al Viro

    Al Viro
     

14 Mar, 2011

2 commits

  • new function: file_open_root(dentry, mnt, name, flags) opens the file
    vfs_path_lookup would arrive to.

    Note that name can be empty; in that case the usual requirement that
    dentry should be a directory is lifted.

    open-coded equivalents switched to it, may_open() got down exactly
    one caller and became static.

    Signed-off-by: Al Viro

    Al Viro
     
  • New lookup flag: LOOKUP_ROOT. nd->root is set (and held) by caller,
    path_init() starts walking from that place and all pathname resolution
    machinery never drops nd->root if that flag is set. That turns
    vfs_path_lookup() into a special case of do_path_lookup() *and*
    gets us down to 3 callers of link_path_walk(), making it finally
    feasible to rip the handling of trailing symlink out of link_path_walk().
    That will not only simply the living hell out of it, but make life
    much simpler for unionfs merge. Trailing symlink handling will
    become iterative, which is a good thing for stack footprint in
    a lot of situations as well.

    Signed-off-by: Al Viro

    Al Viro