projects
/
cascardo
/
linux.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ip: generate unique IP identificator if local fragmentation is allowed
[cascardo/linux.git]
/
drivers
/
net
/
xen-netback
/
xenbus.c
diff --git
a/drivers/net/xen-netback/xenbus.c
b/drivers/net/xen-netback/xenbus.c
index
1fe48fe
..
a53782e
100644
(file)
--- a/
drivers/net/xen-netback/xenbus.c
+++ b/
drivers/net/xen-netback/xenbus.c
@@
-42,7
+42,7
@@
static int netback_remove(struct xenbus_device *dev)
if (be->vif) {
kobject_uevent(&dev->dev.kobj, KOBJ_OFFLINE);
xenbus_rm(XBT_NIL, dev->nodename, "hotplug-status");
if (be->vif) {
kobject_uevent(&dev->dev.kobj, KOBJ_OFFLINE);
xenbus_rm(XBT_NIL, dev->nodename, "hotplug-status");
- xenvif_
disconnect
(be->vif);
+ xenvif_
free
(be->vif);
be->vif = NULL;
}
kfree(be);
be->vif = NULL;
}
kfree(be);
@@
-213,9
+213,18
@@
static void disconnect_backend(struct xenbus_device *dev)
{
struct backend_info *be = dev_get_drvdata(&dev->dev);
{
struct backend_info *be = dev_get_drvdata(&dev->dev);
+ if (be->vif)
+ xenvif_disconnect(be->vif);
+}
+
+static void destroy_backend(struct xenbus_device *dev)
+{
+ struct backend_info *be = dev_get_drvdata(&dev->dev);
+
if (be->vif) {
if (be->vif) {
+ kobject_uevent(&dev->dev.kobj, KOBJ_OFFLINE);
xenbus_rm(XBT_NIL, dev->nodename, "hotplug-status");
xenbus_rm(XBT_NIL, dev->nodename, "hotplug-status");
- xenvif_
disconnect
(be->vif);
+ xenvif_
free
(be->vif);
be->vif = NULL;
}
}
be->vif = NULL;
}
}
@@
-246,14
+255,11
@@
static void frontend_changed(struct xenbus_device *dev,
case XenbusStateConnected:
if (dev->state == XenbusStateConnected)
break;
case XenbusStateConnected:
if (dev->state == XenbusStateConnected)
break;
- backend_create_xenvif(be);
if (be->vif)
connect(be);
break;
case XenbusStateClosing:
if (be->vif)
connect(be);
break;
case XenbusStateClosing:
- if (be->vif)
- kobject_uevent(&dev->dev.kobj, KOBJ_OFFLINE);
disconnect_backend(dev);
xenbus_switch_state(dev, XenbusStateClosing);
break;
disconnect_backend(dev);
xenbus_switch_state(dev, XenbusStateClosing);
break;
@@
-262,6
+268,7
@@
static void frontend_changed(struct xenbus_device *dev,
xenbus_switch_state(dev, XenbusStateClosed);
if (xenbus_dev_is_online(dev))
break;
xenbus_switch_state(dev, XenbusStateClosed);
if (xenbus_dev_is_online(dev))
break;
+ destroy_backend(dev);
/* fall through if not online */
case XenbusStateUnknown:
device_unregister(&dev->dev);
/* fall through if not online */
case XenbusStateUnknown:
device_unregister(&dev->dev);