Commit a4f7f170 authored by Linus Torvalds's avatar Linus Torvalds

Make pipe "poll()" take direction of pipe into account.

The pipe code has traditionally not cared about which end-point of the
pipe you are polling, meaning that if you poll the write-only end of a
pipe, it will still set the "this pipe is readable" bits if there is
data to be read on the read side.

That makes no sense, and together with the new bigger buffers breaks
python-twisted.

Based on debugging/patch by Andrea Arcangeli and testcase from
Thomas Crhak
parent 54077d3c
...@@ -398,13 +398,18 @@ pipe_poll(struct file *filp, poll_table *wait) ...@@ -398,13 +398,18 @@ pipe_poll(struct file *filp, poll_table *wait)
/* Reading only -- no need for acquiring the semaphore. */ /* Reading only -- no need for acquiring the semaphore. */
nrbufs = info->nrbufs; nrbufs = info->nrbufs;
mask = (nrbufs > 0) ? POLLIN | POLLRDNORM : 0; mask = 0;
mask |= (nrbufs < PIPE_BUFFERS) ? POLLOUT | POLLWRNORM : 0; if (filp->f_mode & FMODE_READ) {
mask = (nrbufs > 0) ? POLLIN | POLLRDNORM : 0;
if (!PIPE_WRITERS(*inode) && filp->f_version != PIPE_WCOUNTER(*inode))
mask |= POLLHUP;
}
if (!PIPE_WRITERS(*inode) && filp->f_version != PIPE_WCOUNTER(*inode)) if (filp->f_mode & FMODE_WRITE) {
mask |= POLLHUP; mask |= (nrbufs < PIPE_BUFFERS) ? POLLOUT | POLLWRNORM : 0;
if (!PIPE_READERS(*inode)) if (!PIPE_READERS(*inode))
mask |= POLLERR; mask |= POLLERR;
}
return mask; return mask;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment