diff options
-rw-r--r-- | net/unix/af_unix.c | 13 |
1 files changed, 3 insertions, 10 deletions
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 45aebd966978..a4631477cedf 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c | |||
@@ -2256,14 +2256,7 @@ static int unix_stream_read_generic(struct unix_stream_read_state *state) | |||
2256 | /* Lock the socket to prevent queue disordering | 2256 | /* Lock the socket to prevent queue disordering |
2257 | * while sleeps in memcpy_tomsg | 2257 | * while sleeps in memcpy_tomsg |
2258 | */ | 2258 | */ |
2259 | err = mutex_lock_interruptible(&u->readlock); | 2259 | mutex_lock(&u->readlock); |
2260 | if (unlikely(err)) { | ||
2261 | /* recvmsg() in non blocking mode is supposed to return -EAGAIN | ||
2262 | * sk_rcvtimeo is not honored by mutex_lock_interruptible() | ||
2263 | */ | ||
2264 | err = noblock ? -EAGAIN : -ERESTARTSYS; | ||
2265 | goto out; | ||
2266 | } | ||
2267 | 2260 | ||
2268 | if (flags & MSG_PEEK) | 2261 | if (flags & MSG_PEEK) |
2269 | skip = sk_peek_offset(sk, flags); | 2262 | skip = sk_peek_offset(sk, flags); |
@@ -2307,12 +2300,12 @@ again: | |||
2307 | timeo = unix_stream_data_wait(sk, timeo, last, | 2300 | timeo = unix_stream_data_wait(sk, timeo, last, |
2308 | last_len); | 2301 | last_len); |
2309 | 2302 | ||
2310 | if (signal_pending(current) || | 2303 | if (signal_pending(current)) { |
2311 | mutex_lock_interruptible(&u->readlock)) { | ||
2312 | err = sock_intr_errno(timeo); | 2304 | err = sock_intr_errno(timeo); |
2313 | goto out; | 2305 | goto out; |
2314 | } | 2306 | } |
2315 | 2307 | ||
2308 | mutex_lock(&u->readlock); | ||
2316 | continue; | 2309 | continue; |
2317 | unlock: | 2310 | unlock: |
2318 | unix_state_unlock(sk); | 2311 | unix_state_unlock(sk); |