autofs: change autofs4_wait() to take struct path
authorIan Kent <ikent@redhat.com>
Wed, 23 Nov 2016 21:03:42 +0000 (08:03 +1100)
committerAl Viro <viro@zeniv.linux.org.uk>
Sun, 4 Dec 2016 01:51:48 +0000 (20:51 -0500)
In order to use the functions path_is_mountpoint() and path_has_submounts()
autofs needs to pass a struct path in several places.

Now change autofs4_wait() to take a struct path instead of a struct
dentry.

Link: http://lkml.kernel.org/r/20161011053413.27645.84666.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>
fs/autofs4/autofs_i.h
fs/autofs4/expire.c
fs/autofs4/root.c
fs/autofs4/waitq.c

index 45311525ad89b34eabbe4dc2a7dce277ed50e4d2..c885daae68c8ee9687ea6be1fdb17ce3d3bf603b 100644 (file)
@@ -217,7 +217,8 @@ static inline int autofs_prepare_pipe(struct file *pipe)
 
 /* Queue management functions */
 
-int autofs4_wait(struct autofs_sb_info *, struct dentry *, enum autofs_notify);
+int autofs4_wait(struct autofs_sb_info *,
+                const struct path *, enum autofs_notify);
 int autofs4_wait_release(struct autofs_sb_info *, autofs_wqt_t, int);
 void autofs4_catatonic_mode(struct autofs_sb_info *);
 
index 6ba6107e6102c2796ed117f4eb78227e6e8ecb39..9c352da24444f6c2ae82635ac71f2ac1e1a22813 100644 (file)
@@ -526,7 +526,7 @@ retry:
 
                pr_debug("waiting for expire %p name=%pd\n", dentry, dentry);
 
-               status = autofs4_wait(sbi, dentry, NFY_NONE);
+               status = autofs4_wait(sbi, path, NFY_NONE);
                wait_for_completion(&ino->expire_complete);
 
                pr_debug("expire done status=%d\n", status);
@@ -593,11 +593,12 @@ int autofs4_do_expire_multi(struct super_block *sb, struct vfsmount *mnt,
 
        if (dentry) {
                struct autofs_info *ino = autofs4_dentry_ino(dentry);
+               struct path path = { .mnt = mnt, .dentry = dentry };
 
                /* This is synchronous because it makes the daemon a
                 * little easier
                 */
-               ret = autofs4_wait(sbi, dentry, NFY_EXPIRE);
+               ret = autofs4_wait(sbi, &path, NFY_EXPIRE);
 
                spin_lock(&sbi->fs_lock);
                /* avoid rapid-fire expire attempts if expiry fails */
index 6b06337ca9fc493c257b56b68a8b30e21508d507..0e9881552881f756f9a053acd313251aa5e1ba7b 100644 (file)
@@ -269,17 +269,17 @@ next:
        return NULL;
 }
 
-static int autofs4_mount_wait(struct dentry *dentry, bool rcu_walk)
+static int autofs4_mount_wait(const struct path *path, bool rcu_walk)
 {
-       struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
-       struct autofs_info *ino = autofs4_dentry_ino(dentry);
+       struct autofs_sb_info *sbi = autofs4_sbi(path->dentry->d_sb);
+       struct autofs_info *ino = autofs4_dentry_ino(path->dentry);
        int status = 0;
 
        if (ino->flags & AUTOFS_INF_PENDING) {
                if (rcu_walk)
                        return -ECHILD;
-               pr_debug("waiting for mount name=%pd\n", dentry);
-               status = autofs4_wait(sbi, dentry, NFY_MOUNT);
+               pr_debug("waiting for mount name=%pd\n", path->dentry);
+               status = autofs4_wait(sbi, path, NFY_MOUNT);
                pr_debug("mount wait done status=%d\n", status);
        }
        ino->last_used = jiffies;
@@ -364,7 +364,7 @@ static struct vfsmount *autofs4_d_automount(struct path *path)
        spin_lock(&sbi->fs_lock);
        if (ino->flags & AUTOFS_INF_PENDING) {
                spin_unlock(&sbi->fs_lock);
-               status = autofs4_mount_wait(dentry, 0);
+               status = autofs4_mount_wait(path, 0);
                if (status)
                        return ERR_PTR(status);
                goto done;
@@ -405,7 +405,7 @@ static struct vfsmount *autofs4_d_automount(struct path *path)
                }
                ino->flags |= AUTOFS_INF_PENDING;
                spin_unlock(&sbi->fs_lock);
-               status = autofs4_mount_wait(dentry, 0);
+               status = autofs4_mount_wait(path, 0);
                spin_lock(&sbi->fs_lock);
                ino->flags &= ~AUTOFS_INF_PENDING;
                if (status) {
@@ -447,7 +447,7 @@ static int autofs4_d_manage(const struct path *path, bool rcu_walk)
         * This dentry may be under construction so wait on mount
         * completion.
         */
-       status = autofs4_mount_wait(dentry, rcu_walk);
+       status = autofs4_mount_wait(path, rcu_walk);
        if (status)
                return status;
 
index e44271dfceb6f8fd0740436d1754821914b7f9bf..38ef973f80e9b11664c9d3055c22c24d1e054b97 100644 (file)
@@ -345,8 +345,9 @@ static int validate_request(struct autofs_wait_queue **wait,
 }
 
 int autofs4_wait(struct autofs_sb_info *sbi,
-                struct dentry *dentry, enum autofs_notify notify)
+                const struct path *path, enum autofs_notify notify)
 {
+       struct dentry *dentry = path->dentry;
        struct autofs_wait_queue *wq;
        struct qstr qstr;
        char *name;