]> xenbits.xensource.com Git - people/ssmith/nc2-2.6.27.git/commitdiff
patch CA-12483-fix-forced-shutdown-race
authorSteven Smith <ssmith@weybridge.uk.xensource.com>
Tue, 30 Jun 2009 11:55:47 +0000 (12:55 +0100)
committerSteven Smith <ssmith@weybridge.uk.xensource.com>
Tue, 30 Jun 2009 11:55:47 +0000 (12:55 +0100)
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;
 }