Just use d_make_persistent() + dput() (and fold the latter into
simple_finish_creating()) and that's it...

NOTE: pipe->dentry is a borrowed reference - it does not contribute
to dentry refcount.

Signed-off-by: Al Viro <[email protected]>
---
 net/sunrpc/rpc_pipe.c | 27 ++++++++++++---------------
 1 file changed, 12 insertions(+), 15 deletions(-)

diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c
index 0bd1df2ebb47..379daefc4847 100644
--- a/net/sunrpc/rpc_pipe.c
+++ b/net/sunrpc/rpc_pipe.c
@@ -536,17 +536,16 @@ static int rpc_new_file(struct dentry *parent,
 
        inode = rpc_get_inode(dir->i_sb, S_IFREG | mode);
        if (unlikely(!inode)) {
-               dput(dentry);
-               inode_unlock(dir);
+               simple_done_creating(dentry);
                return -ENOMEM;
        }
        inode->i_ino = iunique(dir->i_sb, 100);
        if (i_fop)
                inode->i_fop = i_fop;
        rpc_inode_setowner(inode, private);
-       d_instantiate(dentry, inode);
+       d_make_persistent(dentry, inode);
        fsnotify_create(dir, dentry);
-       inode_unlock(dir);
+       simple_done_creating(dentry);
        return 0;
 }
 
@@ -563,18 +562,17 @@ static struct dentry *rpc_new_dir(struct dentry *parent,
 
        inode = rpc_get_inode(dir->i_sb, S_IFDIR | mode);
        if (unlikely(!inode)) {
-               dput(dentry);
-               inode_unlock(dir);
+               simple_done_creating(dentry);
                return ERR_PTR(-ENOMEM);
        }
 
        inode->i_ino = iunique(dir->i_sb, 100);
        inc_nlink(dir);
-       d_instantiate(dentry, inode);
+       d_make_persistent(dentry, inode);
        fsnotify_mkdir(dir, dentry);
-       inode_unlock(dir);
+       simple_done_creating(dentry);
 
-       return dentry;
+       return dentry; // borrowed
 }
 
 static int rpc_populate(struct dentry *parent,
@@ -657,8 +655,7 @@ int rpc_mkpipe_dentry(struct dentry *parent, const char 
*name,
 
        inode = rpc_get_inode(dir->i_sb, umode);
        if (unlikely(!inode)) {
-               dput(dentry);
-               inode_unlock(dir);
+               simple_done_creating(dentry);
                err = -ENOMEM;
                goto failed;
        }
@@ -668,10 +665,10 @@ int rpc_mkpipe_dentry(struct dentry *parent, const char 
*name,
        rpci->private = private;
        rpci->pipe = pipe;
        rpc_inode_setowner(inode, private);
-       d_instantiate(dentry, inode);
-       pipe->dentry = dentry;
+       pipe->dentry = dentry; // borrowed
+       d_make_persistent(dentry, inode);
        fsnotify_create(dir, dentry);
-       inode_unlock(dir);
+       simple_done_creating(dentry);
        return 0;
 
 failed:
@@ -1206,7 +1203,7 @@ static void rpc_kill_sb(struct super_block *sb)
                                           sb);
        mutex_unlock(&sn->pipefs_sb_lock);
 out:
-       kill_litter_super(sb);
+       kill_anon_super(sb);
        put_net(net);
 }
 
-- 
2.47.3


Reply via email to