|
@@ -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
|