diff options
Diffstat (limited to 'net/unix/af_unix.c')
-rw-r--r-- | net/unix/af_unix.c | 37 |
1 files changed, 14 insertions, 23 deletions
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 8309687a56b0..2358f2690ec5 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c | |||
@@ -2199,7 +2199,8 @@ out: | |||
2199 | * Sleep until more data has arrived. But check for races.. | 2199 | * Sleep until more data has arrived. But check for races.. |
2200 | */ | 2200 | */ |
2201 | static long unix_stream_data_wait(struct sock *sk, long timeo, | 2201 | static long unix_stream_data_wait(struct sock *sk, long timeo, |
2202 | struct sk_buff *last, unsigned int last_len) | 2202 | struct sk_buff *last, unsigned int last_len, |
2203 | bool freezable) | ||
2203 | { | 2204 | { |
2204 | struct sk_buff *tail; | 2205 | struct sk_buff *tail; |
2205 | DEFINE_WAIT(wait); | 2206 | DEFINE_WAIT(wait); |
@@ -2220,7 +2221,10 @@ static long unix_stream_data_wait(struct sock *sk, long timeo, | |||
2220 | 2221 | ||
2221 | sk_set_bit(SOCKWQ_ASYNC_WAITDATA, sk); | 2222 | sk_set_bit(SOCKWQ_ASYNC_WAITDATA, sk); |
2222 | unix_state_unlock(sk); | 2223 | unix_state_unlock(sk); |
2223 | timeo = freezable_schedule_timeout(timeo); | 2224 | if (freezable) |
2225 | timeo = freezable_schedule_timeout(timeo); | ||
2226 | else | ||
2227 | timeo = schedule_timeout(timeo); | ||
2224 | unix_state_lock(sk); | 2228 | unix_state_lock(sk); |
2225 | 2229 | ||
2226 | if (sock_flag(sk, SOCK_DEAD)) | 2230 | if (sock_flag(sk, SOCK_DEAD)) |
@@ -2250,7 +2254,8 @@ struct unix_stream_read_state { | |||
2250 | unsigned int splice_flags; | 2254 | unsigned int splice_flags; |
2251 | }; | 2255 | }; |
2252 | 2256 | ||
2253 | static int unix_stream_read_generic(struct unix_stream_read_state *state) | 2257 | static int unix_stream_read_generic(struct unix_stream_read_state *state, |
2258 | bool freezable) | ||
2254 | { | 2259 | { |
2255 | struct scm_cookie scm; | 2260 | struct scm_cookie scm; |
2256 | struct socket *sock = state->socket; | 2261 | struct socket *sock = state->socket; |
@@ -2330,7 +2335,7 @@ again: | |||
2330 | mutex_unlock(&u->iolock); | 2335 | mutex_unlock(&u->iolock); |
2331 | 2336 | ||
2332 | timeo = unix_stream_data_wait(sk, timeo, last, | 2337 | timeo = unix_stream_data_wait(sk, timeo, last, |
2333 | last_len); | 2338 | last_len, freezable); |
2334 | 2339 | ||
2335 | if (signal_pending(current)) { | 2340 | if (signal_pending(current)) { |
2336 | err = sock_intr_errno(timeo); | 2341 | err = sock_intr_errno(timeo); |
@@ -2472,21 +2477,7 @@ static int unix_stream_recvmsg(struct socket *sock, struct msghdr *msg, | |||
2472 | .flags = flags | 2477 | .flags = flags |
2473 | }; | 2478 | }; |
2474 | 2479 | ||
2475 | return unix_stream_read_generic(&state); | 2480 | return unix_stream_read_generic(&state, true); |
2476 | } | ||
2477 | |||
2478 | static ssize_t skb_unix_socket_splice(struct sock *sk, | ||
2479 | struct pipe_inode_info *pipe, | ||
2480 | struct splice_pipe_desc *spd) | ||
2481 | { | ||
2482 | int ret; | ||
2483 | struct unix_sock *u = unix_sk(sk); | ||
2484 | |||
2485 | mutex_unlock(&u->iolock); | ||
2486 | ret = splice_to_pipe(pipe, spd); | ||
2487 | mutex_lock(&u->iolock); | ||
2488 | |||
2489 | return ret; | ||
2490 | } | 2481 | } |
2491 | 2482 | ||
2492 | static int unix_stream_splice_actor(struct sk_buff *skb, | 2483 | static int unix_stream_splice_actor(struct sk_buff *skb, |
@@ -2495,8 +2486,7 @@ static int unix_stream_splice_actor(struct sk_buff *skb, | |||
2495 | { | 2486 | { |
2496 | return skb_splice_bits(skb, state->socket->sk, | 2487 | return skb_splice_bits(skb, state->socket->sk, |
2497 | UNIXCB(skb).consumed + skip, | 2488 | UNIXCB(skb).consumed + skip, |
2498 | state->pipe, chunk, state->splice_flags, | 2489 | state->pipe, chunk, state->splice_flags); |
2499 | skb_unix_socket_splice); | ||
2500 | } | 2490 | } |
2501 | 2491 | ||
2502 | static ssize_t unix_stream_splice_read(struct socket *sock, loff_t *ppos, | 2492 | static ssize_t unix_stream_splice_read(struct socket *sock, loff_t *ppos, |
@@ -2518,7 +2508,7 @@ static ssize_t unix_stream_splice_read(struct socket *sock, loff_t *ppos, | |||
2518 | flags & SPLICE_F_NONBLOCK) | 2508 | flags & SPLICE_F_NONBLOCK) |
2519 | state.flags = MSG_DONTWAIT; | 2509 | state.flags = MSG_DONTWAIT; |
2520 | 2510 | ||
2521 | return unix_stream_read_generic(&state); | 2511 | return unix_stream_read_generic(&state, false); |
2522 | } | 2512 | } |
2523 | 2513 | ||
2524 | static int unix_shutdown(struct socket *sock, int mode) | 2514 | static int unix_shutdown(struct socket *sock, int mode) |
@@ -2827,7 +2817,8 @@ static int unix_seq_show(struct seq_file *seq, void *v) | |||
2827 | i++; | 2817 | i++; |
2828 | } | 2818 | } |
2829 | for ( ; i < len; i++) | 2819 | for ( ; i < len; i++) |
2830 | seq_putc(seq, u->addr->name->sun_path[i]); | 2820 | seq_putc(seq, u->addr->name->sun_path[i] ?: |
2821 | '@'); | ||
2831 | } | 2822 | } |
2832 | unix_state_unlock(s); | 2823 | unix_state_unlock(s); |
2833 | seq_putc(seq, '\n'); | 2824 | seq_putc(seq, '\n'); |