Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > 340e01248478ba8b78a6d4d1809b1eff > files > 792

kvm-83-270.el5_11.src.rpm

From 3deb03367990ac2f4fc41a6786d6a7f491603904 Mon Sep 17 00:00:00 2001
From: Kevin Wolf <kwolf@redhat.com>
Date: Wed, 27 Jan 2010 17:46:45 -0200
Subject: [PATCH 2/2] virtio-blk: Handle bdrv_aio_read/write NULL return

RH-Author: Kevin Wolf <kwolf@redhat.com>
Message-id: <1264614405-21152-3-git-send-email-kwolf@redhat.com>
Patchwork-id: 6724
O-Subject: [PATCH 2/2] virtio-blk: Handle bdrv_aio_read/write NULL return
Bugzilla: 552487
RH-Acked-by: Christoph Hellwig <chellwig@redhat.com>
RH-Acked-by: Gleb Natapov <gleb@redhat.com>

The return value of bdrv_aio_read/write is currently ignored, so if it fails
right away instead of calling the callback with an error return later, we're
missing errors. They should be handled like any other I/O errors.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
 qemu/hw/virtio-blk.c |   19 ++++++++++++++++---
 1 files changed, 16 insertions(+), 3 deletions(-)

Signed-off-by: Glauber Costa <glommer@redhat.com>
---
 qemu/hw/virtio-blk.c |   19 ++++++++++++++++---
 1 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/qemu/hw/virtio-blk.c b/qemu/hw/virtio-blk.c
index 55e8bdd..8d3e295 100644
--- a/qemu/hw/virtio-blk.c
+++ b/qemu/hw/virtio-blk.c
@@ -148,6 +148,8 @@ static void virtio_blk_handle_flush(VirtIOBlockReq *req)
 
 static int virtio_blk_handle_write(VirtIOBlockReq *req)
 {
+    BlockDriverAIOCB *acb;
+
     if (!req->buffer) {
         size_t offset = 0;
         int i;
@@ -176,13 +178,19 @@ static int virtio_blk_handle_write(VirtIOBlockReq *req)
         }
     }
 
-    bdrv_aio_write(req->dev->bs, req->out->sector, req->buffer, req->size / 512,
-            virtio_blk_rw_complete, req);
+    acb = bdrv_aio_write(req->dev->bs, req->out->sector, req->buffer,
+        req->size / 512, virtio_blk_rw_complete, req);
+
+    if (acb == NULL) {
+        virtio_blk_rw_complete(req, -EIO);
+    }
+
     return 0;
 }
 
 static int virtio_blk_handle_read(VirtIOBlockReq *req)
 {
+    BlockDriverAIOCB *acb;
     int i;
 
     for (i = 0; i < req->elem.in_num - 1; i++)
@@ -194,11 +202,16 @@ static int virtio_blk_handle_read(VirtIOBlockReq *req)
         return -1;
     }
 
-    bdrv_aio_read(req->dev->bs, req->out->sector,
+    acb = bdrv_aio_read(req->dev->bs, req->out->sector,
                   req->buffer,
                   req->size / 512,
                   virtio_blk_rw_complete,
                   req);
+
+    if (acb == NULL) {
+        virtio_blk_rw_complete(req, -EIO);
+    }
+
     return 0;
 }
 
-- 
1.6.5.2