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 145082e2ba36..2358f2690ec5 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c @@ -2199,7 +2199,8 @@ out:   *	Sleep until more data has arrived. But check for races..   */  static long unix_stream_data_wait(struct sock *sk, long timeo, -				  struct sk_buff *last, unsigned int last_len) +				  struct sk_buff *last, unsigned int last_len, +				  bool freezable)  {  	struct sk_buff *tail;  	DEFINE_WAIT(wait); @@ -2220,7 +2221,10 @@ static long unix_stream_data_wait(struct sock *sk, long timeo,  		sk_set_bit(SOCKWQ_ASYNC_WAITDATA, sk);  		unix_state_unlock(sk); -		timeo = freezable_schedule_timeout(timeo); +		if (freezable) +			timeo = freezable_schedule_timeout(timeo); +		else +			timeo = schedule_timeout(timeo);  		unix_state_lock(sk);  		if (sock_flag(sk, SOCK_DEAD)) @@ -2250,7 +2254,8 @@ struct unix_stream_read_state {  	unsigned int splice_flags;  }; -static int unix_stream_read_generic(struct unix_stream_read_state *state) +static int unix_stream_read_generic(struct unix_stream_read_state *state, +				    bool freezable)  {  	struct scm_cookie scm;  	struct socket *sock = state->socket; @@ -2330,7 +2335,7 @@ again:  			mutex_unlock(&u->iolock);  			timeo = unix_stream_data_wait(sk, timeo, last, -						      last_len); +						      last_len, freezable);  			if (signal_pending(current)) {  				err = sock_intr_errno(timeo); @@ -2472,7 +2477,7 @@ static int unix_stream_recvmsg(struct socket *sock, struct msghdr *msg,  		.flags = flags  	}; -	return unix_stream_read_generic(&state); +	return unix_stream_read_generic(&state, true);  }  static int unix_stream_splice_actor(struct sk_buff *skb, @@ -2503,7 +2508,7 @@ static ssize_t unix_stream_splice_read(struct socket *sock,  loff_t *ppos,  	    flags & SPLICE_F_NONBLOCK)  		state.flags = MSG_DONTWAIT; -	return unix_stream_read_generic(&state); +	return unix_stream_read_generic(&state, false);  }  static int unix_shutdown(struct socket *sock, int mode) @@ -2812,7 +2817,8 @@ static int unix_seq_show(struct seq_file *seq, void *v)  				i++;  			}  			for ( ; i < len; i++) -				seq_putc(seq, u->addr->name->sun_path[i]); +				seq_putc(seq, u->addr->name->sun_path[i] ?: +					 '@');  		}  		unix_state_unlock(s);  		seq_putc(seq, '\n');  | 
