From patchwork Sat Apr 23 22:03:32 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Francesco Ruggeri X-Patchwork-Id: 614105 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 3qsmjy5g3Gz9t0r for ; Sun, 24 Apr 2016 08:04:38 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=arista.com header.i=@arista.com header.b=c5qxfZP3; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752225AbcDWWEB (ORCPT ); Sat, 23 Apr 2016 18:04:01 -0400 Received: from prod-mx.aristanetworks.com ([162.210.130.12]:42866 "EHLO prod-mx.aristanetworks.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752113AbcDWWEA (ORCPT ); Sat, 23 Apr 2016 18:04:00 -0400 Received: from prod-mx.aristanetworks.com (localhost [127.0.0.1]) by prod-mx.aristanetworks.com (Postfix) with ESMTP id 53C961403; Sat, 23 Apr 2016 15:03:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=arista.com; s=AristaCom; t=1461449039; bh=ZogmFyiHd5Z5fAw0ZYAH3JUMiUctTmZmSlRG5awIPzI=; h=From:To:Cc:Subject:Date; b=c5qxfZP3drpl7LZ7CjPf1e/sU0BcdQuMHDbCsqlki55aMyLmNrp8wfP0zteCeSpGh xdqRECqvRKj6w5PxqrCdqGbdoUCqIFsZXherz09ZbqfvjLruavoIY3MwLL2EGUJBnP TClFPCaznJmPp80Tudta9OAT63mLCI7QzjuAo48A= Received: from fruggeri-Arora18-1.sjc.aristanetworks.com (unknown [10.95.0.201]) by prod-mx.aristanetworks.com (Postfix) with ESMTP id 4532713FF; Sat, 23 Apr 2016 15:03:59 -0700 (PDT) Received: by fruggeri-Arora18-1.sjc.aristanetworks.com (Postfix, from userid 10189) id 02671203FF3; Sat, 23 Apr 2016 15:03:58 -0700 (PDT) From: Francesco Ruggeri To: netdev@vger.kernel.org Cc: Francesco Ruggeri , "Eric W. Biederman" , "David S. Miller" , Mahesh Bandewar Subject: [PATCH net-next] macvlan: fix failure during registration v3 Date: Sat, 23 Apr 2016 15:03:32 -0700 Message-Id: <1461449012-7401-1-git-send-email-fruggeri@arista.com> X-Mailer: git-send-email 1.8.1.4 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org If macvlan_common_newlink fails in register_netdevice after macvlan_init then it decrements port->count twice, first in macvlan_uninit (from register_netdevice or rollback_registered) and then again in macvlan_common_newlink. A similar problem may exist in the ipvlan driver. This patch consolidates modifications to port->count into macvlan_init and macvlan_uninit (thanks to Eric Biederman for suggesting this approach). v3: remove macvtap specific bits. Signed-off-by: Francesco Ruggeri Acked-by: "Eric W. Biederman" --- drivers/net/macvlan.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c index 2bcf1f3..cb01023 100644 --- a/drivers/net/macvlan.c +++ b/drivers/net/macvlan.c @@ -795,6 +795,7 @@ static int macvlan_init(struct net_device *dev) { struct macvlan_dev *vlan = netdev_priv(dev); const struct net_device *lowerdev = vlan->lowerdev; + struct macvlan_port *port = vlan->port; dev->state = (dev->state & ~MACVLAN_STATE_MASK) | (lowerdev->state & MACVLAN_STATE_MASK); @@ -812,6 +813,8 @@ static int macvlan_init(struct net_device *dev) if (!vlan->pcpu_stats) return -ENOMEM; + port->count += 1; + return 0; } @@ -1312,10 +1315,9 @@ int macvlan_common_newlink(struct net *src_net, struct net_device *dev, return err; } - port->count += 1; err = register_netdevice(dev); if (err < 0) - goto destroy_port; + return err; dev->priv_flags |= IFF_MACVLAN; err = netdev_upper_dev_link(lowerdev, dev); @@ -1330,10 +1332,6 @@ int macvlan_common_newlink(struct net *src_net, struct net_device *dev, unregister_netdev: unregister_netdevice(dev); -destroy_port: - port->count -= 1; - if (!port->count) - macvlan_port_destroy(lowerdev); return err; }