Bladeren bron

SUNRPC: Add a field to track the number of kernel users of an rpc_pipe

This allows us to correctly deduce when we need to remove the pipe.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Trond Myklebust 18 jaren geleden
bovenliggende
commit
03a1256f06
2 gewijzigde bestanden met toevoegingen van 9 en 4 verwijderingen
  1. 1 0
      include/linux/sunrpc/rpc_pipe_fs.h
  2. 8 4
      net/sunrpc/rpc_pipe.c

+ 1 - 0
include/linux/sunrpc/rpc_pipe_fs.h

@@ -27,6 +27,7 @@ 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;

+ 8 - 4
net/sunrpc/rpc_pipe.c

@@ -737,6 +737,7 @@ rpc_mkpipe(struct dentry *parent, const char *name, void *private, struct rpc_pi
 			dput (dentry);
 			dentry = ERR_PTR(-EBUSY);
 		}
+		rpci->nkern_readwriters++;
 		goto out;
 	}
 	inode = rpc_get_inode(dir->i_sb, S_IFIFO | S_IRUSR | S_IWUSR);
@@ -749,6 +750,7 @@ rpc_mkpipe(struct dentry *parent, const char *name, void *private, struct rpc_pi
 	rpci->private = private;
 	rpci->flags = flags;
 	rpci->ops = ops;
+	rpci->nkern_readwriters = 1;
 	inode_dir_notify(dir, DN_CREATE);
 	dget(dentry);
 out:
@@ -773,10 +775,12 @@ rpc_unlink(struct dentry *dentry)
 	parent = dget_parent(dentry);
 	dir = parent->d_inode;
 	mutex_lock_nested(&dir->i_mutex, I_MUTEX_PARENT);
-	rpc_close_pipes(dentry->d_inode);
-	error = simple_unlink(dir, dentry);
-	if (!error)
-		d_delete(dentry);
+	if (--RPC_I(dentry->d_inode)->nkern_readwriters == 0) {
+		rpc_close_pipes(dentry->d_inode);
+		error = simple_unlink(dir, dentry);
+		if (!error)
+			d_delete(dentry);
+	}
 	dput(dentry);
 	mutex_unlock(&dir->i_mutex);
 	dput(parent);