Commit 25e195aa authored by Al Viro's avatar Al Viro

follow_automount(): get rid of dead^Wstillborn code

1) no instances of ->d_automount() have ever made use of the "return
ERR_PTR(-EISDIR) if you don't feel like mounting anything" - that's
a rudiment of plans that got superseded before the thing went into
the tree.  Despite the comment in follow_automount(), autofs has
never done that.

2) if there's no ->d_automount() in dentry_operations, filesystems
should not set DCACHE_NEED_AUTOMOUNT in the first place.  None have
ever done so...
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 26df6034
...@@ -1210,10 +1210,7 @@ EXPORT_SYMBOL(follow_up); ...@@ -1210,10 +1210,7 @@ EXPORT_SYMBOL(follow_up);
*/ */
static int follow_automount(struct path *path, struct nameidata *nd) static int follow_automount(struct path *path, struct nameidata *nd)
{ {
struct vfsmount *mnt; struct dentry *dentry = path->dentry;
if (!path->dentry->d_op || !path->dentry->d_op->d_automount)
return -EREMOTE;
/* We don't want to mount if someone's just doing a stat - /* We don't want to mount if someone's just doing a stat -
* unless they're stat'ing a directory and appended a '/' to * unless they're stat'ing a directory and appended a '/' to
...@@ -1228,33 +1225,14 @@ static int follow_automount(struct path *path, struct nameidata *nd) ...@@ -1228,33 +1225,14 @@ static int follow_automount(struct path *path, struct nameidata *nd)
*/ */
if (!(nd->flags & (LOOKUP_PARENT | LOOKUP_DIRECTORY | if (!(nd->flags & (LOOKUP_PARENT | LOOKUP_DIRECTORY |
LOOKUP_OPEN | LOOKUP_CREATE | LOOKUP_AUTOMOUNT)) && LOOKUP_OPEN | LOOKUP_CREATE | LOOKUP_AUTOMOUNT)) &&
path->dentry->d_inode) dentry->d_inode)
return -EISDIR; return -EISDIR;
nd->total_link_count++; nd->total_link_count++;
if (nd->total_link_count >= 40) if (nd->total_link_count >= 40)
return -ELOOP; return -ELOOP;
mnt = path->dentry->d_op->d_automount(path); return finish_automount(dentry->d_op->d_automount(path), path);
if (IS_ERR(mnt)) {
/*
* The filesystem is allowed to return -EISDIR here to indicate
* it doesn't want to automount. For instance, autofs would do
* this so that its userspace daemon can mount on this dentry.
*
* However, we can only permit this if it's a terminal point in
* the path being looked up; if it wasn't then the remainder of
* the path is inaccessible and we should say so.
*/
if (PTR_ERR(mnt) == -EISDIR && (nd->flags & LOOKUP_PARENT))
return -EREMOTE;
return PTR_ERR(mnt);
}
if (!mnt)
return 0;
return finish_automount(mnt, path);
} }
/* /*
......
...@@ -2824,9 +2824,16 @@ static int do_new_mount(struct path *path, const char *fstype, int sb_flags, ...@@ -2824,9 +2824,16 @@ static int do_new_mount(struct path *path, const char *fstype, int sb_flags,
int finish_automount(struct vfsmount *m, struct path *path) int finish_automount(struct vfsmount *m, struct path *path)
{ {
struct dentry *dentry = path->dentry; struct dentry *dentry = path->dentry;
struct mount *mnt = real_mount(m);
struct mountpoint *mp; struct mountpoint *mp;
struct mount *mnt;
int err; int err;
if (!m)
return 0;
if (IS_ERR(m))
return PTR_ERR(m);
mnt = real_mount(m);
/* The new mount record should have at least 2 refs to prevent it being /* The new mount record should have at least 2 refs to prevent it being
* expired before we get a chance to add it * expired before we get a chance to add it
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment