diff options
Diffstat (limited to 'net/core/sock.c')
| -rw-r--r-- | net/core/sock.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/net/core/sock.c b/net/core/sock.c index 08f16db46070..193901d09757 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
| @@ -1497,7 +1497,8 @@ struct sock *sk_clone_lock(const struct sock *sk, const gfp_t priority) | |||
| 1497 | sock_copy(newsk, sk); | 1497 | sock_copy(newsk, sk); |
| 1498 | 1498 | ||
| 1499 | /* SANITY */ | 1499 | /* SANITY */ |
| 1500 | get_net(sock_net(newsk)); | 1500 | if (likely(newsk->sk_net_refcnt)) |
| 1501 | get_net(sock_net(newsk)); | ||
| 1501 | sk_node_init(&newsk->sk_node); | 1502 | sk_node_init(&newsk->sk_node); |
| 1502 | sock_lock_init(newsk); | 1503 | sock_lock_init(newsk); |
| 1503 | bh_lock_sock(newsk); | 1504 | bh_lock_sock(newsk); |
| @@ -1967,20 +1968,21 @@ static void __release_sock(struct sock *sk) | |||
| 1967 | * sk_wait_data - wait for data to arrive at sk_receive_queue | 1968 | * sk_wait_data - wait for data to arrive at sk_receive_queue |
| 1968 | * @sk: sock to wait on | 1969 | * @sk: sock to wait on |
| 1969 | * @timeo: for how long | 1970 | * @timeo: for how long |
| 1971 | * @skb: last skb seen on sk_receive_queue | ||
| 1970 | * | 1972 | * |
| 1971 | * Now socket state including sk->sk_err is changed only under lock, | 1973 | * Now socket state including sk->sk_err is changed only under lock, |
| 1972 | * hence we may omit checks after joining wait queue. | 1974 | * hence we may omit checks after joining wait queue. |
| 1973 | * We check receive queue before schedule() only as optimization; | 1975 | * We check receive queue before schedule() only as optimization; |
| 1974 | * it is very likely that release_sock() added new data. | 1976 | * it is very likely that release_sock() added new data. |
| 1975 | */ | 1977 | */ |
| 1976 | int sk_wait_data(struct sock *sk, long *timeo) | 1978 | int sk_wait_data(struct sock *sk, long *timeo, const struct sk_buff *skb) |
| 1977 | { | 1979 | { |
| 1978 | int rc; | 1980 | int rc; |
| 1979 | DEFINE_WAIT(wait); | 1981 | DEFINE_WAIT(wait); |
| 1980 | 1982 | ||
| 1981 | prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); | 1983 | prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); |
| 1982 | set_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags); | 1984 | set_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags); |
| 1983 | rc = sk_wait_event(sk, timeo, !skb_queue_empty(&sk->sk_receive_queue)); | 1985 | rc = sk_wait_event(sk, timeo, skb_peek_tail(&sk->sk_receive_queue) != skb); |
| 1984 | clear_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags); | 1986 | clear_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags); |
| 1985 | finish_wait(sk_sleep(sk), &wait); | 1987 | finish_wait(sk_sleep(sk), &wait); |
| 1986 | return rc; | 1988 | return rc; |
