|
@@ -2256,14 +2256,7 @@ static int unix_stream_read_generic(struct unix_stream_read_state *state)
|
|
|
/* Lock the socket to prevent queue disordering
|
|
/* Lock the socket to prevent queue disordering
|
|
|
* while sleeps in memcpy_tomsg
|
|
* while sleeps in memcpy_tomsg
|
|
|
*/
|
|
*/
|
|
|
- err = mutex_lock_interruptible(&u->readlock);
|
|
|
|
|
- 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;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ mutex_lock(&u->readlock);
|
|
|
|
|
|
|
|
if (flags & MSG_PEEK)
|
|
if (flags & MSG_PEEK)
|
|
|
skip = sk_peek_offset(sk, flags);
|
|
skip = sk_peek_offset(sk, flags);
|
|
@@ -2307,12 +2300,12 @@ again:
|
|
|
timeo = unix_stream_data_wait(sk, timeo, last,
|
|
timeo = unix_stream_data_wait(sk, timeo, last,
|
|
|
last_len);
|
|
last_len);
|
|
|
|
|
|
|
|
- if (signal_pending(current) ||
|
|
|
|
|
- mutex_lock_interruptible(&u->readlock)) {
|
|
|
|
|
|
|
+ if (signal_pending(current)) {
|
|
|
err = sock_intr_errno(timeo);
|
|
err = sock_intr_errno(timeo);
|
|
|
goto out;
|
|
goto out;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ mutex_lock(&u->readlock);
|
|
|
continue;
|
|
continue;
|
|
|
unlock:
|
|
unlock:
|
|
|
unix_state_unlock(sk);
|
|
unix_state_unlock(sk);
|