From: kfraser@dhcp93.uk.xensource.com Date: Tue, 13 Jun 2006 14:13:29 +0000 (+0100) Subject: [LINUX] Fix blkfront driver to check connection status to backend in X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~15955^2~20^2 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=ade82aac45e5636d9408016ee0316d9a26c5ddef;p=xen.git [LINUX] Fix blkfront driver to check connection status to backend in all critical circumstances. Signed-off-by: Keir Fraser --- diff --git a/linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c b/linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c index 433d7389fe..bb71828909 100644 --- a/linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c +++ b/linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c @@ -407,7 +407,8 @@ static void blkif_restart_queue(void *arg) { struct blkfront_info *info = (struct blkfront_info *)arg; spin_lock_irq(&blkif_io_lock); - kick_pending_request_queues(info); + if (info->connected == BLKIF_STATE_CONNECTED) + kick_pending_request_queues(info); spin_unlock_irq(&blkif_io_lock); } @@ -595,7 +596,8 @@ void do_blkif_request(request_queue_t *rq) continue; } - if (RING_FULL(&info->ring)) + if (unlikely(info->connected != BLKIF_STATE_CONNECTED) || + RING_FULL(&info->ring)) goto wait; DPRINTK("do_blk_req %p: cmd %p, sec %lx, " @@ -768,17 +770,17 @@ static void blkif_recover(struct blkfront_info *info) (void)xenbus_switch_state(info->xbdev, XenbusStateConnected); - /* Now safe for us to use the shared ring */ spin_lock_irq(&blkif_io_lock); + + /* Now safe for us to use the shared ring */ info->connected = BLKIF_STATE_CONNECTED; - spin_unlock_irq(&blkif_io_lock); /* Send off requeued requests */ flush_requests(info); /* Kick any other new requests queued since we resumed */ - spin_lock_irq(&blkif_io_lock); kick_pending_request_queues(info); + spin_unlock_irq(&blkif_io_lock); }