]> xenbits.xensource.com Git - people/ssmith/nc2-2.6.27.bak/.git/commitdiff
Wakeup blktap thread once frontend is connected -- in case there are
authorSteven Smith <ssmith@weybridge.uk.xensource.com>
Thu, 28 May 2009 10:54:19 +0000 (11:54 +0100)
committerSteven Smith <ssmith@weybridge.uk.xensource.com>
Thu, 28 May 2009 10:54:19 +0000 (11:54 +0100)
already pending requests.  Do same for blkback.

drivers/xen/blkback/blkback.c
drivers/xen/blkback/common.h
drivers/xen/blkback/xenbus.c
drivers/xen/blktap/blktap.c
drivers/xen/blktap/common.h
drivers/xen/blktap/xenbus.c

index 612f7c9b572bb8ff45679d1a9a4ffeb65b5373fb..199f643a03eb62da676f9c27a0d122db2c285610 100644 (file)
@@ -280,7 +280,7 @@ static void end_block_io_op(struct bio *bio, int error)
  * NOTIFICATION FROM GUEST OS.
  */
 
-static void blkif_notify_work(blkif_t *blkif)
+void blkif_notify_work(blkif_t *blkif)
 {
        blkif->waiting_reqs = 1;
        wake_up(&blkif->wq);
index 751399b4d25f34e674d31b0a90c029dab1f229ba..e0756474de926fb5a07fbc2a9486465808692a22 100644 (file)
@@ -133,6 +133,8 @@ void blkif_xenbus_init(void);
 irqreturn_t blkif_be_int(int irq, void *dev_id);
 int blkif_schedule(void *arg);
 
+void blkif_notify_work(blkif_t *blkif);
+
 int blkback_barrier(struct xenbus_transaction xbt,
                    struct backend_info *be, int state);
 
index 52701e292f5ae7a0ca1169db4ef751c753318618..b0ac31e82a4d7c5392ed8cd0aec177b6d153018e 100644 (file)
@@ -375,13 +375,16 @@ static void frontend_changed(struct xenbus_device *dev,
                /* Ensure we connect even when two watches fire in 
                   close successsion and we miss the intermediate value 
                   of frontend_state. */
+               if (dev->state != XenbusStateConnected) {
+                       err = connect_ring(be);
+                       if (err)
+                               break;
+                       update_blkif_status(be->blkif);
+               }
+
                if (dev->state == XenbusStateConnected)
-                       break;
+                       blkif_notify_work(be->blkif);
 
-               err = connect_ring(be);
-               if (err)
-                       break;
-               update_blkif_status(be->blkif);
                break;
 
        case XenbusStateClosing:
index f6e6cbecffebeef0b00b8bc15f6f6ad600d9cbc0..a48e9791e7717dbed6cfc9603eb6f9ebd0250d8f 100644 (file)
@@ -1012,7 +1012,7 @@ static int blktap_read_ufe_ring(tap_blkif_t *info)
  * NOTIFICATION FROM GUEST OS.
  */
 
-static void blkif_notify_work(blkif_t *blkif)
+void tap_blkif_notify_work(blkif_t *blkif)
 {
        blkif->waiting_reqs = 1;
        wake_up(&blkif->wq);
@@ -1020,7 +1020,7 @@ static void blkif_notify_work(blkif_t *blkif)
 
 irqreturn_t tap_blkif_be_int(int irq, void *dev_id)
 {
-       blkif_notify_work(dev_id);
+       tap_blkif_notify_work(dev_id);
        return IRQ_HANDLED;
 }
 
@@ -1374,7 +1374,7 @@ static void make_response(blkif_t *blkif, u64 id,
 
        spin_unlock_irqrestore(&blkif->blk_ring_lock, flags);
        if (more_to_do)
-               blkif_notify_work(blkif);
+               tap_blkif_notify_work(blkif);
        if (notify)
                notify_remote_via_irq(blkif->irq);
 }
index 1ec1d9094ccbebb62f5e42a8d22c2a3b04d54323..779b07d46331be74001d82e71ee63d04d0af4bd6 100644 (file)
@@ -120,4 +120,6 @@ struct tap_blkif *associate_blkif(domid_t domid, int xenbus_id,
                                  blkif_t *blkif);
 void signal_tapdisk(int idx);
 
+void tap_blkif_notify_work(blkif_t *blkif);
+
 #endif /* __BLKIF__BACKEND__COMMON_H__ */
index b044c8afdf762de9dd6c74a0b10597d3a45a3812..5e824f5576785e47fbdbfad6ef36041ac2fd8f67 100644 (file)
@@ -386,13 +386,16 @@ static void tap_frontend_changed(struct xenbus_device *dev,
                /* Ensure we connect even when two watches fire in 
                   close successsion and we miss the intermediate value 
                   of frontend_state. */
+               if (dev->state != XenbusStateConnected) {
+                       err = connect_ring(be);
+                       if (err)
+                               break;
+                       tap_update_blkif_status(be->blkif);
+               }
+
                if (dev->state == XenbusStateConnected)
-                       break;
+                       tap_blkif_notify_work(be->blkif);
 
-               err = connect_ring(be);
-               if (err)
-                       break;
-               tap_update_blkif_status(be->blkif);
                break;
 
        case XenbusStateClosing: