]> xenbits.xensource.com Git - xenclient/kernel.git/commitdiff
imported patch disconnect-netback-on-close netback-tcp-and-ip-in-different-fragments
authort_jeang <devnull@localhost>
Tue, 6 Jan 2009 12:06:02 +0000 (12:06 +0000)
committert_jeang <devnull@localhost>
Tue, 6 Jan 2009 12:06:02 +0000 (12:06 +0000)
drivers/xen/netback/xenbus.c

index 774da6dfba17961b26ddadfb16cd6026c1a76ac0..668fecf15e3d21e2c20664673e356251760aee93 100644 (file)
@@ -225,6 +225,16 @@ static void backend_create_netif(struct backend_info *be)
 }
 
 
+static void disconnect_backend(struct xenbus_device *dev)
+{
+       struct backend_info *be = dev->dev.driver_data;
+
+       if (be->netif) {
+               netif_disconnect(be->netif);
+               be->netif = NULL;
+       }
+}
+
 /**
  * Callback received when the frontend's state changes.
  */
@@ -242,6 +252,7 @@ static void frontend_changed(struct xenbus_device *dev,
                if (dev->state == XenbusStateClosed) {
                        printk(KERN_INFO "%s: %s: prepare for reconnect\n",
                               __FUNCTION__, dev->nodename);
+                       disconnect_backend(dev);
                        xenbus_switch_state(dev, XenbusStateInitWait);
                }
                break;
@@ -258,11 +269,9 @@ static void frontend_changed(struct xenbus_device *dev,
                break;
 
        case XenbusStateClosing:
-               if (be->netif) {
+               if (be->netif)
                        kobject_uevent(&dev->dev.kobj, KOBJ_OFFLINE);
-                       netif_disconnect(be->netif);
-                       be->netif = NULL;
-               }
+               disconnect_backend(dev);
                xenbus_switch_state(dev, XenbusStateClosing);
                break;