]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
SDP - Bug829: poll() always returns POLLOUT on non-blocking socket
authorJim Mott <jim@mellanox.com>
Fri, 4 Jan 2008 20:32:48 +0000 (12:32 -0800)
committerMukesh Kacker <mukesh.kacker@oracle.com>
Tue, 6 Oct 2015 12:04:14 +0000 (05:04 -0700)
Signed-off-by: Jim Mott <jim@mellanox.com>
drivers/infiniband/ulp/sdp/sdp_main.c

index 686ce5a28f88d2ab9a201e730720642299850fdc..2263faf77271c8fa33eaa0b54021e03dfd5e660d 100644 (file)
@@ -2032,17 +2032,27 @@ static inline unsigned int sdp_listen_poll(const struct sock *sk)
 static unsigned int sdp_poll(struct file *file, struct socket *socket,
                             struct poll_table_struct *wait)
 {
-       int mask;
+       unsigned int     mask;
+       struct sock     *sk  = socket->sk;
+       struct sdp_sock *ssk = sdp_sk(sk);
+
        sdp_dbg_data(socket->sk, "%s\n", __func__);
 
        mask = datagram_poll(file, socket, wait);
+
+       /*
+        * Adjust for memory in later kernels
+        */
+       if (!sk_stream_memory_free(sk) || !slots_free(ssk))
+               mask &= ~(POLLOUT | POLLWRNORM | POLLWRBAND);
+
        /* TODO: Slightly ugly: it would be nicer if there was function
         * like datagram_poll that didn't include poll_wait,
         * then we could reverse the order. */
-       if (socket->sk->sk_state == TCP_LISTEN)
-               return sdp_listen_poll(socket->sk);
+       if (sk->sk_state == TCP_LISTEN)
+               return sdp_listen_poll(sk);
 
-       if (sdp_sk(socket->sk)->urg_data & TCP_URG_VALID)
+       if (ssk->urg_data & TCP_URG_VALID)
                mask |= POLLPRI;
        return mask;
 }