diff options
| author | Rafael J. Wysocki <rjw@sisk.pl> | 2012-02-13 16:20:07 +0100 | 
|---|---|---|
| committer | Rafael J. Wysocki <rjw@sisk.pl> | 2012-02-13 16:20:07 +0100 | 
| commit | 654b0c9627bc1b34cc21643afa8ac359c50db7d7 (patch) | |
| tree | f25069e2987e6d61793585adf969f42f9380afcd /net/unix/af_unix.c | |
| parent | d031e1de2c5ba91e67ed83f6adf624543ab2b03d (diff) | |
| parent | d020283dc694c9ec31b410f522252f7a8397e67d (diff) | |
Merge commit 'pm-fixes-for-3.3-rc3' into pm-qos
New material in the pm-qos branch depends on recent power management
fixes.
Diffstat (limited to 'net/unix/af_unix.c')
| -rw-r--r-- | net/unix/af_unix.c | 19 | 
1 files changed, 4 insertions, 15 deletions
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index aad8fb699989..85d3bb7490aa 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c @@ -1918,7 +1918,7 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock,  		struct sk_buff *skb;  		unix_state_lock(sk); -		skb = skb_dequeue(&sk->sk_receive_queue); +		skb = skb_peek(&sk->sk_receive_queue);  		if (skb == NULL) {  			unix_sk(sk)->recursion_level = 0;  			if (copied >= target) @@ -1958,11 +1958,8 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock,  		if (check_creds) {  			/* Never glue messages from different writers */  			if ((UNIXCB(skb).pid  != siocb->scm->pid) || -			    (UNIXCB(skb).cred != siocb->scm->cred)) { -				skb_queue_head(&sk->sk_receive_queue, skb); -				sk->sk_data_ready(sk, skb->len); +			    (UNIXCB(skb).cred != siocb->scm->cred))  				break; -			}  		} else {  			/* Copy credentials */  			scm_set_cred(siocb->scm, UNIXCB(skb).pid, UNIXCB(skb).cred); @@ -1977,8 +1974,6 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock,  		chunk = min_t(unsigned int, skb->len, size);  		if (memcpy_toiovec(msg->msg_iov, skb->data, chunk)) { -			skb_queue_head(&sk->sk_receive_queue, skb); -			sk->sk_data_ready(sk, skb->len);  			if (copied == 0)  				copied = -EFAULT;  			break; @@ -1993,13 +1988,10 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock,  			if (UNIXCB(skb).fp)  				unix_detach_fds(siocb->scm, skb); -			/* put the skb back if we didn't use it up.. */ -			if (skb->len) { -				skb_queue_head(&sk->sk_receive_queue, skb); -				sk->sk_data_ready(sk, skb->len); +			if (skb->len)  				break; -			} +			skb_unlink(skb, &sk->sk_receive_queue);  			consume_skb(skb);  			if (siocb->scm->fp) @@ -2010,9 +2002,6 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock,  			if (UNIXCB(skb).fp)  				siocb->scm->fp = scm_fp_dup(UNIXCB(skb).fp); -			/* put message back and return */ -			skb_queue_head(&sk->sk_receive_queue, skb); -			sk->sk_data_ready(sk, skb->len);  			break;  		}  	} while (size);  | 
