nsfs: Simplify __ns_get_path
authorEric W. Biederman <ebiederm@xmission.com>
Fri, 23 Sep 2016 00:39:20 +0000 (19:39 -0500)
committerEric W. Biederman <ebiederm@xmission.com>
Fri, 23 Sep 2016 01:06:20 +0000 (20:06 -0500)
Move mntget from the very beginning of __ns_get_path to
the success path of __ns_get_path, and remove the mntget
calls.

This removes the possibility that there will be a mntget/mntput
pair of __ns_get_path has to retry, and generally simplifies the code.

Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
fs/nsfs.c

index fb7b397..30bb100 100644 (file)
--- a/fs/nsfs.c
+++ b/fs/nsfs.c
@@ -51,7 +51,7 @@ static void nsfs_evict(struct inode *inode)
 
 static void *__ns_get_path(struct path *path, struct ns_common *ns)
 {
-       struct vfsmount *mnt = mntget(nsfs_mnt);
+       struct vfsmount *mnt = nsfs_mnt;
        struct qstr qname = { .name = "", };
        struct dentry *dentry;
        struct inode *inode;
@@ -67,7 +67,7 @@ static void *__ns_get_path(struct path *path, struct ns_common *ns)
        rcu_read_unlock();
        ns->ops->put(ns);
 got_it:
-       path->mnt = mnt;
+       path->mnt = mntget(mnt);
        path->dentry = dentry;
        return NULL;
 slow:
@@ -75,7 +75,6 @@ slow:
        inode = new_inode_pseudo(mnt->mnt_sb);
        if (!inode) {
                ns->ops->put(ns);
-               mntput(mnt);
                return ERR_PTR(-ENOMEM);
        }
        inode->i_ino = ns->inum;
@@ -88,7 +87,6 @@ slow:
        dentry = d_alloc_pseudo(mnt->mnt_sb, &qname);
        if (!dentry) {
                iput(inode);
-               mntput(mnt);
                return ERR_PTR(-ENOMEM);
        }
        d_instantiate(dentry, inode);
@@ -97,7 +95,6 @@ slow:
        if (d) {
                d_delete(dentry);       /* make sure ->d_prune() does nothing */
                dput(dentry);
-               mntput(mnt);
                cpu_relax();
                return ERR_PTR(-EAGAIN);
        }