mirror of https://gitee.com/openkylin/linux.git
SUNRPC: cleanup PipeFS redundant RPC inode usage
This patch removes redundant RPC inode references from PipeFS. These places are actually where pipes operations are performed. Signed-off-by: Stanislav Kinsbursky <skinsbursky@parallels.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
ba9e097593
commit
d0fe13ba91
|
@ -132,28 +132,28 @@ EXPORT_SYMBOL_GPL(rpc_pipe_generic_upcall);
|
|||
int
|
||||
rpc_queue_upcall(struct inode *inode, struct rpc_pipe_msg *msg)
|
||||
{
|
||||
struct rpc_inode *rpci = RPC_I(inode);
|
||||
struct rpc_pipe *pipe = RPC_I(inode)->pipe;
|
||||
int res = -EPIPE;
|
||||
|
||||
spin_lock(&rpci->pipe->lock);
|
||||
if (rpci->pipe->ops == NULL)
|
||||
spin_lock(&pipe->lock);
|
||||
if (pipe->ops == NULL)
|
||||
goto out;
|
||||
if (rpci->pipe->nreaders) {
|
||||
list_add_tail(&msg->list, &rpci->pipe->pipe);
|
||||
rpci->pipe->pipelen += msg->len;
|
||||
if (pipe->nreaders) {
|
||||
list_add_tail(&msg->list, &pipe->pipe);
|
||||
pipe->pipelen += msg->len;
|
||||
res = 0;
|
||||
} else if (rpci->pipe->flags & RPC_PIPE_WAIT_FOR_OPEN) {
|
||||
if (list_empty(&rpci->pipe->pipe))
|
||||
} else if (pipe->flags & RPC_PIPE_WAIT_FOR_OPEN) {
|
||||
if (list_empty(&pipe->pipe))
|
||||
queue_delayed_work(rpciod_workqueue,
|
||||
&rpci->pipe->queue_timeout,
|
||||
&pipe->queue_timeout,
|
||||
RPC_UPCALL_TIMEOUT);
|
||||
list_add_tail(&msg->list, &rpci->pipe->pipe);
|
||||
rpci->pipe->pipelen += msg->len;
|
||||
list_add_tail(&msg->list, &pipe->pipe);
|
||||
pipe->pipelen += msg->len;
|
||||
res = 0;
|
||||
}
|
||||
out:
|
||||
spin_unlock(&rpci->pipe->lock);
|
||||
wake_up(&rpci->pipe->waitq);
|
||||
spin_unlock(&pipe->lock);
|
||||
wake_up(&pipe->waitq);
|
||||
return res;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rpc_queue_upcall);
|
||||
|
@ -220,23 +220,23 @@ rpc_destroy_inode(struct inode *inode)
|
|||
static int
|
||||
rpc_pipe_open(struct inode *inode, struct file *filp)
|
||||
{
|
||||
struct rpc_inode *rpci = RPC_I(inode);
|
||||
struct rpc_pipe *pipe = RPC_I(inode)->pipe;
|
||||
int first_open;
|
||||
int res = -ENXIO;
|
||||
|
||||
mutex_lock(&inode->i_mutex);
|
||||
if (rpci->pipe->ops == NULL)
|
||||
if (pipe->ops == NULL)
|
||||
goto out;
|
||||
first_open = rpci->pipe->nreaders == 0 && rpci->pipe->nwriters == 0;
|
||||
if (first_open && rpci->pipe->ops->open_pipe) {
|
||||
res = rpci->pipe->ops->open_pipe(inode);
|
||||
first_open = pipe->nreaders == 0 && pipe->nwriters == 0;
|
||||
if (first_open && pipe->ops->open_pipe) {
|
||||
res = pipe->ops->open_pipe(inode);
|
||||
if (res)
|
||||
goto out;
|
||||
}
|
||||
if (filp->f_mode & FMODE_READ)
|
||||
rpci->pipe->nreaders++;
|
||||
pipe->nreaders++;
|
||||
if (filp->f_mode & FMODE_WRITE)
|
||||
rpci->pipe->nwriters++;
|
||||
pipe->nwriters++;
|
||||
res = 0;
|
||||
out:
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
|
@ -287,39 +287,39 @@ static ssize_t
|
|||
rpc_pipe_read(struct file *filp, char __user *buf, size_t len, loff_t *offset)
|
||||
{
|
||||
struct inode *inode = filp->f_path.dentry->d_inode;
|
||||
struct rpc_inode *rpci = RPC_I(inode);
|
||||
struct rpc_pipe *pipe = RPC_I(inode)->pipe;
|
||||
struct rpc_pipe_msg *msg;
|
||||
int res = 0;
|
||||
|
||||
mutex_lock(&inode->i_mutex);
|
||||
if (rpci->pipe->ops == NULL) {
|
||||
if (pipe->ops == NULL) {
|
||||
res = -EPIPE;
|
||||
goto out_unlock;
|
||||
}
|
||||
msg = filp->private_data;
|
||||
if (msg == NULL) {
|
||||
spin_lock(&rpci->pipe->lock);
|
||||
if (!list_empty(&rpci->pipe->pipe)) {
|
||||
msg = list_entry(rpci->pipe->pipe.next,
|
||||
spin_lock(&pipe->lock);
|
||||
if (!list_empty(&pipe->pipe)) {
|
||||
msg = list_entry(pipe->pipe.next,
|
||||
struct rpc_pipe_msg,
|
||||
list);
|
||||
list_move(&msg->list, &rpci->pipe->in_upcall);
|
||||
rpci->pipe->pipelen -= msg->len;
|
||||
list_move(&msg->list, &pipe->in_upcall);
|
||||
pipe->pipelen -= msg->len;
|
||||
filp->private_data = msg;
|
||||
msg->copied = 0;
|
||||
}
|
||||
spin_unlock(&rpci->pipe->lock);
|
||||
spin_unlock(&pipe->lock);
|
||||
if (msg == NULL)
|
||||
goto out_unlock;
|
||||
}
|
||||
/* NOTE: it is up to the callback to update msg->copied */
|
||||
res = rpci->pipe->ops->upcall(filp, msg, buf, len);
|
||||
res = pipe->ops->upcall(filp, msg, buf, len);
|
||||
if (res < 0 || msg->len == msg->copied) {
|
||||
filp->private_data = NULL;
|
||||
spin_lock(&rpci->pipe->lock);
|
||||
spin_lock(&pipe->lock);
|
||||
list_del_init(&msg->list);
|
||||
spin_unlock(&rpci->pipe->lock);
|
||||
rpci->pipe->ops->destroy_msg(msg);
|
||||
spin_unlock(&pipe->lock);
|
||||
pipe->ops->destroy_msg(msg);
|
||||
}
|
||||
out_unlock:
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
|
@ -330,13 +330,13 @@ static ssize_t
|
|||
rpc_pipe_write(struct file *filp, const char __user *buf, size_t len, loff_t *offset)
|
||||
{
|
||||
struct inode *inode = filp->f_path.dentry->d_inode;
|
||||
struct rpc_inode *rpci = RPC_I(inode);
|
||||
struct rpc_pipe *pipe = RPC_I(inode)->pipe;
|
||||
int res;
|
||||
|
||||
mutex_lock(&inode->i_mutex);
|
||||
res = -EPIPE;
|
||||
if (rpci->pipe->ops != NULL)
|
||||
res = rpci->pipe->ops->downcall(filp, buf, len);
|
||||
if (pipe->ops != NULL)
|
||||
res = pipe->ops->downcall(filp, buf, len);
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
return res;
|
||||
}
|
||||
|
@ -344,16 +344,15 @@ rpc_pipe_write(struct file *filp, const char __user *buf, size_t len, loff_t *of
|
|||
static unsigned int
|
||||
rpc_pipe_poll(struct file *filp, struct poll_table_struct *wait)
|
||||
{
|
||||
struct rpc_inode *rpci;
|
||||
struct rpc_pipe *pipe = RPC_I(filp->f_path.dentry->d_inode)->pipe;
|
||||
unsigned int mask = 0;
|
||||
|
||||
rpci = RPC_I(filp->f_path.dentry->d_inode);
|
||||
poll_wait(filp, &rpci->pipe->waitq, wait);
|
||||
poll_wait(filp, &pipe->waitq, wait);
|
||||
|
||||
mask = POLLOUT | POLLWRNORM;
|
||||
if (rpci->pipe->ops == NULL)
|
||||
if (pipe->ops == NULL)
|
||||
mask |= POLLERR | POLLHUP;
|
||||
if (filp->private_data || !list_empty(&rpci->pipe->pipe))
|
||||
if (filp->private_data || !list_empty(&pipe->pipe))
|
||||
mask |= POLLIN | POLLRDNORM;
|
||||
return mask;
|
||||
}
|
||||
|
@ -362,23 +361,23 @@ static long
|
|||
rpc_pipe_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
struct inode *inode = filp->f_path.dentry->d_inode;
|
||||
struct rpc_inode *rpci = RPC_I(inode);
|
||||
struct rpc_pipe *pipe = RPC_I(inode)->pipe;
|
||||
int len;
|
||||
|
||||
switch (cmd) {
|
||||
case FIONREAD:
|
||||
spin_lock(&rpci->pipe->lock);
|
||||
if (rpci->pipe->ops == NULL) {
|
||||
spin_unlock(&rpci->pipe->lock);
|
||||
spin_lock(&pipe->lock);
|
||||
if (pipe->ops == NULL) {
|
||||
spin_unlock(&pipe->lock);
|
||||
return -EPIPE;
|
||||
}
|
||||
len = rpci->pipe->pipelen;
|
||||
len = pipe->pipelen;
|
||||
if (filp->private_data) {
|
||||
struct rpc_pipe_msg *msg;
|
||||
msg = filp->private_data;
|
||||
len += msg->len - msg->copied;
|
||||
}
|
||||
spin_unlock(&rpci->pipe->lock);
|
||||
spin_unlock(&pipe->lock);
|
||||
return put_user(len, (int __user *)arg);
|
||||
default:
|
||||
return -EINVAL;
|
||||
|
@ -808,7 +807,7 @@ static int rpc_rmdir_depopulate(struct dentry *dentry,
|
|||
* @private: private data to associate with the pipe, for the caller's use
|
||||
* @ops: operations defining the behavior of the pipe: upcall, downcall,
|
||||
* release_pipe, open_pipe, and destroy_msg.
|
||||
* @flags: rpc_inode flags
|
||||
* @flags: rpc_pipe flags
|
||||
*
|
||||
* Data is made available for userspace to read by calls to
|
||||
* rpc_queue_upcall(). The actual reads will result in calls to
|
||||
|
|
Loading…
Reference in New Issue