|
@@ -1539,11 +1539,7 @@ struct sock *sk_clone_lock(const struct sock *sk, const gfp_t priority)
|
|
|
is_charged = sk_filter_charge(newsk, filter);
|
|
|
|
|
|
if (unlikely(!is_charged || xfrm_sk_clone_policy(newsk, sk))) {
|
|
|
- /* It is still raw copy of parent, so invalidate
|
|
|
- * destructor and make plain sk_free() */
|
|
|
- newsk->sk_destruct = NULL;
|
|
|
- bh_unlock_sock(newsk);
|
|
|
- sk_free(newsk);
|
|
|
+ sk_free_unlock_clone(newsk);
|
|
|
newsk = NULL;
|
|
|
goto out;
|
|
|
}
|
|
@@ -1592,6 +1588,16 @@ out:
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(sk_clone_lock);
|
|
|
|
|
|
+void sk_free_unlock_clone(struct sock *sk)
|
|
|
+{
|
|
|
+ /* It is still raw copy of parent, so invalidate
|
|
|
+ * destructor and make plain sk_free() */
|
|
|
+ sk->sk_destruct = NULL;
|
|
|
+ bh_unlock_sock(sk);
|
|
|
+ sk_free(sk);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(sk_free_unlock_clone);
|
|
|
+
|
|
|
void sk_setup_caps(struct sock *sk, struct dst_entry *dst)
|
|
|
{
|
|
|
u32 max_segs = 1;
|