diff options
Diffstat (limited to 'net/ipv4')
| -rw-r--r-- | net/ipv4/inet_connection_sock.c | 17 | ||||
| -rw-r--r-- | net/ipv4/tcp_minisocks.c | 2 | 
2 files changed, 14 insertions, 5 deletions
diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c index c14d88ad348..a598768c616 100644 --- a/net/ipv4/inet_connection_sock.c +++ b/net/ipv4/inet_connection_sock.c @@ -588,10 +588,19 @@ void inet_csk_reqsk_queue_prune(struct sock *parent,  }  EXPORT_SYMBOL_GPL(inet_csk_reqsk_queue_prune); -struct sock *inet_csk_clone(struct sock *sk, const struct request_sock *req, -			    const gfp_t priority) +/** + *	inet_csk_clone_lock - clone an inet socket, and lock its clone + *	@sk: the socket to clone + *	@req: request_sock + *	@priority: for allocation (%GFP_KERNEL, %GFP_ATOMIC, etc) + * + *	Caller must unlock socket even in error path (bh_unlock_sock(newsk)) + */ +struct sock *inet_csk_clone_lock(const struct sock *sk, +				 const struct request_sock *req, +				 const gfp_t priority)  { -	struct sock *newsk = sk_clone(sk, priority); +	struct sock *newsk = sk_clone_lock(sk, priority);  	if (newsk != NULL) {  		struct inet_connection_sock *newicsk = inet_csk(newsk); @@ -615,7 +624,7 @@ struct sock *inet_csk_clone(struct sock *sk, const struct request_sock *req,  	}  	return newsk;  } -EXPORT_SYMBOL_GPL(inet_csk_clone); +EXPORT_SYMBOL_GPL(inet_csk_clone_lock);  /*   * At this point, there should be no process reference to this diff --git a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c index 66363b689ad..0a7e3398c46 100644 --- a/net/ipv4/tcp_minisocks.c +++ b/net/ipv4/tcp_minisocks.c @@ -425,7 +425,7 @@ static inline void TCP_ECN_openreq_child(struct tcp_sock *tp,   */  struct sock *tcp_create_openreq_child(struct sock *sk, struct request_sock *req, struct sk_buff *skb)  { -	struct sock *newsk = inet_csk_clone(sk, req, GFP_ATOMIC); +	struct sock *newsk = inet_csk_clone_lock(sk, req, GFP_ATOMIC);  	if (newsk != NULL) {  		const struct inet_request_sock *ireq = inet_rsk(req);  |