]> xenbits.xensource.com Git - xenclient/kernel.git/commitdiff
Wakeup blktap thread once frontend is connected -- in case there are blktap-shutdown-cleanup2
authort_jeang <devnull@localhost>
Tue, 6 Jan 2009 12:06:01 +0000 (12:06 +0000)
committert_jeang <devnull@localhost>
Tue, 6 Jan 2009 12:06:01 +0000 (12:06 +0000)
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 4b8b5ba6fc0e2b559244779f27edbc302fdec9be..1652edf9d41cd519e7bda9e0f4378d8c573968eb 100644 (file)
@@ -282,7 +282,7 @@ static int end_block_io_op(struct bio *bio, unsigned int done, 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 663bfeefd56c68b3e71b972d800a9540d1689e55..425d8cd6ee25e6ab0e72b85e74682c8f8243b540 100644 (file)
@@ -133,6 +133,8 @@ void blkif_xenbus_init(void);
 irqreturn_t blkif_be_int(int irq, void *dev_id, struct pt_regs *regs);
 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 ece7d84f005e4633e1d1160d27fbfc91e15b5603..9d95137f11c347ddb1385274ff05dedcaa581324 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 512c4563bb84e6cd297d93495be5c1d6531be693..6d014083803e2a07b6512d54a73d9abfd6537182 100644 (file)
@@ -1013,7 +1013,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);
@@ -1021,7 +1021,7 @@ static void blkif_notify_work(blkif_t *blkif)
 
 irqreturn_t tap_blkif_be_int(int irq, void *dev_id, struct pt_regs *regs)
 {
-       blkif_notify_work(dev_id);
+       tap_blkif_notify_work(dev_id);
        return IRQ_HANDLED;
 }
 
@@ -1360,7 +1360,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 87c6ea2ebd55bf1c5e7a2c48ff58df5a7a451935..e1c304ba98ad1c0c104da5e9ad6ae11aa427cadb 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 e2761383c514bc8462046ffb3f03b2ac718002df..0ab00f80e1b66121dab06f332d5e180b906222bf 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: