diff options
Diffstat (limited to 'net/unix/af_unix.c')
| -rw-r--r-- | net/unix/af_unix.c | 20 | 
1 files changed, 13 insertions, 7 deletions
| diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 29fc8bee9702..94404f19f9de 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c @@ -163,9 +163,8 @@ static inline void unix_set_secdata(struct scm_cookie *scm, struct sk_buff *skb)  static inline unsigned int unix_hash_fold(__wsum n)  { -	unsigned int hash = (__force unsigned int)n; +	unsigned int hash = (__force unsigned int)csum_fold(n); -	hash ^= hash>>16;  	hash ^= hash>>8;  	return hash&(UNIX_HASH_SIZE-1);  } @@ -1788,8 +1787,11 @@ static int unix_dgram_recvmsg(struct kiocb *iocb, struct socket *sock,  		goto out;  	err = mutex_lock_interruptible(&u->readlock); -	if (err) { -		err = sock_intr_errno(sock_rcvtimeo(sk, noblock)); +	if (unlikely(err)) { +		/* recvmsg() in non blocking mode is supposed to return -EAGAIN +		 * sk_rcvtimeo is not honored by mutex_lock_interruptible() +		 */ +		err = noblock ? -EAGAIN : -ERESTARTSYS;  		goto out;  	} @@ -1914,6 +1916,7 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock,  	struct unix_sock *u = unix_sk(sk);  	DECLARE_SOCKADDR(struct sockaddr_un *, sunaddr, msg->msg_name);  	int copied = 0; +	int noblock = flags & MSG_DONTWAIT;  	int check_creds = 0;  	int target;  	int err = 0; @@ -1929,7 +1932,7 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock,  		goto out;  	target = sock_rcvlowat(sk, flags&MSG_WAITALL, size); -	timeo = sock_rcvtimeo(sk, flags&MSG_DONTWAIT); +	timeo = sock_rcvtimeo(sk, noblock);  	/* Lock the socket to prevent queue disordering  	 * while sleeps in memcpy_tomsg @@ -1941,8 +1944,11 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock,  	}  	err = mutex_lock_interruptible(&u->readlock); -	if (err) { -		err = sock_intr_errno(timeo); +	if (unlikely(err)) { +		/* recvmsg() in non blocking mode is supposed to return -EAGAIN +		 * sk_rcvtimeo is not honored by mutex_lock_interruptible() +		 */ +		err = noblock ? -EAGAIN : -ERESTARTSYS;  		goto out;  	} | 
