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: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
26df6034fd
commit
25e195aa1e
28
fs/namei.c
28
fs/namei.c
|
@ -1210,10 +1210,7 @@ EXPORT_SYMBOL(follow_up);
|
|||
*/
|
||||
static int follow_automount(struct path *path, struct nameidata *nd)
|
||||
{
|
||||
struct vfsmount *mnt;
|
||||
|
||||
if (!path->dentry->d_op || !path->dentry->d_op->d_automount)
|
||||
return -EREMOTE;
|
||||
struct dentry *dentry = path->dentry;
|
||||
|
||||
/* We don't want to mount if someone's just doing a stat -
|
||||
* 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)
|
|||
*/
|
||||
if (!(nd->flags & (LOOKUP_PARENT | LOOKUP_DIRECTORY |
|
||||
LOOKUP_OPEN | LOOKUP_CREATE | LOOKUP_AUTOMOUNT)) &&
|
||||
path->dentry->d_inode)
|
||||
dentry->d_inode)
|
||||
return -EISDIR;
|
||||
|
||||
nd->total_link_count++;
|
||||
if (nd->total_link_count >= 40)
|
||||
return -ELOOP;
|
||||
|
||||
mnt = path->dentry->d_op->d_automount(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);
|
||||
return finish_automount(dentry->d_op->d_automount(path), path);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
struct dentry *dentry = path->dentry;
|
||||
struct mount *mnt = real_mount(m);
|
||||
struct mountpoint *mp;
|
||||
struct mount *mnt;
|
||||
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
|
||||
* expired before we get a chance to add it
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue