]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - net/ipv4/tcp.c
[PATCH] POLLRDHUP/EPOLLRDHUP handling for half-closed devices notifications
[linux-2.6-omap-h63xx.git] / net / ipv4 / tcp.c
index 31b0123a96993f74bd555a19af37e91c6e69eddf..19ea5c0b094bcb47ba180907a290a7d75d5a0f71 100644 (file)
@@ -365,7 +365,7 @@ unsigned int tcp_poll(struct file *file, struct socket *sock, poll_table *wait)
        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)) {
@@ -1879,21 +1879,16 @@ int tcp_setsockopt(struct sock *sk, int level, int optname, char __user *optval,
 }
 
 #ifdef CONFIG_COMPAT
-int compat_tcp_setsockopt(struct sock *sk, int level,
-               int optname, char __user *optval, int optlen)
+int compat_tcp_setsockopt(struct sock *sk, int level, int optname,
+                         char __user *optval, int optlen)
 {
-       struct inet_connection_sock *icsk = inet_csk(sk);
-
-       if (level != SOL_TCP) {
-               if (icsk->icsk_af_ops->compat_setsockopt)
-                       return icsk->icsk_af_ops->compat_setsockopt(sk,
-                               level, optname, optval, optlen);
-               else
-                       return icsk->icsk_af_ops->setsockopt(sk,
-                               level, optname, optval, optlen);
-       }
+       if (level != SOL_TCP)
+               return inet_csk_compat_setsockopt(sk, level, optname,
+                                                 optval, optlen);
        return do_tcp_setsockopt(sk, level, optname, optval, optlen);
 }
+
+EXPORT_SYMBOL(compat_tcp_setsockopt);
 #endif
 
 /* Return information about state of tcp endpoint in API format. */
@@ -2058,21 +2053,16 @@ int tcp_getsockopt(struct sock *sk, int level, int optname, char __user *optval,
 }
 
 #ifdef CONFIG_COMPAT
-int compat_tcp_getsockopt(struct sock *sk, int level,
-               int optname, char __user *optval, int __user *optlen)
+int compat_tcp_getsockopt(struct sock *sk, int level, int optname,
+                         char __user *optval, int __user *optlen)
 {
-       struct inet_connection_sock *icsk = inet_csk(sk);
-
-       if (level != SOL_TCP) {
-               if (icsk->icsk_af_ops->compat_getsockopt)
-                       return icsk->icsk_af_ops->compat_getsockopt(sk,
-                               level, optname, optval, optlen);
-               else
-                       return icsk->icsk_af_ops->getsockopt(sk,
-                               level, optname, optval, optlen);
-       }
+       if (level != SOL_TCP)
+               return inet_csk_compat_getsockopt(sk, level, optname,
+                                                 optval, optlen);
        return do_tcp_getsockopt(sk, level, optname, optval, optlen);
 }
+
+EXPORT_SYMBOL(compat_tcp_getsockopt);
 #endif
 
 extern void __skb_cb_too_small_for_tcp(int, int);
@@ -2191,7 +2181,3 @@ EXPORT_SYMBOL(tcp_sendpage);
 EXPORT_SYMBOL(tcp_setsockopt);
 EXPORT_SYMBOL(tcp_shutdown);
 EXPORT_SYMBOL(tcp_statistics);
-#ifdef CONFIG_COMPAT
-EXPORT_SYMBOL(compat_tcp_setsockopt);
-EXPORT_SYMBOL(compat_tcp_getsockopt);
-#endif