]> xenbits.xensource.com Git - xenclient/kernel.git/commitdiff
imported patch CA-12483-fix-forced-shutdown-race CA-9002-blktap-plug
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)
drivers/xen/blktap/backdev.c

index 3ebed59f8d591f4b1b8cf87accf9ba03c81b387b..1bdcfded095277ed4739b810df5d55a28861342f 100644 (file)
@@ -96,6 +96,7 @@ destroy_backdev(struct tap_blkif *uinfo)
        spin_lock_irq(&backdev_io_lock);
        /* No more blkif_request(). */
        blk_stop_queue(info->gd->queue);
+       uinfo->backdev = NULL;
        spin_unlock_irq(&backdev_io_lock);
 
        del_gendisk(info->gd);
@@ -108,7 +109,6 @@ destroy_backdev(struct tap_blkif *uinfo)
 
        blkif_put(uinfo->blkif);
 
-       uinfo->backdev = NULL;
        kfree(info);
 
        clear_bit(4, &uinfo->dev_inuse);
@@ -505,19 +505,22 @@ backdev_restart_queue(struct tap_blkif *uinfo)
 {
        struct backdev_info *info;
 
+       spin_lock_irq(&backdev_io_lock);
+
        info = uinfo->backdev;
        if (info == NULL || info->gd == NULL || info->gd->queue == NULL)
-               return;
+               goto out;
 
        if (!RING_FULL(&uinfo->ufe_ring)) {
-               spin_lock_irq(&backdev_io_lock);
                /* Re-enable calldowns. */
                if (blk_queue_stopped(info->gd->queue))
                        blk_start_queue(info->gd->queue);
                /* Kick things off immediately. */
                process_backdev_request(uinfo, info);
-               spin_unlock_irq(&backdev_io_lock);
        }
+
+out:
+       spin_unlock_irq(&backdev_io_lock);
        return;
 }