diff options
Diffstat (limited to 'net/unix/af_unix.c')
| -rw-r--r-- | net/unix/af_unix.c | 19 | 
1 files changed, 14 insertions, 5 deletions
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index dd419d286204..ba5b8c208498 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c @@ -850,7 +850,7 @@ static int unix_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)  		 * Get the parent directory, calculate the hash for last  		 * component.  		 */ -		err = path_lookup(sunaddr->sun_path, LOOKUP_PARENT, &nd); +		err = kern_path_parent(sunaddr->sun_path, &nd);  		if (err)  			goto out_mknod_parent; @@ -1724,7 +1724,11 @@ static int unix_dgram_recvmsg(struct kiocb *iocb, struct socket *sock,  	msg->msg_namelen = 0; -	mutex_lock(&u->readlock); +	err = mutex_lock_interruptible(&u->readlock); +	if (err) { +		err = sock_intr_errno(sock_rcvtimeo(sk, noblock)); +		goto out; +	}  	skb = skb_recv_datagram(sk, flags, noblock, &err);  	if (!skb) { @@ -1864,7 +1868,11 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock,  		memset(&tmp_scm, 0, sizeof(tmp_scm));  	} -	mutex_lock(&u->readlock); +	err = mutex_lock_interruptible(&u->readlock); +	if (err) { +		err = sock_intr_errno(timeo); +		goto out; +	}  	do {  		int chunk; @@ -1895,11 +1903,12 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock,  			timeo = unix_stream_data_wait(sk, timeo); -			if (signal_pending(current)) { +			if (signal_pending(current) +			    ||  mutex_lock_interruptible(&u->readlock)) {  				err = sock_intr_errno(timeo);  				goto out;  			} -			mutex_lock(&u->readlock); +  			continue;   unlock:  			unix_state_unlock(sk);  | 
