aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/block/virtio_blk.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c
index 53b81d59059b..0bdde8fba397 100644
--- a/drivers/block/virtio_blk.c
+++ b/drivers/block/virtio_blk.c
@@ -274,15 +274,18 @@ static void virtblk_done(struct virtqueue *vq)
274 unsigned int len; 274 unsigned int len;
275 275
276 spin_lock_irqsave(vblk->disk->queue->queue_lock, flags); 276 spin_lock_irqsave(vblk->disk->queue->queue_lock, flags);
277 while ((vbr = virtqueue_get_buf(vblk->vq, &len)) != NULL) { 277 do {
278 if (vbr->bio) { 278 virtqueue_disable_cb(vq);
279 virtblk_bio_done(vbr); 279 while ((vbr = virtqueue_get_buf(vblk->vq, &len)) != NULL) {
280 bio_done = true; 280 if (vbr->bio) {
281 } else { 281 virtblk_bio_done(vbr);
282 virtblk_request_done(vbr); 282 bio_done = true;
283 req_done = true; 283 } else {
284 virtblk_request_done(vbr);
285 req_done = true;
286 }
284 } 287 }
285 } 288 } while (!virtqueue_enable_cb(vq));
286 /* In case queue is stopped waiting for more buffers. */ 289 /* In case queue is stopped waiting for more buffers. */
287 if (req_done) 290 if (req_done)
288 blk_start_queue(vblk->disk->queue); 291 blk_start_queue(vblk->disk->queue);