Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756907AbXENP7S (ORCPT ); Mon, 14 May 2007 11:59:18 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1754833AbXENP7D (ORCPT ); Mon, 14 May 2007 11:59:03 -0400 Received: from smtp.linux-foundation.org ([207.189.120.12]:58099 "EHLO smtp.osdl.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754286AbXENP7A (ORCPT ); Mon, 14 May 2007 11:59:00 -0400 Date: Mon, 14 May 2007 08:58:40 -0700 From: Stephen Hemminger To: Kenji Kaneshige , "David S. Miller" Cc: netdev@vger.kernel.org, linux-kernel , Andrew Morton Subject: [PATCH] Fix race condition about network device name allocation Message-ID: <20070514085840.17a343f7@freepuppy> In-Reply-To: <1179130660.3881.23.camel@kane-linux> References: <1178862045.3979.33.camel@kane-linux> <20070511092519.1f34ab34@freepuppy> <1179130660.3881.23.camel@kane-linux> Organization: Linux Foundation X-Mailer: Sylpheed-Claws 2.6.0 (GTK+ 2.10.11; x86_64-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2392 Lines: 75 Kenji Kaneshige found this race between device removal and registration. On unregister it is possible for the old device to exist, because sysfs file is still open. A new device with 'eth%d' will select the same name, but sysfs kobject register will fial. The following changes the shutdown order slightly. It hold a removes the sysfs entries earlier (on unregister_netdevice), but holds a kobject reference. Then when todo runs the actual last put free happens. Signed-off-by: Stephen Hemminger --- net/core/dev.c | 10 ++++++---- net/core/net-sysfs.c | 8 +++++++- 2 files changed, 13 insertions(+), 5 deletions(-) --- 2.6.21-rc1.orig/net/core/dev.c 2007-05-11 11:02:55.000000000 -0700 +++ 2.6.21-rc1/net/core/dev.c 2007-05-14 08:44:52.000000000 -0700 @@ -3245,7 +3245,6 @@ void netdev_run_todo(void) continue; } - netdev_unregister_sysfs(dev); dev->reg_state = NETREG_UNREGISTERED; netdev_wait_allrefs(dev); @@ -3256,11 +3255,11 @@ void netdev_run_todo(void) BUG_TRAP(!dev->ip6_ptr); BUG_TRAP(!dev->dn_ptr); - /* It must be the very last action, - * after this 'dev' may point to freed up memory. - */ if (dev->destructor) dev->destructor(dev); + + /* Free network device */ + kobject_put(&dev->dev.kobj); } out: @@ -3411,6 +3410,9 @@ void unregister_netdevice(struct net_dev /* Notifier chain MUST detach us from master device. */ BUG_TRAP(!dev->master); + /* Remove entries from sysfs */ + netdev_unregister_sysfs(dev); + /* Finish processing unregister after unlock */ net_set_todo(dev); --- 2.6.21-rc1.orig/net/core/net-sysfs.c 2007-05-11 11:02:55.000000000 -0700 +++ 2.6.21-rc1/net/core/net-sysfs.c 2007-05-14 08:44:52.000000000 -0700 @@ -456,9 +456,15 @@ static struct class net_class = { #endif }; +/* Delete sysfs entries but hold kobject reference until after all + * netdev references are gone. + */ void netdev_unregister_sysfs(struct net_device * net) { - device_del(&(net->dev)); + struct device *dev = &(net->dev); + + kobject_get(&dev->kobj); + device_del(dev); } /* Create sysfs entries for network device. */ - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/