lkml.org 
[lkml]   [2006]   [Mar]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patches in this message
    /
    Date
    From
    Subject[patch] POLLRDHUP/EPOLLRDHUP handling for half-closed devices notifications ...

    The attached patch against 2.6.16-rc5 implements the half-closed devices
    notifiation, by adding a new POLLRDHUP (and its alias EPOLLRDHUP) bit to
    the existing poll/select sets. Since the existing POLLHUP handling, that
    does not report correctly half-closed devices, was feared to be changed,
    this implementation leaves the current POLLHUP reporting unchanged and
    simply add a new bit that is set in the few places where it makes sense.
    The same thing was discussed and conceptually agreed quite some time ago:

    http://lkml.org/lkml/2003/7/12/116

    Since this new event bit is added to the existing Linux poll infrastruture,
    even the existing poll/select system calls will be able to use it. As far
    as the existing POLLHUP handling, the patch leaves it as is.
    The pollrdhup-2.6.16.rc5-0.10.diff defines the POLLRDHUP for all the
    existing archs and sets the bit in the six relevant files.
    The other attached diff is the simple change required to sys/epoll.h to
    add the EPOLLRDHUP definition.



    Signed-off-by: Davide Libenzi <davidel@xmailserver.org>



    - Davide


    fs/eventpoll.c | 4 ++--
    include/asm-alpha/poll.h | 2 ++
    include/asm-arm/poll.h | 1 +
    include/asm-arm26/poll.h | 1 +
    include/asm-cris/poll.h | 1 +
    include/asm-frv/poll.h | 1 +
    include/asm-h8300/poll.h | 1 +
    include/asm-i386/poll.h | 1 +
    include/asm-ia64/poll.h | 1 +
    include/asm-m32r/poll.h | 1 +
    include/asm-m68k/poll.h | 1 +
    include/asm-mips/poll.h | 1 +
    include/asm-parisc/poll.h | 1 +
    include/asm-powerpc/poll.h | 1 +
    include/asm-s390/poll.h | 1 +
    include/asm-sh/poll.h | 1 +
    include/asm-sh64/poll.h | 1 +
    include/asm-sparc/poll.h | 1 +
    include/asm-sparc64/poll.h | 1 +
    include/asm-v850/poll.h | 1 +
    include/asm-x86_64/poll.h | 1 +
    include/asm-xtensa/poll.h | 1 +
    net/bluetooth/af_bluetooth.c | 3 +++
    net/core/datagram.c | 2 ++
    net/dccp/proto.c | 2 +-
    net/ipv4/tcp.c | 2 +-
    net/sctp/socket.c | 2 ++
    net/unix/af_unix.c | 2 ++
    28 files changed, 35 insertions(+), 4 deletions(-)
    diff -Nru linux-2.6.15/fs/eventpoll.c linux-2.6.15.mod/fs/eventpoll.c
    --- linux-2.6.15/fs/eventpoll.c 2006-01-02 19:21:10.000000000 -0800
    +++ linux-2.6.15.mod/fs/eventpoll.c 2006-03-07 12:25:08.000000000 -0800
    @@ -607,7 +607,7 @@
    switch (op) {
    case EPOLL_CTL_ADD:
    if (!epi) {
    - epds.events |= POLLERR | POLLHUP;
    + epds.events |= POLLERR | POLLHUP | POLLRDHUP;

    error = ep_insert(ep, &epds, tfile, fd);
    } else
    @@ -621,7 +621,7 @@
    break;
    case EPOLL_CTL_MOD:
    if (epi) {
    - epds.events |= POLLERR | POLLHUP;
    + epds.events |= POLLERR | POLLHUP | POLLRDHUP;
    error = ep_modify(ep, epi, &epds);
    } else
    error = -ENOENT;
    diff -Nru linux-2.6.15/include/asm-alpha/poll.h linux-2.6.15.mod/include/asm-alpha/poll.h
    --- linux-2.6.15/include/asm-alpha/poll.h 2006-01-02 19:21:10.000000000 -0800
    +++ linux-2.6.15.mod/include/asm-alpha/poll.h 2006-03-07 12:25:08.000000000 -0800
    @@ -13,6 +13,8 @@
    #define POLLWRBAND (1 << 9)
    #define POLLMSG (1 << 10)
    #define POLLREMOVE (1 << 11)
    +#define POLLRDHUP (1 << 12)
    +

    struct pollfd {
    int fd;
    diff -Nru linux-2.6.15/include/asm-arm/poll.h linux-2.6.15.mod/include/asm-arm/poll.h
    --- linux-2.6.15/include/asm-arm/poll.h 2006-01-02 19:21:10.000000000 -0800
    +++ linux-2.6.15.mod/include/asm-arm/poll.h 2006-03-07 12:25:08.000000000 -0800
    @@ -16,6 +16,7 @@
    #define POLLWRBAND 0x0200
    #define POLLMSG 0x0400
    #define POLLREMOVE 0x1000
    +#define POLLRDHUP 0x2000

    struct pollfd {
    int fd;
    diff -Nru linux-2.6.15/include/asm-arm26/poll.h linux-2.6.15.mod/include/asm-arm26/poll.h
    --- linux-2.6.15/include/asm-arm26/poll.h 2006-01-02 19:21:10.000000000 -0800
    +++ linux-2.6.15.mod/include/asm-arm26/poll.h 2006-03-07 12:25:08.000000000 -0800
    @@ -15,6 +15,7 @@
    #define POLLWRNORM 0x0100
    #define POLLWRBAND 0x0200
    #define POLLMSG 0x0400
    +#define POLLRDHUP 0x2000

    struct pollfd {
    int fd;
    diff -Nru linux-2.6.15/include/asm-cris/poll.h linux-2.6.15.mod/include/asm-cris/poll.h
    --- linux-2.6.15/include/asm-cris/poll.h 2006-01-02 19:21:10.000000000 -0800
    +++ linux-2.6.15.mod/include/asm-cris/poll.h 2006-03-07 12:25:08.000000000 -0800
    @@ -15,6 +15,7 @@
    #define POLLWRBAND 512
    #define POLLMSG 1024
    #define POLLREMOVE 4096
    +#define POLLRDHUP 8192

    struct pollfd {
    int fd;
    diff -Nru linux-2.6.15/include/asm-frv/poll.h linux-2.6.15.mod/include/asm-frv/poll.h
    --- linux-2.6.15/include/asm-frv/poll.h 2006-01-02 19:21:10.000000000 -0800
    +++ linux-2.6.15.mod/include/asm-frv/poll.h 2006-03-07 12:25:08.000000000 -0800
    @@ -12,6 +12,7 @@
    #define POLLRDBAND 128
    #define POLLWRBAND 256
    #define POLLMSG 0x0400
    +#define POLLRDHUP 0x2000

    struct pollfd {
    int fd;
    diff -Nru linux-2.6.15/include/asm-h8300/poll.h linux-2.6.15.mod/include/asm-h8300/poll.h
    --- linux-2.6.15/include/asm-h8300/poll.h 2006-01-02 19:21:10.000000000 -0800
    +++ linux-2.6.15.mod/include/asm-h8300/poll.h 2006-03-07 12:25:08.000000000 -0800
    @@ -12,6 +12,7 @@
    #define POLLRDBAND 128
    #define POLLWRBAND 256
    #define POLLMSG 0x0400
    +#define POLLRDHUP 0x2000

    struct pollfd {
    int fd;
    diff -Nru linux-2.6.15/include/asm-i386/poll.h linux-2.6.15.mod/include/asm-i386/poll.h
    --- linux-2.6.15/include/asm-i386/poll.h 2006-01-02 19:21:10.000000000 -0800
    +++ linux-2.6.15.mod/include/asm-i386/poll.h 2006-03-07 12:25:08.000000000 -0800
    @@ -16,6 +16,7 @@
    #define POLLWRBAND 0x0200
    #define POLLMSG 0x0400
    #define POLLREMOVE 0x1000
    +#define POLLRDHUP 0x2000

    struct pollfd {
    int fd;
    diff -Nru linux-2.6.15/include/asm-ia64/poll.h linux-2.6.15.mod/include/asm-ia64/poll.h
    --- linux-2.6.15/include/asm-ia64/poll.h 2006-01-02 19:21:10.000000000 -0800
    +++ linux-2.6.15.mod/include/asm-ia64/poll.h 2006-03-07 12:25:08.000000000 -0800
    @@ -21,6 +21,7 @@
    #define POLLWRBAND 0x0200
    #define POLLMSG 0x0400
    #define POLLREMOVE 0x1000
    +#define POLLRDHUP 0x2000

    struct pollfd {
    int fd;
    diff -Nru linux-2.6.15/include/asm-m32r/poll.h linux-2.6.15.mod/include/asm-m32r/poll.h
    --- linux-2.6.15/include/asm-m32r/poll.h 2006-01-02 19:21:10.000000000 -0800
    +++ linux-2.6.15.mod/include/asm-m32r/poll.h 2006-03-07 12:25:08.000000000 -0800
    @@ -21,6 +21,7 @@
    #define POLLWRBAND 0x0200
    #define POLLMSG 0x0400
    #define POLLREMOVE 0x1000
    +#define POLLRDHUP 0x2000

    struct pollfd {
    int fd;
    diff -Nru linux-2.6.15/include/asm-m68k/poll.h linux-2.6.15.mod/include/asm-m68k/poll.h
    --- linux-2.6.15/include/asm-m68k/poll.h 2006-01-02 19:21:10.000000000 -0800
    +++ linux-2.6.15.mod/include/asm-m68k/poll.h 2006-03-07 12:25:08.000000000 -0800
    @@ -13,6 +13,7 @@
    #define POLLWRBAND 256
    #define POLLMSG 0x0400
    #define POLLREMOVE 0x1000
    +#define POLLRDHUP 0x2000

    struct pollfd {
    int fd;
    diff -Nru linux-2.6.15/include/asm-mips/poll.h linux-2.6.15.mod/include/asm-mips/poll.h
    --- linux-2.6.15/include/asm-mips/poll.h 2006-01-02 19:21:10.000000000 -0800
    +++ linux-2.6.15.mod/include/asm-mips/poll.h 2006-03-07 12:25:08.000000000 -0800
    @@ -17,6 +17,7 @@
    /* These seem to be more or less nonstandard ... */
    #define POLLMSG 0x0400
    #define POLLREMOVE 0x1000
    +#define POLLRDHUP 0x2000

    struct pollfd {
    int fd;
    diff -Nru linux-2.6.15/include/asm-parisc/poll.h linux-2.6.15.mod/include/asm-parisc/poll.h
    --- linux-2.6.15/include/asm-parisc/poll.h 2006-01-02 19:21:10.000000000 -0800
    +++ linux-2.6.15.mod/include/asm-parisc/poll.h 2006-03-07 12:25:08.000000000 -0800
    @@ -16,6 +16,7 @@
    #define POLLWRBAND 0x0200
    #define POLLMSG 0x0400
    #define POLLREMOVE 0x1000
    +#define POLLRDHUP 0x2000

    struct pollfd {
    int fd;
    diff -Nru linux-2.6.15/include/asm-powerpc/poll.h linux-2.6.15.mod/include/asm-powerpc/poll.h
    --- linux-2.6.15/include/asm-powerpc/poll.h 2006-01-02 19:21:10.000000000 -0800
    +++ linux-2.6.15.mod/include/asm-powerpc/poll.h 2006-03-07 12:25:08.000000000 -0800
    @@ -13,6 +13,7 @@
    #define POLLWRBAND 0x0200
    #define POLLMSG 0x0400
    #define POLLREMOVE 0x1000
    +#define POLLRDHUP 0x2000

    struct pollfd {
    int fd;
    diff -Nru linux-2.6.15/include/asm-s390/poll.h linux-2.6.15.mod/include/asm-s390/poll.h
    --- linux-2.6.15/include/asm-s390/poll.h 2006-01-02 19:21:10.000000000 -0800
    +++ linux-2.6.15.mod/include/asm-s390/poll.h 2006-03-07 12:25:08.000000000 -0800
    @@ -24,6 +24,7 @@
    #define POLLWRBAND 0x0200
    #define POLLMSG 0x0400
    #define POLLREMOVE 0x1000
    +#define POLLRDHUP 0x2000

    struct pollfd {
    int fd;
    diff -Nru linux-2.6.15/include/asm-sh/poll.h linux-2.6.15.mod/include/asm-sh/poll.h
    --- linux-2.6.15/include/asm-sh/poll.h 2006-01-02 19:21:10.000000000 -0800
    +++ linux-2.6.15.mod/include/asm-sh/poll.h 2006-03-07 12:25:08.000000000 -0800
    @@ -16,6 +16,7 @@
    #define POLLWRBAND 0x0200
    #define POLLMSG 0x0400
    #define POLLREMOVE 0x1000
    +#define POLLRDHUP 0x2000

    struct pollfd {
    int fd;
    diff -Nru linux-2.6.15/include/asm-sh64/poll.h linux-2.6.15.mod/include/asm-sh64/poll.h
    --- linux-2.6.15/include/asm-sh64/poll.h 2006-01-02 19:21:10.000000000 -0800
    +++ linux-2.6.15.mod/include/asm-sh64/poll.h 2006-03-07 12:25:08.000000000 -0800
    @@ -26,6 +26,7 @@
    #define POLLWRNORM 0x0100
    #define POLLWRBAND 0x0200
    #define POLLMSG 0x0400
    +#define POLLRDHUP 0x2000

    struct pollfd {
    int fd;
    diff -Nru linux-2.6.15/include/asm-sparc/poll.h linux-2.6.15.mod/include/asm-sparc/poll.h
    --- linux-2.6.15/include/asm-sparc/poll.h 2006-01-02 19:21:10.000000000 -0800
    +++ linux-2.6.15.mod/include/asm-sparc/poll.h 2006-03-07 12:25:08.000000000 -0800
    @@ -13,6 +13,7 @@
    #define POLLWRBAND 256
    #define POLLMSG 512
    #define POLLREMOVE 1024
    +#define POLLRDHUP 2048

    struct pollfd {
    int fd;
    diff -Nru linux-2.6.15/include/asm-sparc64/poll.h linux-2.6.15.mod/include/asm-sparc64/poll.h
    --- linux-2.6.15/include/asm-sparc64/poll.h 2006-01-02 19:21:10.000000000 -0800
    +++ linux-2.6.15.mod/include/asm-sparc64/poll.h 2006-03-07 12:25:08.000000000 -0800
    @@ -13,6 +13,7 @@
    #define POLLWRBAND 256
    #define POLLMSG 512
    #define POLLREMOVE 1024
    +#define POLLRDHUP 2048

    struct pollfd {
    int fd;
    diff -Nru linux-2.6.15/include/asm-v850/poll.h linux-2.6.15.mod/include/asm-v850/poll.h
    --- linux-2.6.15/include/asm-v850/poll.h 2006-01-02 19:21:10.000000000 -0800
    +++ linux-2.6.15.mod/include/asm-v850/poll.h 2006-03-07 12:25:08.000000000 -0800
    @@ -13,6 +13,7 @@
    #define POLLWRBAND 0x0100
    #define POLLMSG 0x0400
    #define POLLREMOVE 0x1000
    +#define POLLRDHUP 0x2000

    struct pollfd {
    int fd;
    diff -Nru linux-2.6.15/include/asm-x86_64/poll.h linux-2.6.15.mod/include/asm-x86_64/poll.h
    --- linux-2.6.15/include/asm-x86_64/poll.h 2006-01-02 19:21:10.000000000 -0800
    +++ linux-2.6.15.mod/include/asm-x86_64/poll.h 2006-03-07 12:25:08.000000000 -0800
    @@ -16,6 +16,7 @@
    #define POLLWRBAND 0x0200
    #define POLLMSG 0x0400
    #define POLLREMOVE 0x1000
    +#define POLLRDHUP 0x2000

    struct pollfd {
    int fd;
    diff -Nru linux-2.6.15/include/asm-xtensa/poll.h linux-2.6.15.mod/include/asm-xtensa/poll.h
    --- linux-2.6.15/include/asm-xtensa/poll.h 2006-01-02 19:21:10.000000000 -0800
    +++ linux-2.6.15.mod/include/asm-xtensa/poll.h 2006-03-07 12:25:08.000000000 -0800
    @@ -27,6 +27,7 @@

    #define POLLMSG 0x0400
    #define POLLREMOVE 0x0800
    +#define POLLRDHUP 0x2000

    struct pollfd {
    int fd;
    diff -Nru linux-2.6.15/net/bluetooth/af_bluetooth.c linux-2.6.15.mod/net/bluetooth/af_bluetooth.c
    --- linux-2.6.15/net/bluetooth/af_bluetooth.c 2006-03-07 12:24:26.000000000 -0800
    +++ linux-2.6.15.mod/net/bluetooth/af_bluetooth.c 2006-03-07 12:25:08.000000000 -0800
    @@ -238,6 +238,9 @@
    if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue))
    mask |= POLLERR;

    + if (sk->sk_shutdown & RCV_SHUTDOWN)
    + mask |= POLLRDHUP;
    +
    if (sk->sk_shutdown == SHUTDOWN_MASK)
    mask |= POLLHUP;

    diff -Nru linux-2.6.15/net/core/datagram.c linux-2.6.15.mod/net/core/datagram.c
    --- linux-2.6.15/net/core/datagram.c 2006-03-07 12:24:26.000000000 -0800
    +++ linux-2.6.15.mod/net/core/datagram.c 2006-03-07 12:25:08.000000000 -0800
    @@ -500,6 +500,8 @@
    /* exceptional events? */
    if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue))
    mask |= POLLERR;
    + if (sk->sk_shutdown & RCV_SHUTDOWN)
    + mask |= POLLRDHUP;
    if (sk->sk_shutdown == SHUTDOWN_MASK)
    mask |= POLLHUP;

    diff -Nru linux-2.6.15/net/dccp/proto.c linux-2.6.15.mod/net/dccp/proto.c
    --- linux-2.6.15/net/dccp/proto.c 2006-03-07 12:24:26.000000000 -0800
    +++ linux-2.6.15.mod/net/dccp/proto.c 2006-03-07 12:25:08.000000000 -0800
    @@ -183,7 +183,7 @@
    if (sk->sk_shutdown == SHUTDOWN_MASK || sk->sk_state == DCCP_CLOSED)
    mask |= POLLHUP;
    if (sk->sk_shutdown & RCV_SHUTDOWN)
    - mask |= POLLIN | POLLRDNORM;
    + mask |= POLLIN | POLLRDNORM | POLLRDHUP;

    /* Connected? */
    if ((1 << sk->sk_state) & ~(DCCPF_REQUESTING | DCCPF_RESPOND)) {
    diff -Nru linux-2.6.15/net/ipv4/tcp.c linux-2.6.15.mod/net/ipv4/tcp.c
    --- linux-2.6.15/net/ipv4/tcp.c 2006-03-07 12:24:26.000000000 -0800
    +++ linux-2.6.15.mod/net/ipv4/tcp.c 2006-03-07 12:25:08.000000000 -0800
    @@ -365,7 +365,7 @@
    if (sk->sk_shutdown == SHUTDOWN_MASK || sk->sk_state == TCP_CLOSE)
    mask |= POLLHUP;
    if (sk->sk_shutdown & RCV_SHUTDOWN)
    - mask |= POLLIN | POLLRDNORM;
    + mask |= POLLIN | POLLRDNORM | POLLRDHUP;

    /* Connected? */
    if ((1 << sk->sk_state) & ~(TCPF_SYN_SENT | TCPF_SYN_RECV)) {
    diff -Nru linux-2.6.15/net/sctp/socket.c linux-2.6.15.mod/net/sctp/socket.c
    --- linux-2.6.15/net/sctp/socket.c 2006-03-07 12:24:26.000000000 -0800
    +++ linux-2.6.15.mod/net/sctp/socket.c 2006-03-07 12:25:08.000000000 -0800
    @@ -4894,6 +4894,8 @@
    /* Is there any exceptional events? */
    if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue))
    mask |= POLLERR;
    + if (sk->sk_shutdown & RCV_SHUTDOWN)
    + mask |= POLLRDHUP;
    if (sk->sk_shutdown == SHUTDOWN_MASK)
    mask |= POLLHUP;

    diff -Nru linux-2.6.15/net/unix/af_unix.c linux-2.6.15.mod/net/unix/af_unix.c
    --- linux-2.6.15/net/unix/af_unix.c 2006-03-07 12:24:26.000000000 -0800
    +++ linux-2.6.15.mod/net/unix/af_unix.c 2006-03-07 12:25:08.000000000 -0800
    @@ -1878,6 +1878,8 @@
    mask |= POLLERR;
    if (sk->sk_shutdown == SHUTDOWN_MASK)
    mask |= POLLHUP;
    + if (sk->sk_shutdown & RCV_SHUTDOWN)
    + mask |= POLLRDHUP;

    /* readable? */
    if (!skb_queue_empty(&sk->sk_receive_queue) ||--- epoll.h.orig 2006-03-07 12:30:57.000000000 -0800
    +++ epoll.h 2006-03-07 13:25:03.000000000 -0800
    @@ -45,6 +45,8 @@
    #define EPOLLERR EPOLLERR
    EPOLLHUP = 0x010,
    #define EPOLLHUP EPOLLHUP
    + EPOLLRDHUP = 0x2000,
    +#define EPOLLRDHUP EPOLLRDHUP
    EPOLLONESHOT = (1 << 30),
    #define EPOLLONESHOT EPOLLONESHOT
    EPOLLET = (1 << 31)
    \
     
     \ /
      Last update: 2006-03-07 22:33    [W:0.042 / U:119.064 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site