The QED image is reopened to flush metadata and check consistency. Signed-off-by: Benoit Canet <benoit.ca...@gmail.com> --- block/qed.c | 15 +++++++++++++++ block/qed.h | 1 + 2 files changed, 16 insertions(+), 0 deletions(-)
diff --git a/block/qed.c b/block/qed.c index a041d31..c47272c 100644 --- a/block/qed.c +++ b/block/qed.c @@ -375,6 +375,10 @@ static int bdrv_qed_open(BlockDriverState *bs, int flags) int ret; s->bs = bs; + + /* backup flags for bdrv_qed_invalidate_cache */ + s->flags = flags; + QSIMPLEQ_INIT(&s->allocating_write_reqs); ret = bdrv_pread(bs->file, 0, &le_header, sizeof(le_header)); @@ -1516,6 +1520,16 @@ static int bdrv_qed_change_backing_file(BlockDriverState *bs, return ret; } +static void bdrv_qed_invalidate_cache(BlockDriverState *bs) +{ + BDRVQEDState *s = bs->opaque; + int flags = s->flags; + + bdrv_qed_close(bs); + memset(s, 0, sizeof(BDRVQEDState)); + bdrv_qed_open(bs, flags); +} + static int bdrv_qed_check(BlockDriverState *bs, BdrvCheckResult *result) { BDRVQEDState *s = bs->opaque; @@ -1568,6 +1582,7 @@ static BlockDriver bdrv_qed = { .bdrv_getlength = bdrv_qed_getlength, .bdrv_get_info = bdrv_qed_get_info, .bdrv_change_backing_file = bdrv_qed_change_backing_file, + .bdrv_invalidate_cache = bdrv_qed_invalidate_cache, .bdrv_check = bdrv_qed_check, }; diff --git a/block/qed.h b/block/qed.h index 62624a1..cb1ebd8 100644 --- a/block/qed.h +++ b/block/qed.h @@ -153,6 +153,7 @@ typedef struct QEDAIOCB { typedef struct { BlockDriverState *bs; /* device */ + int flags; /* open flags */ uint64_t file_size; /* length of image file, in bytes */ QEDHeader header; /* always cpu-endian */ -- 1.7.7.6