{
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);
}
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, "
(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);
}