VFS: Fix the remaining automounter semantics regressions

The concensus seems to be that system calls such as stat() etc should
not trigger an automount.  Neither should the l* versions.

This patch therefore adds a LOOKUP_AUTOMOUNT flag to tag those lookups
that _should_ trigger an automount on the last path element.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
[ Edited to leave out the cases that are already covered by LOOKUP_OPEN,
  LOOKUP_DIRECTORY and LOOKUP_CREATE - all of which also fundamentally
  force automounting for their own reasons   - Linus ]
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Trond Myklebust 2011-09-26 20:36:09 -04:00 committed by Linus Torvalds
parent d94c177bee
commit 815d405cef
3 changed files with 3 additions and 3 deletions

View File

@ -1757,7 +1757,7 @@ static int do_loopback(struct path *path, char *old_name,
return err; return err;
if (!old_name || !*old_name) if (!old_name || !*old_name)
return -EINVAL; return -EINVAL;
err = kern_path(old_name, LOOKUP_FOLLOW, &old_path); err = kern_path(old_name, LOOKUP_FOLLOW|LOOKUP_AUTOMOUNT, &old_path);
if (err) if (err)
return err; return err;

View File

@ -2798,7 +2798,7 @@ static struct dentry *nfs_follow_remote_path(struct vfsmount *root_mnt,
goto out_put_mnt_ns; goto out_put_mnt_ns;
ret = vfs_path_lookup(root_mnt->mnt_root, root_mnt, ret = vfs_path_lookup(root_mnt->mnt_root, root_mnt,
export_path, LOOKUP_FOLLOW, &path); export_path, LOOKUP_FOLLOW|LOOKUP_AUTOMOUNT, &path);
nfs_referral_loop_unprotect(); nfs_referral_loop_unprotect();
put_mnt_ns(ns_private); put_mnt_ns(ns_private);

View File

@ -355,7 +355,7 @@ SYSCALL_DEFINE4(quotactl, unsigned int, cmd, const char __user *, special,
* resolution (think about autofs) and thus deadlocks could arise. * resolution (think about autofs) and thus deadlocks could arise.
*/ */
if (cmds == Q_QUOTAON) { if (cmds == Q_QUOTAON) {
ret = user_path_at(AT_FDCWD, addr, LOOKUP_FOLLOW, &path); ret = user_path_at(AT_FDCWD, addr, LOOKUP_FOLLOW|LOOKUP_AUTOMOUNT, &path);
if (ret) if (ret)
pathp = ERR_PTR(ret); pathp = ERR_PTR(ret);
else else