12 Oct, 2016

2 commits

  • This isn't a return value, so change the message to indicate the status is
    the result of may_umount().

    (or locate pr_debug() after put_user() with the same message)

    Link: http://lkml.kernel.org/r/20160812024836.12352.74628.stgit@pluto.themaw.net
    Signed-off-by: Tomohiro Kusumi
    Signed-off-by: Ian Kent
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Tomohiro Kusumi
     
  • The inode allocation failure case in autofs4_dir_symlink() frees the
    autofs dentry info of the dentry without setting ->d_fsdata to NULL.

    That could lead to a double free so just get rid of the free and leave it
    to ->d_release().

    Link: http://lkml.kernel.org/r/20160812024759.12352.10653.stgit@pluto.themaw.net
    Signed-off-by: Ian Kent
    Cc: Tomohiro Kusumi
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Ian Kent
     

28 Sep, 2016

1 commit

  • CURRENT_TIME macro is not appropriate for filesystems as it
    doesn't use the right granularity for filesystem timestamps.
    Use current_time() instead.

    CURRENT_TIME is also not y2038 safe.

    This is also in preparation for the patch that transitions
    vfs timestamps to use 64 bit time and hence make them
    y2038 safe. As part of the effort current_time() will be
    extended to do range checks. Hence, it is necessary for all
    file system timestamps to use current_time(). Also,
    current_time() will be transitioned along with vfs to be
    y2038 safe.

    Note that whenever a single call to current_time() is used
    to change timestamps in different inodes, it is because they
    share the same time granularity.

    Signed-off-by: Deepa Dinamani
    Reviewed-by: Arnd Bergmann
    Acked-by: Felipe Balbi
    Acked-by: Steven Whitehouse
    Acked-by: Ryusuke Konishi
    Acked-by: David Sterba
    Signed-off-by: Al Viro

    Deepa Dinamani
     

21 Jul, 2016

1 commit


12 Jun, 2016

1 commit

  • * make autofs4_expire_indirect() skip the dentries being in process of
    expiry
    * do *not* mess with list_move(); making sure that dentry with
    AUTOFS_INF_EXPIRING are not picked for expiry is enough.
    * do not remove NO_RCU when we set EXPIRING, don't bother with smp_mb()
    there. Clear it at the same time we clear EXPIRING. Makes a bunch of
    tests simpler.
    * rename NO_RCU to WANT_EXPIRE, which is what it really is.

    Signed-off-by: Al Viro

    Al Viro
     

03 May, 2016

1 commit


20 Mar, 2016

1 commit

  • Pull vfs updates from Al Viro:

    - Preparations of parallel lookups (the remaining main obstacle is the
    need to move security_d_instantiate(); once that becomes safe, the
    rest will be a matter of rather short series local to fs/*.c

    - preadv2/pwritev2 series from Christoph

    - assorted fixes

    * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (32 commits)
    splice: handle zero nr_pages in splice_to_pipe()
    vfs: show_vfsstat: do not ignore errors from show_devname method
    dcache.c: new helper: __d_add()
    don't bother with __d_instantiate(dentry, NULL)
    untangle fsnotify_d_instantiate() a bit
    uninline d_add()
    replace d_add_unique() with saner primitive
    quota: use lookup_one_len_unlocked()
    cifs_get_root(): use lookup_one_len_unlocked()
    nfs_lookup: don't bother with d_instantiate(dentry, NULL)
    kill dentry_unhash()
    ceph_fill_trace(): don't bother with d_instantiate(dn, NULL)
    autofs4: don't bother with d_instantiate(dentry, NULL) in ->lookup()
    configfs: move d_rehash() into configfs_create() for regular files
    ceph: don't bother with d_rehash() in splice_dentry()
    namei: teach lookup_slow() to skip revalidate
    namei: massage lookup_slow() to be usable by lookup_one_len_unlocked()
    lookup_one_len_unlocked(): use lookup_dcache()
    namei: simplify invalidation logics in lookup_dcache()
    namei: change calling conventions for lookup_{fast,slow} and follow_managed()
    ...

    Linus Torvalds
     

16 Mar, 2016

6 commits


14 Mar, 2016

1 commit


16 Apr, 2015

1 commit


23 Feb, 2015

1 commit

  • Convert the following where appropriate:

    (1) S_ISLNK(dentry->d_inode) to d_is_symlink(dentry).

    (2) S_ISREG(dentry->d_inode) to d_is_reg(dentry).

    (3) S_ISDIR(dentry->d_inode) to d_is_dir(dentry). This is actually more
    complicated than it appears as some calls should be converted to
    d_can_lookup() instead. The difference is whether the directory in
    question is a real dir with a ->lookup op or whether it's a fake dir with
    a ->d_automount op.

    In some circumstances, we can subsume checks for dentry->d_inode not being
    NULL into this, provided we the code isn't in a filesystem that expects
    d_inode to be NULL if the dirent really *is* negative (ie. if we're going to
    use d_inode() rather than d_backing_inode() to get the inode pointer).

    Note that the dentry type field may be set to something other than
    DCACHE_MISS_TYPE when d_inode is NULL in the case of unionmount, where the VFS
    manages the fall-through from a negative dentry to a lower layer. In such a
    case, the dentry type of the negative union dentry is set to the same as the
    type of the lower dentry.

    However, if you know d_inode is not NULL at the call site, then you can use
    the d_is_xxx() functions even in a filesystem.

    There is one further complication: a 0,0 chardev dentry may be labelled
    DCACHE_WHITEOUT_TYPE rather than DCACHE_SPECIAL_TYPE. Strictly, this was
    intended for special directory entry types that don't have attached inodes.

    The following perl+coccinelle script was used:

    use strict;

    my @callers;
    open($fd, 'git grep -l \'S_IS[A-Z].*->d_inode\' |') ||
    die "Can't grep for S_ISDIR and co. callers";
    @callers = ;
    close($fd);
    unless (@callers) {
    print "No matches\n";
    exit(0);
    }

    my @cocci = (
    '@@',
    'expression E;',
    '@@',
    '',
    '- S_ISLNK(E->d_inode->i_mode)',
    '+ d_is_symlink(E)',
    '',
    '@@',
    'expression E;',
    '@@',
    '',
    '- S_ISDIR(E->d_inode->i_mode)',
    '+ d_is_dir(E)',
    '',
    '@@',
    'expression E;',
    '@@',
    '',
    '- S_ISREG(E->d_inode->i_mode)',
    '+ d_is_reg(E)' );

    my $coccifile = "tmp.sp.cocci";
    open($fd, ">$coccifile") || die $coccifile;
    print($fd "$_\n") || die $coccifile foreach (@cocci);
    close($fd);

    foreach my $file (@callers) {
    chomp $file;
    print "Processing ", $file, "\n";
    system("spatch", "--sp-file", $coccifile, $file, "--in-place", "--no-show-diff") == 0 ||
    die "spatch failed";
    }

    [AV: overlayfs parts skipped]

    Signed-off-by: David Howells
    Signed-off-by: Al Viro

    David Howells
     

20 Feb, 2015

1 commit


20 Nov, 2014

1 commit


04 Nov, 2014

1 commit


14 Oct, 2014

2 commits

  • If rcu-walk mode we don't *have* to return -EISDIR for non-mount-traps
    as we will simply drop into REF-walk and handling DCACHE_NEED_AUTOMOUNT
    dentrys the slow way. But it is better if we do when possible.

    In 'oz_mode', use the same condition as ref-walk: if not a mountpoint,
    then it must be -EISDIR.

    In regular mode there are most tests needed. Most of them can be
    performed without taking any spinlocks. If we find a directory that
    isn't obviously empty, and isn't mounted on, we need to call
    'simple_empty()' which does take a spinlock. If this turned out to hurt
    performance, some other approach could be found to signal when a
    directory is known to be empty.

    Signed-off-by: NeilBrown
    Reviewed-by: Ian Kent
    Tested-by: Ian Kent
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    NeilBrown
     
  • This series teaches autofs about RCU-walk so that we don't drop straight
    into REF-walk when we hit an autofs directory, and so that we avoid
    spinlocks as much as possible when performing an RCU-walk.

    This is needed so that the benefits of the recent NFS support for
    RCU-walk are fully available when NFS filesystems are automounted.

    Patches have been carefully reviewed and tested both with test suites
    and in production - thanks a lot to Ian Kent for his support there.

    This patch (of 6):

    Any attempt to look up a pathname that passes though an autofs4 mount is
    currently forced out of RCU-walk into REF-walk.

    This can significantly hurt performance of many-thread work loads on
    many-core systems, especially if the automounted filesystem supports
    RCU-walk but doesn't get to benefit from it.

    So if autofs4_d_manage is called with rcu_walk set, only fail with -ECHILD
    if it is necessary to wait longer than a spinlock.

    Signed-off-by: NeilBrown
    Reviewed-by: Ian Kent
    Tested-by: Ian Kent
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    NeilBrown
     

09 Aug, 2014

2 commits


07 May, 2014

1 commit

  • autofs needs to be able to see private data dentry flags for its dentrys
    that are being created but not yet hashed and for its dentrys that have
    been rmdir()ed but not yet freed. It needs to do this so it can block
    processes in these states until a status has been returned to indicate
    the given operation is complete.

    It does this by keeping two lists, active and expring, of dentrys in
    this state and uses ->d_release() to keep them stable while it checks
    the reference count to determine if they should be used.

    But with the recent lockref changes dentrys being freed sometimes don't
    transition to a reference count of 0 before being freed so autofs can
    occassionally use a dentry that is invalid which can lead to a panic.

    Signed-off-by: Ian Kent
    Cc: Al Viro
    Cc: Linus Torvalds
    Cc:
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Ian Kent
     

24 Jan, 2014

1 commit


05 Jul, 2013

1 commit


29 Jun, 2013

1 commit


07 May, 2013

1 commit

  • Fixed the sparse warning:

    fs/autofs4/root.c:411:5: warning: symbol 'autofs4_d_manage' was not declared. Should it be static?"

    [ Clearly it should be static as the function is declared static at the
    top of root.c. - imk ]

    Signed-off-by: Claudiu Ghioc
    Signed-off-by: Ian Kent
    Signed-off-by: Linus Torvalds

    Claudiu Ghioc
     

02 Mar, 2013

1 commit

  • …t lock contexts for basic block

    Sparse complains:

    fs/autofs4/root.c:409:9: sparse: context imbalance in 'autofs4_d_automount' - different lock contexts for basic block

    This was introduced by commit f55fb0c24386 ("autofs4 - dont clear
    DCACHE_NEED_AUTOMOUNT on rootless mount")

    The function autofs4_d_automount can be left with the (&sbi->fs_lock)
    held if sbi->version <= 4 and simple_empty(dentry) == false so the
    warning seems valid.

    --> Add an spin_unlock in this case before we jump to done

    Unfortunately compile tested only.

    Reported-by: Fengguang Wu <fengguang.wu@intel.com>
    Signed-off-by: Peter Huewe <peterhuewe@gmx.de>
    Acked-by: Ian Kent <raven@themaw.net>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

    Peter Huewe
     

26 Feb, 2013

1 commit

  • According to SUSv3:

    [EACCES] Permission denied. An attempt was made to access a file in a way
    forbidden by its file access permissions.

    [EPERM] Operation not permitted. An attempt was made to perform an operation
    limited to processes with appropriate privileges or to the owner of a file
    or other resource.

    So -EPERM should be returned if capability checks fails.

    Strictly speaking this is an API change since the error code user sees is
    altered.

    Signed-off-by: Zhao Hongjiang
    Acked-by: Jan Kara
    Acked-by: Steven Whitehouse
    Acked-by: Ian Kent
    Cc: Al Viro
    Signed-off-by: Andrew Morton
    Signed-off-by: Al Viro

    Zhao Hongjiang
     

23 Feb, 2013

1 commit


14 Dec, 2012

2 commits

  • For direct (and offset) mounts, if an automounted mount is manually
    umounted the trigger mount dentry can appear non-empty causing it to
    not trigger mounts. This can also happen if there is a file handle
    leak in a user space automounting application.

    This happens because, when a ioctl control file handle is opened
    on the mount, a cursor dentry is created which causes list_empty()
    to see the dentry as non-empty. Since there is a case where listing
    the directory of these dentrys is needed, the use of dcache_dir_*()
    functions for .open() and .release() is needed.

    Consequently simple_empty() must be used instead of list_empty()
    when checking for an empty directory.

    Signed-off-by: Ian Kent
    Signed-off-by: Linus Torvalds

    Ian Kent
     
  • The DCACHE_NEED_AUTOMOUNT flag is cleared on mount and set on expire
    for autofs rootless multi-mount dentrys to prevent unnecessary calls
    to ->d_automount().

    Since DCACHE_MANAGE_TRANSIT is always set on autofs dentrys ->d_managed()
    is always called so the check can be done in ->d_manage() without the
    need to change the flag. This still avoids unnecessary calls to
    ->d_automount(), adds negligible overhead and eliminates a seriously
    ugly check in the expire code.

    Signed-off-by: Ian Kent
    Signed-off-by: Linus Torvalds

    Ian Kent
     

11 Oct, 2012

1 commit

  • In autofs4_d_automount(), if a mount fail occurs the AUTOFS_INF_PENDING
    mount pending flag is not cleared.

    One effect of this is when using the "browse" option, directory entry
    attributes show up with all "?"s due to the incorrect callback and
    subsequent failure return (when in fact no callback should be made).

    Signed-off-by: Ian Kent
    Cc: stable@vger.kernel.org
    Signed-off-by: Linus Torvalds

    Ian Kent
     

14 Jul, 2012

1 commit

  • Just the flags; only NFS cares even about that, but there are
    legitimate uses for such argument. And getting rid of that
    completely would require splitting ->lookup() into a couple
    of methods (at least), so let's leave that alone for now...

    Signed-off-by: Al Viro

    Al Viro
     

04 Jan, 2012

1 commit


30 May, 2011

1 commit


26 May, 2011

1 commit

  • 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
     

31 Mar, 2011

1 commit


25 Mar, 2011

1 commit

  • The autofs4_lock introduced by the rcu-walk changes has unnecessarily
    broad scope. The locking is better handled by the per-autofs super
    block lookup_lock.

    Signed-off-by: Ian Kent
    Acked-by: David Howells
    Signed-off-by: Al Viro

    Ian Kent