diff options
Diffstat (limited to 'net/ipv4/inet_connection_sock.c')
| -rw-r--r-- | net/ipv4/inet_connection_sock.c | 17 | 
1 files changed, 13 insertions, 4 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  |