mirror of https://gitee.com/openkylin/linux.git
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.net Signed-off-by: Ian 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: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
01619491a5
commit
74f504cff5
|
@ -145,7 +145,7 @@ void autofs4_free_ino(struct autofs_info *);
|
|||
|
||||
/* Expiration */
|
||||
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 *,
|
||||
struct autofs_sb_info *,
|
||||
struct autofs_packet_expire __user *);
|
||||
|
|
|
@ -468,7 +468,7 @@ static int autofs_dev_ioctl_requester(struct file *fp,
|
|||
ino = autofs4_dentry_ino(path.dentry);
|
||||
if (ino) {
|
||||
err = 0;
|
||||
autofs4_expire_wait(path.dentry, 0);
|
||||
autofs4_expire_wait(&path, 0);
|
||||
spin_lock(&sbi->fs_lock);
|
||||
param->requester.uid =
|
||||
from_kuid_munged(current_user_ns(), ino->uid);
|
||||
|
|
|
@ -495,8 +495,9 @@ struct dentry *autofs4_expire_indirect(struct super_block *sb,
|
|||
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_info *ino = autofs4_dentry_ino(dentry);
|
||||
int status;
|
||||
|
|
|
@ -286,22 +286,24 @@ static int autofs4_mount_wait(struct dentry *dentry, bool rcu_walk)
|
|||
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;
|
||||
|
||||
expiring = autofs4_lookup_expiring(dentry, rcu_walk);
|
||||
if (IS_ERR(expiring))
|
||||
return PTR_ERR(expiring);
|
||||
if (!expiring)
|
||||
return autofs4_expire_wait(dentry, rcu_walk);
|
||||
return autofs4_expire_wait(path, rcu_walk);
|
||||
else {
|
||||
struct path this = { .mnt = path->mnt, .dentry = expiring };
|
||||
/*
|
||||
* If we are racing with expire the request might not
|
||||
* be quite complete, but the directory has been removed
|
||||
* so it must have been successful, just wait for it.
|
||||
*/
|
||||
autofs4_expire_wait(expiring, 0);
|
||||
autofs4_expire_wait(&this, 0);
|
||||
autofs4_del_expiring(expiring);
|
||||
dput(expiring);
|
||||
}
|
||||
|
@ -354,7 +356,7 @@ static struct vfsmount *autofs4_d_automount(struct path *path)
|
|||
* and the directory was removed, so just go ahead and try
|
||||
* the mount.
|
||||
*/
|
||||
status = do_expire_wait(dentry, 0);
|
||||
status = do_expire_wait(path, 0);
|
||||
if (status && status != -EAGAIN)
|
||||
return NULL;
|
||||
|
||||
|
@ -438,7 +440,7 @@ static int autofs4_d_manage(const struct path *path, bool rcu_walk)
|
|||
}
|
||||
|
||||
/* Wait for pending expires */
|
||||
if (do_expire_wait(dentry, rcu_walk) == -ECHILD)
|
||||
if (do_expire_wait(path, rcu_walk) == -ECHILD)
|
||||
return -ECHILD;
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in New Issue