Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 294495
b: refs/heads/master
c: 2c9030e
h: refs/heads/master
i:
  294493: 99cfcd6
  294491: 965ecbc
  294487: e5f10d8
  294479: e706c09
  294463: 19990dd
v: v3
  • Loading branch information
Stanislav Kinsbursky authored and Trond Myklebust committed Feb 27, 2012
1 parent 0bd18c6 commit 561aa9e
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 14 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: e9dbca8d732e20b8d31a3094a8669c014e7ee262
refs/heads/master: 2c9030eef9dbd0d737a7f55646da70d217fd6255
32 changes: 19 additions & 13 deletions trunk/net/sunrpc/rpc_pipe.c
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,7 @@ rpc_close_pipes(struct inode *inode)
pipe->ops->release_pipe(inode);
cancel_delayed_work_sync(&pipe->queue_timeout);
rpc_inode_setowner(inode, NULL);
RPC_I(inode)->pipe = NULL;
mutex_unlock(&inode->i_mutex);
}

Expand Down Expand Up @@ -203,12 +204,13 @@ rpc_destroy_inode(struct inode *inode)
static int
rpc_pipe_open(struct inode *inode, struct file *filp)
{
struct rpc_pipe *pipe = RPC_I(inode)->pipe;
struct rpc_pipe *pipe;
int first_open;
int res = -ENXIO;

mutex_lock(&inode->i_mutex);
if (pipe->dentry == NULL)
pipe = RPC_I(inode)->pipe;
if (pipe == NULL)
goto out;
first_open = pipe->nreaders == 0 && pipe->nwriters == 0;
if (first_open && pipe->ops->open_pipe) {
Expand All @@ -229,12 +231,13 @@ rpc_pipe_open(struct inode *inode, struct file *filp)
static int
rpc_pipe_release(struct inode *inode, struct file *filp)
{
struct rpc_pipe *pipe = RPC_I(inode)->pipe;
struct rpc_pipe *pipe;
struct rpc_pipe_msg *msg;
int last_close;

mutex_lock(&inode->i_mutex);
if (pipe->dentry == NULL)
pipe = RPC_I(inode)->pipe;
if (pipe == NULL)
goto out;
msg = filp->private_data;
if (msg != NULL) {
Expand Down Expand Up @@ -270,12 +273,13 @@ 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_pipe *pipe = RPC_I(inode)->pipe;
struct rpc_pipe *pipe;
struct rpc_pipe_msg *msg;
int res = 0;

mutex_lock(&inode->i_mutex);
if (pipe->dentry == NULL) {
pipe = RPC_I(inode)->pipe;
if (pipe == NULL) {
res = -EPIPE;
goto out_unlock;
}
Expand Down Expand Up @@ -313,13 +317,12 @@ 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_pipe *pipe = RPC_I(inode)->pipe;
int res;

mutex_lock(&inode->i_mutex);
res = -EPIPE;
if (pipe->dentry != NULL)
res = pipe->ops->downcall(filp, buf, len);
if (RPC_I(inode)->pipe != NULL)
res = RPC_I(inode)->pipe->ops->downcall(filp, buf, len);
mutex_unlock(&inode->i_mutex);
return res;
}
Expand All @@ -344,23 +347,26 @@ 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_pipe *pipe = RPC_I(inode)->pipe;
struct rpc_pipe *pipe;
int len;

switch (cmd) {
case FIONREAD:
spin_lock(&pipe->lock);
if (pipe->dentry == NULL) {
spin_unlock(&pipe->lock);
mutex_lock(&inode->i_mutex);
pipe = RPC_I(inode)->pipe;
if (pipe == NULL) {
mutex_unlock(&inode->i_mutex);
return -EPIPE;
}
spin_lock(&pipe->lock);
len = pipe->pipelen;
if (filp->private_data) {
struct rpc_pipe_msg *msg;
msg = filp->private_data;
len += msg->len - msg->copied;
}
spin_unlock(&pipe->lock);
mutex_unlock(&inode->i_mutex);
return put_user(len, (int __user *)arg);
default:
return -EINVAL;
Expand Down

0 comments on commit 561aa9e

Please sign in to comment.