Re: two pipe bugfixes

Linus Torvalds
2005-02-28T20:28:34Z

> Thanks, I'll check it in the next bk snapshot.

Here's my version of the poll changes. The EPIPE one is just your original
first patch hunk (with a properly updated commit message).

Linus

-----

# This is a BitKeeper generated diff -Nru style patch.
#
# ChangeSet
# 2005/02/28 08:36:14-08:00 torvalds@ppc970.osdl.org
# 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
#
# fs/pipe.c
# 2005/02/28 08:36:06-08:00 torvalds@ppc970.osdl.org +11 -6
# Make pipe "poll()" take direction of pipe into account.
#
diff -Nru a/fs/pipe.c b/fs/pipe.c
--- a/fs/pipe.c 2005-02-28 12:28:35 -08:00
+++ b/fs/pipe.c 2005-02-28 12:28:35 -08:00
@@ -398,13 +398,18 @@

/* Reading only -- no need for acquiring the semaphore. */
nrbufs = info->nrbufs;
- mask = (nrbufs > 0) ? POLLIN | POLLRDNORM : 0;
- mask |= (nrbufs < PIPE_BUFFERS) ? POLLOUT | POLLWRNORM : 0;
+ mask = 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))
- mask |= POLLHUP;
- if (!PIPE_READERS(*inode))
- mask |= POLLERR;
+ if (filp->f_mode & FMODE_WRITE) {
+ mask |= (nrbufs < PIPE_BUFFERS) ? POLLOUT | POLLWRNORM : 0;
+ if (!PIPE_READERS(*inode))
+ mask |= POLLERR;
+ }

return mask;
}