提交 205ef796 编写于 作者: K Kevin Wolf

block: Allow bdrv_flush to return errors

This changes bdrv_flush to return 0 on success and -errno in case of failure.
It's a requirement for implementing proper error handle in users of bdrv_flush.
Signed-off-by: NKevin Wolf <kwolf@redhat.com>
Reviewed-by: NStefan Hajnoczi <stefanha@linux.vnet.ibm.com>
上级 5dba48a8
...@@ -1453,14 +1453,27 @@ const char *bdrv_get_device_name(BlockDriverState *bs) ...@@ -1453,14 +1453,27 @@ const char *bdrv_get_device_name(BlockDriverState *bs)
return bs->device_name; return bs->device_name;
} }
void bdrv_flush(BlockDriverState *bs) int bdrv_flush(BlockDriverState *bs)
{ {
if (bs->open_flags & BDRV_O_NO_FLUSH) { if (bs->open_flags & BDRV_O_NO_FLUSH) {
return; return 0;
}
if (bs->drv && bs->drv->bdrv_flush) {
return bs->drv->bdrv_flush(bs);
} }
if (bs->drv && bs->drv->bdrv_flush) /*
bs->drv->bdrv_flush(bs); * Some block drivers always operate in either writethrough or unsafe mode
* and don't support bdrv_flush therefore. Usually qemu doesn't know how
* the server works (because the behaviour is hardcoded or depends on
* server-side configuration), so we can't ensure that everything is safe
* on disk. Returning an error doesn't work because that would break guests
* even if the server operates in writethrough mode.
*
* Let's hope the user knows what he's doing.
*/
return 0;
} }
void bdrv_flush_all(void) void bdrv_flush_all(void)
......
...@@ -142,7 +142,7 @@ BlockDriverAIOCB *bdrv_aio_ioctl(BlockDriverState *bs, ...@@ -142,7 +142,7 @@ BlockDriverAIOCB *bdrv_aio_ioctl(BlockDriverState *bs,
BlockDriverCompletionFunc *cb, void *opaque); BlockDriverCompletionFunc *cb, void *opaque);
/* Ensure contents are flushed to disk. */ /* Ensure contents are flushed to disk. */
void bdrv_flush(BlockDriverState *bs); int bdrv_flush(BlockDriverState *bs);
void bdrv_flush_all(void); void bdrv_flush_all(void);
void bdrv_close_all(void); void bdrv_close_all(void);
......
...@@ -397,9 +397,9 @@ static void blkdebug_close(BlockDriverState *bs) ...@@ -397,9 +397,9 @@ static void blkdebug_close(BlockDriverState *bs)
} }
} }
static void blkdebug_flush(BlockDriverState *bs) static int blkdebug_flush(BlockDriverState *bs)
{ {
bdrv_flush(bs->file); return bdrv_flush(bs->file);
} }
static BlockDriverAIOCB *blkdebug_aio_flush(BlockDriverState *bs, static BlockDriverAIOCB *blkdebug_aio_flush(BlockDriverState *bs,
......
...@@ -116,12 +116,12 @@ static void blkverify_close(BlockDriverState *bs) ...@@ -116,12 +116,12 @@ static void blkverify_close(BlockDriverState *bs)
s->test_file = NULL; s->test_file = NULL;
} }
static void blkverify_flush(BlockDriverState *bs) static int blkverify_flush(BlockDriverState *bs)
{ {
BDRVBlkverifyState *s = bs->opaque; BDRVBlkverifyState *s = bs->opaque;
/* Only flush test file, the raw file is not important */ /* Only flush test file, the raw file is not important */
bdrv_flush(s->test_file); return bdrv_flush(s->test_file);
} }
static int64_t blkverify_getlength(BlockDriverState *bs) static int64_t blkverify_getlength(BlockDriverState *bs)
......
...@@ -282,9 +282,9 @@ exit: ...@@ -282,9 +282,9 @@ exit:
return ret; return ret;
} }
static void cow_flush(BlockDriverState *bs) static int cow_flush(BlockDriverState *bs)
{ {
bdrv_flush(bs->file); return bdrv_flush(bs->file);
} }
static QEMUOptionParameter cow_create_options[] = { static QEMUOptionParameter cow_create_options[] = {
......
...@@ -910,9 +910,9 @@ static int qcow_write_compressed(BlockDriverState *bs, int64_t sector_num, ...@@ -910,9 +910,9 @@ static int qcow_write_compressed(BlockDriverState *bs, int64_t sector_num,
return 0; return 0;
} }
static void qcow_flush(BlockDriverState *bs) static int qcow_flush(BlockDriverState *bs)
{ {
bdrv_flush(bs->file); return bdrv_flush(bs->file);
} }
static BlockDriverAIOCB *qcow_aio_flush(BlockDriverState *bs, static BlockDriverAIOCB *qcow_aio_flush(BlockDriverState *bs,
......
...@@ -1148,9 +1148,9 @@ static int qcow_write_compressed(BlockDriverState *bs, int64_t sector_num, ...@@ -1148,9 +1148,9 @@ static int qcow_write_compressed(BlockDriverState *bs, int64_t sector_num,
return 0; return 0;
} }
static void qcow_flush(BlockDriverState *bs) static int qcow_flush(BlockDriverState *bs)
{ {
bdrv_flush(bs->file); return bdrv_flush(bs->file);
} }
static BlockDriverAIOCB *qcow_aio_flush(BlockDriverState *bs, static BlockDriverAIOCB *qcow_aio_flush(BlockDriverState *bs,
......
...@@ -734,10 +734,10 @@ static int raw_create(const char *filename, QEMUOptionParameter *options) ...@@ -734,10 +734,10 @@ static int raw_create(const char *filename, QEMUOptionParameter *options)
return result; return result;
} }
static void raw_flush(BlockDriverState *bs) static int raw_flush(BlockDriverState *bs)
{ {
BDRVRawState *s = bs->opaque; BDRVRawState *s = bs->opaque;
qemu_fdatasync(s->fd); return qemu_fdatasync(s->fd);
} }
......
...@@ -150,7 +150,14 @@ static int raw_write(BlockDriverState *bs, int64_t sector_num, ...@@ -150,7 +150,14 @@ static int raw_write(BlockDriverState *bs, int64_t sector_num,
static void raw_flush(BlockDriverState *bs) static void raw_flush(BlockDriverState *bs)
{ {
BDRVRawState *s = bs->opaque; BDRVRawState *s = bs->opaque;
FlushFileBuffers(s->hfile); int ret;
ret = FlushFileBuffers(s->hfile);
if (ret != 0) {
return -EIO;
}
return 0;
} }
static void raw_close(BlockDriverState *bs) static void raw_close(BlockDriverState *bs)
......
...@@ -39,9 +39,9 @@ static void raw_close(BlockDriverState *bs) ...@@ -39,9 +39,9 @@ static void raw_close(BlockDriverState *bs)
{ {
} }
static void raw_flush(BlockDriverState *bs) static int raw_flush(BlockDriverState *bs)
{ {
bdrv_flush(bs->file); return bdrv_flush(bs->file);
} }
static BlockDriverAIOCB *raw_aio_flush(BlockDriverState *bs, static BlockDriverAIOCB *raw_aio_flush(BlockDriverState *bs,
......
...@@ -900,10 +900,10 @@ static void vdi_close(BlockDriverState *bs) ...@@ -900,10 +900,10 @@ static void vdi_close(BlockDriverState *bs)
{ {
} }
static void vdi_flush(BlockDriverState *bs) static int vdi_flush(BlockDriverState *bs)
{ {
logout("\n"); logout("\n");
bdrv_flush(bs->file); return bdrv_flush(bs->file);
} }
......
...@@ -823,9 +823,9 @@ static void vmdk_close(BlockDriverState *bs) ...@@ -823,9 +823,9 @@ static void vmdk_close(BlockDriverState *bs)
qemu_free(s->l2_cache); qemu_free(s->l2_cache);
} }
static void vmdk_flush(BlockDriverState *bs) static int vmdk_flush(BlockDriverState *bs)
{ {
bdrv_flush(bs->file); return bdrv_flush(bs->file);
} }
......
...@@ -59,7 +59,7 @@ struct BlockDriver { ...@@ -59,7 +59,7 @@ struct BlockDriver {
const uint8_t *buf, int nb_sectors); const uint8_t *buf, int nb_sectors);
void (*bdrv_close)(BlockDriverState *bs); void (*bdrv_close)(BlockDriverState *bs);
int (*bdrv_create)(const char *filename, QEMUOptionParameter *options); int (*bdrv_create)(const char *filename, QEMUOptionParameter *options);
void (*bdrv_flush)(BlockDriverState *bs); int (*bdrv_flush)(BlockDriverState *bs);
int (*bdrv_is_allocated)(BlockDriverState *bs, int64_t sector_num, int (*bdrv_is_allocated)(BlockDriverState *bs, int64_t sector_num,
int nb_sectors, int *pnum); int nb_sectors, int *pnum);
int (*bdrv_set_key)(BlockDriverState *bs, const char *key); int (*bdrv_set_key)(BlockDriverState *bs, const char *key);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册