mirror of https://github.com/xqemu/xqemu.git
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: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
This commit is contained in:
parent
5dba48a882
commit
205ef7961f
21
block.c
21
block.c
|
@ -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)
|
if (bs->drv && bs->drv->bdrv_flush) {
|
||||||
bs->drv->bdrv_flush(bs);
|
return 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)
|
||||||
|
|
2
block.h
2
block.h
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
||||||
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:
|
||||||
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,
|
||||||
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,
|
||||||
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)
|
||||||
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,
|
||||||
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)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
||||||
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 {
|
||||||
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);
|
||||||
|
|
Loading…
Reference in New Issue