SUNRPC: remove non-exclusive pipe creation from RPC pipefs
authorStanislav Kinsbursky <skinsbursky@parallels.com>
Tue, 8 Nov 2011 12:09:19 +0000 (15:09 +0300)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Tue, 31 Jan 2012 23:20:23 +0000 (18:20 -0500)
This patch-set was created in context of clone of git branch:
git://git.linux-nfs.org/projects/trondmy/nfs-2.6.git.

v2:
1) Rebased of current repo state (i.e. all commits were pulled before apply)

I feel it is ready for inclusion if no objections will appear.

SUNRPC pipefs non-exclusive pipe creation code looks obsolete. IOW, as I see
it, all pipes are creating with unique full path and only once.

Signed-off-by: Stanislav Kinsbursky <skinsbursky@parallels.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
include/linux/sunrpc/rpc_pipe_fs.h
net/sunrpc/rpc_pipe.c

index 2bb03d77375a26fb30c00fd1846f232a73e809bf..edadc3acf9494d8e32381754a1f594df351f98f7 100644 (file)
@@ -30,7 +30,6 @@ struct rpc_inode {
        int pipelen;
        int nreaders;
        int nwriters;
-       int nkern_readwriters;
        wait_queue_head_t waitq;
 #define RPC_PIPE_WAIT_FOR_OPEN 1
        int flags;
index 63a7a7add21eda6d0a2da4426e1156d6bdf77523..8e3397fc0a7deef7375553397d869821b7d3a040 100644 (file)
@@ -554,7 +554,6 @@ static int __rpc_mkpipe(struct inode *dir, struct dentry *dentry,
        if (err)
                return err;
        rpci = RPC_I(dentry->d_inode);
-       rpci->nkern_readwriters = 1;
        rpci->private = private;
        rpci->flags = flags;
        rpci->ops = ops;
@@ -587,16 +586,12 @@ static int __rpc_unlink(struct inode *dir, struct dentry *dentry)
 static int __rpc_rmpipe(struct inode *dir, struct dentry *dentry)
 {
        struct inode *inode = dentry->d_inode;
-       struct rpc_inode *rpci = RPC_I(inode);
 
-       rpci->nkern_readwriters--;
-       if (rpci->nkern_readwriters != 0)
-               return 0;
        rpc_close_pipes(inode);
        return __rpc_unlink(dir, dentry);
 }
 
-static struct dentry *__rpc_lookup_create(struct dentry *parent,
+static struct dentry *__rpc_lookup_create_exclusive(struct dentry *parent,
                                          struct qstr *name)
 {
        struct dentry *dentry;
@@ -604,27 +599,13 @@ static struct dentry *__rpc_lookup_create(struct dentry *parent,
        dentry = d_lookup(parent, name);
        if (!dentry) {
                dentry = d_alloc(parent, name);
-               if (!dentry) {
-                       dentry = ERR_PTR(-ENOMEM);
-                       goto out_err;
-               }
+               if (!dentry)
+                       return ERR_PTR(-ENOMEM);
        }
-       if (!dentry->d_inode)
+       if (dentry->d_inode == NULL) {
                d_set_d_op(dentry, &rpc_dentry_operations);
-out_err:
-       return dentry;
-}
-
-static struct dentry *__rpc_lookup_create_exclusive(struct dentry *parent,
-                                         struct qstr *name)
-{
-       struct dentry *dentry;
-
-       dentry = __rpc_lookup_create(parent, name);
-       if (IS_ERR(dentry))
-               return dentry;
-       if (dentry->d_inode == NULL)
                return dentry;
+       }
        dput(dentry);
        return ERR_PTR(-EEXIST);
 }
@@ -812,22 +793,9 @@ struct dentry *rpc_mkpipe(struct dentry *parent, const char *name,
        q.hash = full_name_hash(q.name, q.len),
 
        mutex_lock_nested(&dir->i_mutex, I_MUTEX_PARENT);
-       dentry = __rpc_lookup_create(parent, &q);
+       dentry = __rpc_lookup_create_exclusive(parent, &q);
        if (IS_ERR(dentry))
                goto out;
-       if (dentry->d_inode) {
-               struct rpc_inode *rpci = RPC_I(dentry->d_inode);
-               if (rpci->private != private ||
-                               rpci->ops != ops ||
-                               rpci->flags != flags) {
-                       dput (dentry);
-                       err = -EBUSY;
-                       goto out_err;
-               }
-               rpci->nkern_readwriters++;
-               goto out;
-       }
-
        err = __rpc_mkpipe(dir, dentry, umode, &rpc_pipe_fops,
                           private, ops, flags);
        if (err)