diff options
author | Ian Kent <raven@themaw.net> | 2008-11-06 12:53:22 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-11-06 15:41:17 -0800 |
commit | bc9c4068388eea01d3b5da31016879f2341ecec5 (patch) | |
tree | 3ff09783f4d5e3d19d8e5bda9b63419991726939 /fs/autofs4/expire.c | |
parent | eefc488f96cdde6e152b45675b50bf380b95d99f (diff) | |
download | kernel_samsung_aries-bc9c4068388eea01d3b5da31016879f2341ecec5.zip kernel_samsung_aries-bc9c4068388eea01d3b5da31016879f2341ecec5.tar.gz kernel_samsung_aries-bc9c4068388eea01d3b5da31016879f2341ecec5.tar.bz2 |
autofs4: correct offset mount expire check
When checking a directory tree in autofs_tree_busy() we can incorrectly
decide that the tree isn't busy. This happens for the case of an active
offset mount as autofs4_follow_mount() follows past the active offset
mount, which has an open file handle used for expires, causing the file
handle not to count toward the busyness check.
Signed-off-by: Ian Kent <raven@themaw.net>
Signed-off-by: Jeff Moyer <jmoyer@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/autofs4/expire.c')
-rw-r--r-- | fs/autofs4/expire.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/fs/autofs4/expire.c b/fs/autofs4/expire.c index cde2f8e..4b6fb3f 100644 --- a/fs/autofs4/expire.c +++ b/fs/autofs4/expire.c @@ -56,12 +56,23 @@ static int autofs4_mount_busy(struct vfsmount *mnt, struct dentry *dentry) mntget(mnt); dget(dentry); - if (!autofs4_follow_mount(&mnt, &dentry)) + if (!follow_down(&mnt, &dentry)) goto done; - /* This is an autofs submount, we can't expire it */ - if (is_autofs4_dentry(dentry)) - goto done; + if (is_autofs4_dentry(dentry)) { + struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb); + + /* This is an autofs submount, we can't expire it */ + if (sbi->type == AUTOFS_TYPE_INDIRECT) + goto done; + + /* + * Otherwise it's an offset mount and we need to check + * if we can umount its mount, if there is one. + */ + if (!d_mountpoint(dentry)) + goto done; + } /* Update the expiry counter if fs is busy */ if (!may_umount_tree(mnt)) { |