From: t_jeang Date: Tue, 6 Jan 2009 12:06:01 +0000 (+0000) Subject: imported patch CA-12483-fix-forced-shutdown-race X-Git-Tag: CA-9002-blktap-plug X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=46f4f3637f790befa40abcaedde67c116c2cf306;p=xenclient%2Fkernel.git imported patch CA-12483-fix-forced-shutdown-race --- diff --git a/drivers/xen/blktap/backdev.c b/drivers/xen/blktap/backdev.c index 3ebed59f..1bdcfded 100644 --- a/drivers/xen/blktap/backdev.c +++ b/drivers/xen/blktap/backdev.c @@ -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; }