|
@@ -737,6 +737,7 @@ rpc_mkpipe(struct dentry *parent, const char *name, void *private, struct rpc_pi
|
|
dput (dentry);
|
|
dput (dentry);
|
|
dentry = ERR_PTR(-EBUSY);
|
|
dentry = ERR_PTR(-EBUSY);
|
|
}
|
|
}
|
|
|
|
+ rpci->nkern_readwriters++;
|
|
goto out;
|
|
goto out;
|
|
}
|
|
}
|
|
inode = rpc_get_inode(dir->i_sb, S_IFIFO | S_IRUSR | S_IWUSR);
|
|
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->private = private;
|
|
rpci->flags = flags;
|
|
rpci->flags = flags;
|
|
rpci->ops = ops;
|
|
rpci->ops = ops;
|
|
|
|
+ rpci->nkern_readwriters = 1;
|
|
inode_dir_notify(dir, DN_CREATE);
|
|
inode_dir_notify(dir, DN_CREATE);
|
|
dget(dentry);
|
|
dget(dentry);
|
|
out:
|
|
out:
|
|
@@ -773,10 +775,12 @@ rpc_unlink(struct dentry *dentry)
|
|
parent = dget_parent(dentry);
|
|
parent = dget_parent(dentry);
|
|
dir = parent->d_inode;
|
|
dir = parent->d_inode;
|
|
mutex_lock_nested(&dir->i_mutex, I_MUTEX_PARENT);
|
|
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);
|
|
dput(dentry);
|
|
mutex_unlock(&dir->i_mutex);
|
|
mutex_unlock(&dir->i_mutex);
|
|
dput(parent);
|
|
dput(parent);
|