Commit 74f504cf authored by Ian Kent's avatar Ian Kent Committed by Al Viro

autofs: change autofs4_expire_wait()/do_expire_wait() to take struct path

In order to use the functions path_is_mountpoint() and path_has_submounts()
autofs needs to pass a struct path in several places.

Start by changing autofs4_expire_wait() and do_expire_wait() to take
a struct path instead of a struct dentry.

Link: http://lkml.kernel.org/r/20161011053408.27645.40091.stgit@pluto.themaw.netSigned-off-by: default avatarIan Kent <raven@themaw.net>
Cc: Al Viro <viro@ZenIV.linux.org.uk>
Cc: Eric W. Biederman <ebiederm@xmission.com>
Cc: Omar Sandoval <osandov@osandov.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 01619491
...@@ -145,7 +145,7 @@ void autofs4_free_ino(struct autofs_info *); ...@@ -145,7 +145,7 @@ void autofs4_free_ino(struct autofs_info *);
/* Expiration */ /* Expiration */
int is_autofs4_dentry(struct dentry *); int is_autofs4_dentry(struct dentry *);
int autofs4_expire_wait(struct dentry *dentry, int rcu_walk); int autofs4_expire_wait(const struct path *path, int rcu_walk);
int autofs4_expire_run(struct super_block *, struct vfsmount *, int autofs4_expire_run(struct super_block *, struct vfsmount *,
struct autofs_sb_info *, struct autofs_sb_info *,
struct autofs_packet_expire __user *); struct autofs_packet_expire __user *);
......
...@@ -468,7 +468,7 @@ static int autofs_dev_ioctl_requester(struct file *fp, ...@@ -468,7 +468,7 @@ static int autofs_dev_ioctl_requester(struct file *fp,
ino = autofs4_dentry_ino(path.dentry); ino = autofs4_dentry_ino(path.dentry);
if (ino) { if (ino) {
err = 0; err = 0;
autofs4_expire_wait(path.dentry, 0); autofs4_expire_wait(&path, 0);
spin_lock(&sbi->fs_lock); spin_lock(&sbi->fs_lock);
param->requester.uid = param->requester.uid =
from_kuid_munged(current_user_ns(), ino->uid); from_kuid_munged(current_user_ns(), ino->uid);
......
...@@ -495,8 +495,9 @@ struct dentry *autofs4_expire_indirect(struct super_block *sb, ...@@ -495,8 +495,9 @@ struct dentry *autofs4_expire_indirect(struct super_block *sb,
return expired; return expired;
} }
int autofs4_expire_wait(struct dentry *dentry, int rcu_walk) int autofs4_expire_wait(const struct path *path, int rcu_walk)
{ {
struct dentry *dentry = path->dentry;
struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb); struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
struct autofs_info *ino = autofs4_dentry_ino(dentry); struct autofs_info *ino = autofs4_dentry_ino(dentry);
int status; int status;
......
...@@ -286,22 +286,24 @@ static int autofs4_mount_wait(struct dentry *dentry, bool rcu_walk) ...@@ -286,22 +286,24 @@ static int autofs4_mount_wait(struct dentry *dentry, bool rcu_walk)
return status; return status;
} }
static int do_expire_wait(struct dentry *dentry, bool rcu_walk) static int do_expire_wait(const struct path *path, bool rcu_walk)
{ {
struct dentry *dentry = path->dentry;
struct dentry *expiring; struct dentry *expiring;
expiring = autofs4_lookup_expiring(dentry, rcu_walk); expiring = autofs4_lookup_expiring(dentry, rcu_walk);
if (IS_ERR(expiring)) if (IS_ERR(expiring))
return PTR_ERR(expiring); return PTR_ERR(expiring);
if (!expiring) if (!expiring)
return autofs4_expire_wait(dentry, rcu_walk); return autofs4_expire_wait(path, rcu_walk);
else { else {
struct path this = { .mnt = path->mnt, .dentry = expiring };
/* /*
* If we are racing with expire the request might not * If we are racing with expire the request might not
* be quite complete, but the directory has been removed * be quite complete, but the directory has been removed
* so it must have been successful, just wait for it. * so it must have been successful, just wait for it.
*/ */
autofs4_expire_wait(expiring, 0); autofs4_expire_wait(&this, 0);
autofs4_del_expiring(expiring); autofs4_del_expiring(expiring);
dput(expiring); dput(expiring);
} }
...@@ -354,7 +356,7 @@ static struct vfsmount *autofs4_d_automount(struct path *path) ...@@ -354,7 +356,7 @@ static struct vfsmount *autofs4_d_automount(struct path *path)
* and the directory was removed, so just go ahead and try * and the directory was removed, so just go ahead and try
* the mount. * the mount.
*/ */
status = do_expire_wait(dentry, 0); status = do_expire_wait(path, 0);
if (status && status != -EAGAIN) if (status && status != -EAGAIN)
return NULL; return NULL;
...@@ -438,7 +440,7 @@ static int autofs4_d_manage(const struct path *path, bool rcu_walk) ...@@ -438,7 +440,7 @@ static int autofs4_d_manage(const struct path *path, bool rcu_walk)
} }
/* Wait for pending expires */ /* Wait for pending expires */
if (do_expire_wait(dentry, rcu_walk) == -ECHILD) if (do_expire_wait(path, rcu_walk) == -ECHILD)
return -ECHILD; return -ECHILD;
/* /*
......
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