]> xenbits.xensource.com Git - xen.git/commitdiff
ioemu: actually check for errors in bdrv_flush et al
authorKeir Fraser <keir.fraser@citrix.com>
Mon, 31 Mar 2008 09:35:35 +0000 (10:35 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Mon, 31 Mar 2008 09:35:35 +0000 (10:35 +0100)
bdrv_flush is declared to return void, but this is wrong because it
means that the implementations have nowhere to report their errors.
Indeed, the implementations generally ignore errors.

This patch corrects this by making it return int (implicitly, either 0
or -errno, as for other similar functions).  All of the
implementations and callers are adjusted too.

Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
tools/ioemu/block-qcow.c
tools/ioemu/block-qcow2.c
tools/ioemu/block-raw.c
tools/ioemu/block-vmdk.c
tools/ioemu/block.c
tools/ioemu/block_int.h
tools/ioemu/hw/ide.c
tools/ioemu/hw/scsi-disk.c
tools/ioemu/vl.h

index e59b600f1d86216db1c09ffa1e79f613058a2105..d7dacc75be1ffa5c4c3f0726257f52e2d0a96c7d 100644 (file)
@@ -934,10 +934,10 @@ static int qcow_write_compressed(BlockDriverState *bs, int64_t sector_num,
     return 0;
 }
 
-static void qcow_flush(BlockDriverState *bs)
+static int qcow_flush(BlockDriverState *bs)
 {
     BDRVQcowState *s = bs->opaque;
-    bdrv_flush(s->hd);
+    return bdrv_flush(s->hd);
 }
 
 static int qcow_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
index ec64448a34229ec58ce78abdea8be7b6e9f7050f..606716bdc10bbb8ebd69bb51f504ef10fdce92de 100644 (file)
@@ -1235,10 +1235,10 @@ static int qcow_write_compressed(BlockDriverState *bs, int64_t sector_num,
     return 0;
 }
 
-static void qcow_flush(BlockDriverState *bs)
+static int qcow_flush(BlockDriverState *bs)
 {
     BDRVQcowState *s = bs->opaque;
-    bdrv_flush(s->hd);
+    return bdrv_flush(s->hd);
 }
 
 static int qcow_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
index 7584aa38a0b6e934609db18285e4ee86ae005ccf..cbc049f64e7bf8c97d35ac1d3657b48065315525 100644 (file)
@@ -615,10 +615,12 @@ static int raw_create(const char *filename, int64_t total_size,
     return 0;
 }
 
-static void raw_flush(BlockDriverState *bs)
+static int raw_flush(BlockDriverState *bs)
 {
     BDRVRawState *s = bs->opaque;
-    fsync(s->fd);
+    if (fsync(s->fd))
+        return errno;
+    return 0;
 }
 
 BlockDriver bdrv_raw = {
index 0558977abcb8ede5c80e8c5d82b32542222b5b99..a8b8a35153618fcf7bcf1cb081aeaf9fb1b827e2 100644 (file)
@@ -734,10 +734,10 @@ static void vmdk_close(BlockDriverState *bs)
     vmdk_parent_close(s->hd);
 }
 
-static void vmdk_flush(BlockDriverState *bs)
+static int vmdk_flush(BlockDriverState *bs)
 {
     BDRVVmdkState *s = bs->opaque;
-    bdrv_flush(s->hd);
+    return bdrv_flush(s->hd);
 }
 
 BlockDriver bdrv_vmdk = {
index 3e25ccb5444e3e426aa0e4509b54319ea6c1504e..8a730bd754ac3737c1206504ab856bb9c39340b3 100644 (file)
@@ -889,12 +889,14 @@ const char *bdrv_get_device_name(BlockDriverState *bs)
     return bs->device_name;
 }
 
-void bdrv_flush(BlockDriverState *bs)
+int bdrv_flush(BlockDriverState *bs)
 {
-    if (bs->drv->bdrv_flush)
-        bs->drv->bdrv_flush(bs);
-    if (bs->backing_hd)
-        bdrv_flush(bs->backing_hd);
+    int ret = 0;
+    if (bs->drv->bdrv_flush) 
+        ret = bs->drv->bdrv_flush(bs);
+    if (!ret && bs->backing_hd)
+        ret = bdrv_flush(bs->backing_hd);
+    return ret;
 }
 
 void bdrv_info(void)
@@ -1232,8 +1234,9 @@ static void bdrv_aio_cancel_em(BlockDriverAIOCB *blockacb)
 static BlockDriverAIOCB *bdrv_aio_flush_em(BlockDriverState *bs,
         BlockDriverCompletionFunc *cb, void *opaque)
 {
-    bdrv_flush(bs);
-    cb(opaque, 0);
+    int ret;
+    ret = bdrv_flush(bs);
+    cb(opaque, ret);
     return NULL;
 }
 
index 6190d1c08e77e2d239e52ece13d23e26a841d3c3..8c0318e795467671a96e3b9069c8ab0754952bdf 100644 (file)
@@ -36,7 +36,7 @@ struct BlockDriver {
     void (*bdrv_close)(BlockDriverState *bs);
     int (*bdrv_create)(const char *filename, int64_t total_sectors, 
                        const char *backing_file, int flags);
-    void (*bdrv_flush)(BlockDriverState *bs);
+    int (*bdrv_flush)(BlockDriverState *bs);
     int (*bdrv_is_allocated)(BlockDriverState *bs, int64_t sector_num,
                              int nb_sectors, int *pnum);
     int (*bdrv_set_key)(BlockDriverState *bs, const char *key);
index 0db6f2a6b315f181ea8012b9f963b65f176e31bf..cfe3e8a5b240c1e9cebc5be63d761c1a7c1f3f35 100644 (file)
@@ -1786,6 +1786,7 @@ static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
     IDEState *s;
     int unit, n;
     int lba48 = 0;
+    int ret;
 
 #ifdef DEBUG_IDE
     printf("IDE: write addr=0x%x val=0x%02x\n", addr, val);
index 9de1fe83a5ad40058d5702413337c40984c8839a..2ad204ba266293223f75f31e4f08f67ab221c9d0 100644 (file)
@@ -291,6 +291,7 @@ int32_t scsi_send_command(SCSIDevice *s, uint32_t tag, uint8_t *buf, int lun)
     uint8_t command;
     uint8_t *outbuf;
     SCSIRequest *r;
+    int ret;
 
     command = buf[0];
     r = scsi_find_request(s, tag);
@@ -496,7 +497,12 @@ int32_t scsi_send_command(SCSIDevice *s, uint32_t tag, uint8_t *buf, int lun)
         break;
     case 0x35:
         DPRINTF("Syncronise cache (sector %d, count %d)\n", lba, len);
-        bdrv_flush(s->bdrv);
+        ret = bdrv_flush(s->bdrv);
+        if (ret) {
+            DPRINTF("IO error on bdrv_flush\n");
+            scsi_command_complete(r, SENSE_HARDWARE_ERROR);
+            return 0;
+        }
         break;
     case 0x43:
         {
index 79531bf783c5bcfb2b04ad286c808dc44ffa3227..c6b73686586736d5cd7190b34bf34a41e83c9ffd 100644 (file)
@@ -664,7 +664,7 @@ void qemu_aio_wait(void);
 void qemu_aio_wait_end(void);
 
 /* Ensure contents are flushed to disk.  */
-void bdrv_flush(BlockDriverState *bs);
+int bdrv_flush(BlockDriverState *bs);
 
 #define BDRV_TYPE_HD     0
 #define BDRV_TYPE_CDROM  1