|
@@ -42,7 +42,7 @@ static int netback_remove(struct xenbus_device *dev)
|
|
if (be->vif) {
|
|
if (be->vif) {
|
|
kobject_uevent(&dev->dev.kobj, KOBJ_OFFLINE);
|
|
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;
|
|
}
|
|
}
|
|
kfree(be);
|
|
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:
|
|
case XenbusStateConnected:
|
|
if (dev->state == XenbusStateConnected)
|
|
if (dev->state == XenbusStateConnected)
|
|
break;
|
|
break;
|
|
- backend_create_xenvif(be);
|
|
|
|
if (be->vif)
|
|
if (be->vif)
|
|
connect(be);
|
|
connect(be);
|
|
break;
|
|
break;
|
|
|
|
|
|
case XenbusStateClosing:
|
|
case XenbusStateClosing:
|
|
- if (be->vif)
|
|
|
|
- kobject_uevent(&dev->dev.kobj, KOBJ_OFFLINE);
|
|
|
|
disconnect_backend(dev);
|
|
disconnect_backend(dev);
|
|
xenbus_switch_state(dev, XenbusStateClosing);
|
|
xenbus_switch_state(dev, XenbusStateClosing);
|
|
break;
|
|
break;
|
|
@@ -262,6 +268,7 @@ static void frontend_changed(struct xenbus_device *dev,
|
|
xenbus_switch_state(dev, XenbusStateClosed);
|
|
xenbus_switch_state(dev, XenbusStateClosed);
|
|
if (xenbus_dev_is_online(dev))
|
|
if (xenbus_dev_is_online(dev))
|
|
break;
|
|
break;
|
|
|
|
+ destroy_backend(dev);
|
|
/* fall through if not online */
|
|
/* fall through if not online */
|
|
case XenbusStateUnknown:
|
|
case XenbusStateUnknown:
|
|
device_unregister(&dev->dev);
|
|
device_unregister(&dev->dev);
|