From patchwork Wed Mar 1 19:35:08 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnaldo Carvalho de Melo X-Patchwork-Id: 734377 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3vYTWR2KPSz9s7q for ; Thu, 2 Mar 2017 08:45:07 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=infradead.org header.i=@infradead.org header.b="mubwFEmZ"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753312AbdCAVo2 (ORCPT ); Wed, 1 Mar 2017 16:44:28 -0500 Received: from merlin.infradead.org ([205.233.59.134]:46826 "EHLO merlin.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753140AbdCAVo0 (ORCPT ); Wed, 1 Mar 2017 16:44:26 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=merlin.20170209; h=References:In-Reply-To:Message-Id:Date: Subject:Cc:To:From:Sender:Reply-To:MIME-Version:Content-Type: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id: List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=CZU1sOha2ILTcmHWWmMM4lk7aZx+bYYnpdpIgsec5vk=; b=mubwFEmZhTfDuYT5BgTzWG2NF QhT9TrLLzqF/c1upNoUL83WlT3gRl0cCerg+2CmDswpKediWaJOPSkw+TM/J1dBZGQrxuhHfCNz3h GhVSyOJ5nG38QYFS4qpi84cPTNRhF1V4Nxul+yTbINKpree1ANE/PeaTxVM6H7RwrHDC57/tkEgPF ki0lYL49yn+jljs7v711WZw62KXqf3JvAHUqnSMNzXg+D1yeks+PKnWZtMTF0n8MreCvs1nMHrQGS djShEfp6aC47TeKY954SLnmC3meRxDJI7b+ymxpyk9ufp6GE9ZaZH1e9YNjA9mn1hQK0yhx66bV1F +rk5wNyPQ==; Received: from [179.97.44.90] (helo=jouet.infradead.org) by merlin.infradead.org with esmtpsa (Exim 4.87 #1 (Red Hat Linux)) id 1cjA1q-0002r6-D6; Wed, 01 Mar 2017 19:35:15 +0000 Received: by jouet.infradead.org (Postfix, from userid 1000) id D86C4140264; Wed, 1 Mar 2017 16:35:09 -0300 (BRT) From: Arnaldo Carvalho de Melo To: "David S . Miller" Cc: netdev@vger.kernel.org, Arnaldo Carvalho de Melo , Cong Wang , Dmitry Vyukov , Eric Dumazet , Gerrit Renker , Thomas Gleixner Subject: [PATCH 2/2] net: Introduce sk_clone_lock() error path routine Date: Wed, 1 Mar 2017 16:35:08 -0300 Message-Id: <20170301193508.25760-2-acme@kernel.org> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20170301193508.25760-1-acme@kernel.org> References: <20170301193508.25760-1-acme@kernel.org> X-SRS-Rewrite: SMTP reverse-path rewritten from by merlin.infradead.org. See http://www.infradead.org/rpr.html Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Arnaldo Carvalho de Melo When handling problems in cloning a socket with the sk_clone_locked() function we need to perform several steps that were open coded in it and its callers, so introduce a routine to avoid this duplication: sk_free_unlock_clone(). Cc: Cong Wang Cc: Dmitry Vyukov Cc: Eric Dumazet Cc: Gerrit Renker Cc: Thomas Gleixner Link: http://lkml.kernel.org/n/net-ui6laqkotycunhtmqryl9bfx@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo --- include/net/sock.h | 1 + net/core/sock.c | 16 +++++++++++----- net/dccp/minisocks.c | 6 +----- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/include/net/sock.h b/include/net/sock.h index c4f5e6fca17c..93d1160bcd32 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -1520,6 +1520,7 @@ struct sock *sk_alloc(struct net *net, int family, gfp_t priority, void sk_free(struct sock *sk); void sk_destruct(struct sock *sk); struct sock *sk_clone_lock(const struct sock *sk, const gfp_t priority); +void sk_free_unlock_clone(struct sock *sk); struct sk_buff *sock_wmalloc(struct sock *sk, unsigned long size, int force, gfp_t priority); diff --git a/net/core/sock.c b/net/core/sock.c index 4eca27dc5c94..a3d9bb20f65d 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -1540,11 +1540,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; } @@ -1593,6 +1589,16 @@ struct sock *sk_clone_lock(const struct sock *sk, const gfp_t priority) } 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; diff --git a/net/dccp/minisocks.c b/net/dccp/minisocks.c index d20d948a98ed..e267e6f4c9a5 100644 --- a/net/dccp/minisocks.c +++ b/net/dccp/minisocks.c @@ -119,11 +119,7 @@ struct sock *dccp_create_openreq_child(const struct sock *sk, * Activate features: initialise CCIDs, sequence windows etc. */ if (dccp_feat_activate_values(newsk, &dreq->dreq_featneg)) { - /* 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); return NULL; } dccp_init_xmit_timers(newsk);