]> err.no Git - linux-2.6/commitdiff
sunrpc: rpc_pipe_poll may miss available data in some cases
authorJ. Bruce Fields <bfields@citi.umich.edu>
Tue, 6 Nov 2007 18:05:36 +0000 (13:05 -0500)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Sat, 17 Nov 2007 18:08:47 +0000 (13:08 -0500)
Pipe messages start out life on a queue on the inode, but when first
read they're moved to the filp's private pointer.  So it's possible for
a poll here to return null even though there's a partially read message
available.

Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
net/sunrpc/rpc_pipe.c

index 18f0a8dcc095d9506699f553c7630aaac363cd54..c59f3ca2b41b02627a017354f35e319366571633 100644 (file)
@@ -280,7 +280,7 @@ rpc_pipe_poll(struct file *filp, struct poll_table_struct *wait)
        mask = POLLOUT | POLLWRNORM;
        if (rpci->ops == NULL)
                mask |= POLLERR | POLLHUP;
-       if (!list_empty(&rpci->pipe))
+       if (filp->private_data || !list_empty(&rpci->pipe))
                mask |= POLLIN | POLLRDNORM;
        return mask;
 }