fix netfront race
PATCH 1/1 fix netfront race
Hi,
this patch moves register_netdev() + sysfs attribute registering from create_netdev() into the new open_netdev() function. open_netdev is called as very last thing in netdev_probe.
This closes at least one initialization race: uninitialized mac address is visible for a short time in /sys/class/net/${if}/address
please apply,
Gerd
Signature · 2 lines
Gerd Hoffmann <[email protected]> http://www.suse.de/~kraxel/julika-dora.jpeg
move register_netdev() + sysfs attribute registering from create_netdev() into the new open_netdev() function. open_netdev is called as very last thing in netdev_probe.
This closes at least one initialization race: uninitialized mac address is visible for a short time in /sys/class/net/${if}/address
linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c +35 -25
@@ -193,6 +193,7 @@ static void netfront_closing(struct xenbstatic void end_access (int ,void *);static void netif_disconnect_backend (struct netfront_info *); +static int open_netdev (struct netfront_info *);static void close_netdev (struct netfront_info *);static void netif_free (struct netfront_info *);
@@ -263,15 +264,22 @@ static int __devinit netfront_probe(stru dev->dev.driver_data = info; err =talk_to_backend (dev, info); -if (err) { -xennet_sysfs_delif (info->netdev); -unregister_netdev (netdev); -free_netdev (netdev); - dev->dev.driver_data =NULL ; -return err; - } +if (err) + goto fail_backend; + + err =open_netdev (info); +if (err) + goto fail_open;return 0 ; + + fail_open: +xennet_sysfs_delif (info->netdev); +unregister_netdev (netdev); + fail_backend: +free_netdev (netdev); + dev->dev.driver_data =NULL ; +return err; }
@@ -1887,27 +1895,9 @@ create_netdev(int handle, int copying_reSET_MODULE_OWNER (netdev);SET_NETDEV_DEV (netdev, &dev->dev); - err =register_netdev (netdev); -if (err) { -printk (KERN_WARNING "%s> register_netdev err=%d\n" , - __FUNCTION__, err); - goto exit_free_rx; - } - - err =xennet_sysfs_addif (netdev); -if (err) { -/* This can be non-fatal: it only means no tuning parameters */ -printk (KERN_WARNING "%s> add sysfs failed err=%d\n" , - __FUNCTION__, err); - } - np->netdev = netdev; -return netdev; - - exit_free_rx: -gnttab_free_grant_references (np->gref_rx_head); exit_free_tx:gnttab_free_grant_references (np->gref_tx_head); exit:
@@ -1966,6 +1955,26 @@ static int __devexit netfront_remove(strreturn 0 ; } + +static int open_netdev (struct netfront_info *info) +{ +int err; + + err =register_netdev (info->netdev); +if (err) { +printk (KERN_WARNING "%s: register_netdev err=%d\n" , + __FUNCTION__, err); +return err; + } + + err =xennet_sysfs_addif (info->netdev); +if (err) { +/* This can be non-fatal: it only means no tuning parameters */ +printk (KERN_WARNING "%s: add sysfs failed err=%d\n" , + __FUNCTION__, err); + } +return 0 ; +}static void close_netdev (struct netfront_info *info) {
_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xensource.com/xen-devel