Fix race in device resume path - need to ensure we add the watch only
authorshand@chelmsford.uk.xensource.com <shand@chelmsford.uk.xensource.com>
Mon, 12 Jun 2006 16:56:20 +0000 (17:56 +0100)
committershand@chelmsford.uk.xensource.com <shand@chelmsford.uk.xensource.com>
Mon, 12 Jun 2006 16:56:20 +0000 (17:56 +0100)
after the device-specific resume code has run. Also removed some unused /
usless code from netfront.c.

Signed-off-by: Steven Hand <steven@xensource.com>
linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c

index 6a026774d442488808a37c740c4362cb2d87eabe..b0fc28d04c211653e152b968ad1fb265abff8c39 100644 (file)
@@ -157,8 +157,6 @@ static void netif_disconnect_backend(struct netfront_info *);
 static void close_netdev(struct netfront_info *);
 static void netif_free(struct netfront_info *);
 
-static void show_device(struct netfront_info *);
-
 static void network_connect(struct net_device *);
 static void network_tx_buf_gc(struct net_device *);
 static void network_alloc_rx_buffers(struct net_device *);
@@ -411,7 +409,6 @@ static void backend_changed(struct xenbus_device *dev,
                network_connect(netdev);
                xenbus_switch_state(dev, XenbusStateConnected);
                (void)send_fake_arp(netdev);
-               show_device(np);
                break;
 
        case XenbusStateClosing:
@@ -605,7 +602,7 @@ static void network_alloc_rx_buffers(struct net_device *dev)
                np->grant_rx_ref[id] = ref;
                gnttab_grant_foreign_transfer_ref(ref,
                                                  np->xbdev->otherend_id,
-                                                 __pa(skb->head) >> PAGE_SHIFT);
+                                                 __pa(skb->head)>>PAGE_SHIFT);
                RING_GET_REQUEST(&np->rx, req_prod + i)->gref = ref;
                np->rx_pfn_array[i] = virt_to_mfn(skb->head);
 
@@ -1166,22 +1163,6 @@ static void network_connect(struct net_device *dev)
        spin_unlock_irq(&np->tx_lock);
 }
 
-static void show_device(struct netfront_info *np)
-{
-#ifdef DEBUG
-       if (np) {
-               IPRINTK("<vif handle=%u %s(%s) evtchn=%u tx=%p rx=%p>\n",
-                       np->handle,
-                       netif_carrier_ok(np->netdev) ? "on" : "off",
-                       netif_running(np->netdev) ? "open" : "closed",
-                       np->evtchn,
-                       np->tx,
-                       np->rx);
-       } else
-               IPRINTK("<vif NULL>\n");
-#endif
-}
-
 static void netif_uninit(struct net_device *dev)
 {
        struct netfront_info *np = netdev_priv(dev);
index b03957e983cc078233c89b54b13e603290b45622..3bef9b3084ff37778b8ca556eb0761b21187c6a3 100644 (file)
@@ -806,6 +806,7 @@ static int resume_dev(struct device *dev, void *data)
 
        if (dev->driver == NULL)
                return 0;
+
        drv = to_xenbus_driver(dev->driver);
        xdev = container_of(dev, struct xenbus_device, dev);
 
@@ -816,6 +817,18 @@ static int resume_dev(struct device *dev, void *data)
                       dev->bus_id, err);
                return err;
        }
+        
+       xdev->state = XenbusStateInitialising;
+        
+       if (drv->resume) {
+               err = drv->resume(xdev);
+                if (err) { 
+                        printk(KERN_WARNING
+                               "xenbus: resume %s failed: %i\n", 
+                               dev->bus_id, err);
+                        return err; 
+                }
+        }
 
        err = watch_otherend(xdev);
        if (err) {
@@ -825,14 +838,7 @@ static int resume_dev(struct device *dev, void *data)
                return err;
        }
 
-       xdev->state = XenbusStateInitialising;
-
-       if (drv->resume)
-               err = drv->resume(xdev);
-       if (err)
-               printk(KERN_WARNING
-                      "xenbus: resume %s failed: %i\n", dev->bus_id, err);
-       return err;
+       return 0; 
 }
 
 void xenbus_suspend(void)