diff options
Diffstat (limited to 'net/unix/af_unix.c')
| -rw-r--r-- | net/unix/af_unix.c | 36 | 
1 files changed, 18 insertions, 18 deletions
| diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 2268e679812..dd419d28620 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c @@ -316,7 +316,8 @@ static void unix_write_space(struct sock *sk)  	if (unix_writable(sk)) {  		wq = rcu_dereference(sk->sk_wq);  		if (wq_has_sleeper(wq)) -			wake_up_interruptible_sync(&wq->wait); +			wake_up_interruptible_sync_poll(&wq->wait, +				POLLOUT | POLLWRNORM | POLLWRBAND);  		sk_wake_async(sk, SOCK_WAKE_SPACE, POLL_OUT);  	}  	rcu_read_unlock(); @@ -1156,7 +1157,7 @@ restart:  		goto restart;  	} -	err = security_unix_stream_connect(sock, other->sk_socket, newsk); +	err = security_unix_stream_connect(sk, other, newsk);  	if (err) {  		unix_state_unlock(sk);  		goto out_unlock; @@ -1736,7 +1737,8 @@ static int unix_dgram_recvmsg(struct kiocb *iocb, struct socket *sock,  		goto out_unlock;  	} -	wake_up_interruptible_sync(&u->peer_wait); +	wake_up_interruptible_sync_poll(&u->peer_wait, +					POLLOUT | POLLWRNORM | POLLWRBAND);  	if (msg->msg_name)  		unix_copy_addr(msg, skb->sk); @@ -2099,13 +2101,12 @@ static unsigned int unix_dgram_poll(struct file *file, struct socket *sock,  	if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue))  		mask |= POLLERR;  	if (sk->sk_shutdown & RCV_SHUTDOWN) -		mask |= POLLRDHUP; +		mask |= POLLRDHUP | POLLIN | POLLRDNORM;  	if (sk->sk_shutdown == SHUTDOWN_MASK)  		mask |= POLLHUP;  	/* readable? */ -	if (!skb_queue_empty(&sk->sk_receive_queue) || -	    (sk->sk_shutdown & RCV_SHUTDOWN)) +	if (!skb_queue_empty(&sk->sk_receive_queue))  		mask |= POLLIN | POLLRDNORM;  	/* Connection-based need to check for termination and startup */ @@ -2117,20 +2118,19 @@ static unsigned int unix_dgram_poll(struct file *file, struct socket *sock,  			return mask;  	} -	/* writable? */ -	writable = unix_writable(sk); -	if (writable) { -		other = unix_peer_get(sk); -		if (other) { -			if (unix_peer(other) != sk) { -				sock_poll_wait(file, &unix_sk(other)->peer_wait, -					  wait); -				if (unix_recvq_full(other)) -					writable = 0; -			} +	/* No write status requested, avoid expensive OUT tests. */ +	if (wait && !(wait->key & (POLLWRBAND | POLLWRNORM | POLLOUT))) +		return mask; -			sock_put(other); +	writable = unix_writable(sk); +	other = unix_peer_get(sk); +	if (other) { +		if (unix_peer(other) != sk) { +			sock_poll_wait(file, &unix_sk(other)->peer_wait, wait); +			if (unix_recvq_full(other)) +				writable = 0;  		} +		sock_put(other);  	}  	if (writable) | 
