Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d0fe13ba authored by Stanislav Kinsbursky's avatar Stanislav Kinsbursky Committed by Trond Myklebust
Browse files

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: default avatarStanislav Kinsbursky <skinsbursky@parallels.com>
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent ba9e0975
Loading
Loading
Loading
Loading
+46 −47
Original line number Diff line number Diff line
@@ -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