mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
[NET] front: 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
Signed-off-by: Gerd Hoffmann <kraxel@suse.de>
This commit is contained in:
1 parent
d96c9af4a3
commit
02980865d0
1 file changed
+35
-25
@@ -193,6 +193,7 @@ static void netfront_closing(struct xenbus_device *);
|
||||
|
||||
static 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(struct xenbus_device *dev,
|
||||
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_receiver, struct xenbus_device *dev)
|
||||
SET_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:
|
||||
@@ -1967,6 +1957,26 @@ static int __devexit netfront_remove(struct xenbus_device *dev)
|
||||
}
|
||||
|
||||
|
||||
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)
|
||||
{
|
||||
del_timer_sync(&info->rx_refill_timer);
|
||||
|
||||