From patchwork Mon Dec 17 13:01:11 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Vitaly E. Lavrov" X-Patchwork-Id: 206853 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 7A4F12C00A6 for ; Tue, 18 Dec 2012 00:01:19 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752751Ab2LQNBP (ORCPT ); Mon, 17 Dec 2012 08:01:15 -0500 Received: from mx1.guap.ru ([91.151.188.3]:32491 "EHLO mx1.guap.ru" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752535Ab2LQNBN (ORCPT ); Mon, 17 Dec 2012 08:01:13 -0500 Received: from [10.52.210.96] (cdr.local [10.52.210.96]) (user=lve mech=CRAM-MD5 bits=0) by mail.guap.ru (8.14.4/8.14.4) with ESMTP id qBHD1Bnx020321 for ; Mon, 17 Dec 2012 17:01:11 +0400 X-DKIM: OpenDKIM Filter v2.4.1 mail.guap.ru qBHD1Bnx020321 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=guap.ru; s=default; t=1355749271; bh=fTjvCd8Nuyl7wXA4U2m1Pylx2kwhn14aqo6PLvTutos=; h=Message-ID:Date:From:MIME-Version:To:Subject:Content-Type: Content-Transfer-Encoding; z=Message-ID:=20<50CF1797.803@guap.ru>|Date:=20Mon,=2017=20Dec=2020 12=2017:01:11=20+0400|From:=20"V.=20Lavrov"=20|MIME-V ersion:=201.0|To:=20netdev@vger.kernel.org|Subject:=20[PATCH]=20bu gfix:=20network=20namespace=20&=20device=20dummy|Content-Type:=20t ext/plain=3B=20charset=3DKOI8-R=3B=20format=3Dflowed|Content-Trans fer-Encoding:=207bit; b=xAFQoFihio2tRxzaSqp4tpXbSKJRSBPeGoZSVGDBhaPNUDzTZ0yFjj/zbvpEaQDP/ MvcQcMI9mu5bkGK8hg34OAwZU2Hchu6fUJRbDmT2NQMcwOabssAFoSMMBPLnM+swei CnXqBaAuAmlqT0ibgu0plo5ywQq0x0r3sngkv2jg= DomainKey-Signature: a=rsa-sha1; s=default; d=guap.ru; c=nofws; q=dns; b=kr/oiPDy92tQaQNraiwXMHL5FMVWspuXEQRYS0WcHm7wl6KJodBgRguU79g1mBxp3 KqzIbA+U4xb6Hz81Ht9R+r7Zq54bhCMT2GUANFkQlHAjubHZ8ZZtuWiqxMy5RPZiPTE 1HOGi3QOtKFqQVW8Lxg7Mt+Oa6e7Ufhao0FCZFs= Message-ID: <50CF1797.803@guap.ru> Date: Mon, 17 Dec 2012 17:01:11 +0400 From: "V. Lavrov" User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: netdev@vger.kernel.org Subject: [PATCH] bugfix: network namespace & device dummy Received-SPF: pass X-Relay-score: -100 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org If container has a network device dummyX (with lxc.network.type = phys), then it disappears from the system after you close the container. The patch returns the device dummyX to the initial network namespace after container is closed. Signed-off-by: Vitaly Lavrov --- -- -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/net/dummy.c b/drivers/net/dummy.c index bab0158..efa990c 100644 --- a/drivers/net/dummy.c +++ b/drivers/net/dummy.c @@ -160,6 +160,41 @@ static struct rtnl_link_ops dummy_link_ops __read_mostly = { module_param(numdummies, int, 0); MODULE_PARM_DESC(numdummies, "Number of dummy pseudo devices"); + +static void __net_exit dummy_net_exit(struct net *net) { + struct net_device *dev, *aux; + int err; + + if(net == &init_net) return; + + rtnl_lock(); + for_each_netdev_safe(net, dev, aux) { + if(dev->rtnl_link_ops == &dummy_link_ops) { + err = dev_change_net_namespace(dev, &init_net, dev->name); + if(err) { + char fb_name[IFNAMSIZ]; + printk (KERN_INFO "%s: dev_change_net_namespace(init_net,%s) err: %d\n", + __func__,dev->name,err); + snprintf(fb_name, IFNAMSIZ, "dev%d", dev->ifindex); + err = dev_change_net_namespace(dev, &init_net, dev->name); + if(err) + printk (KERN_INFO "%s: dev_change_net_namespace(%s,init_net,%s) err: %d\n", + __func__,dev->name,fb_name,err); + else + printk (KERN_INFO "%s: %s rename to %s\n", + __func__,dev->name,fb_name); + + } + } + } + rtnl_unlock(); +} + +static struct pernet_operations __net_initdata dummy_net_ops = { + .exit = dummy_net_exit, +}; + + static int __init dummy_init_one(void) { struct net_device *dev_dummy; @@ -184,6 +219,10 @@ static int __init dummy_init_module(void) { int i, err = 0; + err = register_pernet_device(&dummy_net_ops); + if(err) + return err; + rtnl_lock(); err = __rtnl_link_register(&dummy_link_ops); @@ -191,8 +230,10 @@ static int __init dummy_init_module(void) err = dummy_init_one(); cond_resched(); } - if (err < 0) + if (err < 0) { __rtnl_link_unregister(&dummy_link_ops); + unregister_pernet_device(&dummy_net_ops); + } rtnl_unlock(); return err; @@ -201,6 +242,7 @@ static int __init dummy_init_module(void) static void __exit dummy_cleanup_module(void) { rtnl_link_unregister(&dummy_link_ops); + unregister_pernet_device(&dummy_net_ops); } module_init(dummy_init_module);