[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 10/17] qcow2-dirty-bitmap: add autoclear bit
From: |
Vladimir Sementsov-Ogievskiy |
Subject: |
[Qemu-devel] [PATCH 10/17] qcow2-dirty-bitmap: add autoclear bit |
Date: |
Wed, 17 Feb 2016 18:29:02 +0300 |
Add autoclear bit for handling rewriting image by old qemu version.
If autoclear bit is not set, but bitmaps extension is found it
would not be loaded and warning will be generated.
Signed-off-by: Vladimir Sementsov-Ogievskiy <address@hidden>
---
block/qcow2-dirty-bitmap.c | 4 ++++
block/qcow2.c | 12 ++++++++++--
block/qcow2.h | 9 +++++++++
3 files changed, 23 insertions(+), 2 deletions(-)
diff --git a/block/qcow2-dirty-bitmap.c b/block/qcow2-dirty-bitmap.c
index 9f8ad6b..18f271f 100644
--- a/block/qcow2-dirty-bitmap.c
+++ b/block/qcow2-dirty-bitmap.c
@@ -417,6 +417,7 @@ static int directory_push_entry(BlockDriverState *bs,
QCow2BitmapHeader *header)
int64_t new_offset = 0, old_offset = 0;
uint64_t new_size = s->bitmap_directory_size + entry_size, old_size = 0;
void *p;
+ uint64_t old_autocl;
int64_t nb_sectors = bdrv_nb_sectors(bs);
if (nb_sectors < 0) {
@@ -435,6 +436,7 @@ static int directory_push_entry(BlockDriverState *bs,
QCow2BitmapHeader *header)
old_offset = s->bitmap_directory_offset;
old_size = s->bitmap_directory_size;
+ old_autocl = s->autoclear_features;
uint8_t *new_dir = g_try_malloc(new_size);
if (new_dir == NULL) {
@@ -456,6 +458,7 @@ static int directory_push_entry(BlockDriverState *bs,
QCow2BitmapHeader *header)
s->bitmap_directory_offset = new_offset;
s->bitmap_directory_size = new_size;
+ s->autoclear_features |= QCOW2_AUTOCLEAR_DIRTY_BITMAPS;
ret = update_header_sync(bs);
if (ret < 0) {
@@ -477,6 +480,7 @@ fail:
qcow2_free_clusters(bs, new_offset, new_size, QCOW2_DISCARD_ALWAYS);
s->bitmap_directory_offset = old_offset;
s->bitmap_directory_size = old_size;
+ s->autoclear_features = old_autocl;
}
p = g_try_realloc(s->bitmap_directory, s->bitmap_directory_size);
diff --git a/block/qcow2.c b/block/qcow2.c
index 0e75eeb..48ae6bc 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -163,6 +163,13 @@ static int qcow2_read_extensions(BlockDriverState *bs,
uint64_t start_offset,
break;
case QCOW2_EXT_MAGIC_DIRTY_BITMAPS:
+ if (!(s->autoclear_features & QCOW2_AUTOCLEAR_DIRTY_BITMAPS)) {
+ fprintf(stderr,
+ "WARNING: bitmaps_ext: autoclear flag is not "
+ "set, all bitmaps will be considered as inconsistent");
+ break;
+ }
+
ret = bdrv_pread(bs->file->bs, offset, &bitmaps_ext, ext.len);
if (ret < 0) {
error_setg_errno(errp, -ret, "ERROR: bitmaps_ext: "
@@ -1204,8 +1211,9 @@ static int qcow2_open(BlockDriverState *bs, QDict
*options, int flags,
}
/* Clear unknown autoclear feature bits */
- if (!bs->read_only && !(flags & BDRV_O_INACTIVE) && s->autoclear_features)
{
- s->autoclear_features = 0;
+ if (!bs->read_only && !(flags & BDRV_O_INACTIVE) &&
+ (s->autoclear_features & ~QCOW2_AUTOCLEAR_MASK)) {
+ s->autoclear_features &= QCOW2_AUTOCLEAR_MASK;
ret = qcow2_update_header(bs);
if (ret < 0) {
error_setg_errno(errp, -ret, "Could not update qcow2 header");
diff --git a/block/qcow2.h b/block/qcow2.h
index 423c279..63ea543 100644
--- a/block/qcow2.h
+++ b/block/qcow2.h
@@ -220,6 +220,15 @@ enum {
QCOW2_COMPAT_FEAT_MASK = QCOW2_COMPAT_LAZY_REFCOUNTS,
};
+/* Autoclear feature bits */
+enum {
+ QCOW2_AUTOCLEAR_DIRTY_BITMAPS_BITNR = 0,
+ QCOW2_AUTOCLEAR_DIRTY_BITMAPS =
+ 1 << QCOW2_AUTOCLEAR_DIRTY_BITMAPS_BITNR,
+
+ QCOW2_AUTOCLEAR_MASK = QCOW2_AUTOCLEAR_DIRTY_BITMAPS,
+};
+
enum qcow2_discard_type {
QCOW2_DISCARD_NEVER = 0,
QCOW2_DISCARD_ALWAYS,
--
1.8.3.1
- [Qemu-devel] [PATCH v4 RFC 00/17] qcow2: persistent dirty bitmaps, Vladimir Sementsov-Ogievskiy, 2016/02/17
- [Qemu-devel] [PATCH 02/17] qcow2: Bitmaps extension: structs and consts, Vladimir Sementsov-Ogievskiy, 2016/02/17
- [Qemu-devel] [PATCH 01/17] hbitmap: load/store, Vladimir Sementsov-Ogievskiy, 2016/02/17
- [Qemu-devel] [PATCH 04/17] qcow2-dirty-bitmap: add qcow2_bitmap_load(), Vladimir Sementsov-Ogievskiy, 2016/02/17
- [Qemu-devel] [PATCH 06/17] qcow2: add dirty bitmaps extension, Vladimir Sementsov-Ogievskiy, 2016/02/17
- [Qemu-devel] [PATCH 07/17] qcow2-dirty-bitmap: add qcow2_bitmap_load_check(), Vladimir Sementsov-Ogievskiy, 2016/02/17
- [Qemu-devel] [PATCH 03/17] qcow2-dirty-bitmap: read dirty bitmap directory, Vladimir Sementsov-Ogievskiy, 2016/02/17
- [Qemu-devel] [PATCH 05/17] qcow2-dirty-bitmap: add qcow2_bitmap_store(), Vladimir Sementsov-Ogievskiy, 2016/02/17
- [Qemu-devel] [PATCH 08/17] block: store persistent dirty bitmaps, Vladimir Sementsov-Ogievskiy, 2016/02/17
- [Qemu-devel] [PATCH 10/17] qcow2-dirty-bitmap: add autoclear bit,
Vladimir Sementsov-Ogievskiy <=
- [Qemu-devel] [PATCH 09/17] block: add bdrv_load_dirty_bitmap(), Vladimir Sementsov-Ogievskiy, 2016/02/17
- [Qemu-devel] [PATCH 11/17] qemu: command line option for dirty bitmaps, Vladimir Sementsov-Ogievskiy, 2016/02/17
- [Qemu-devel] [PATCH 12/17] qcow2-dirty-bitmap: add IN_USE flag, Vladimir Sementsov-Ogievskiy, 2016/02/17
- [Qemu-devel] [PATCH 13/17] qcow2-dirty-bitmaps: disallow stroing bitmap to other bs, Vladimir Sementsov-Ogievskiy, 2016/02/17
- [Qemu-devel] [PATCH 16/17] qcow2-dirty-bitmap: add AUTO flag, Vladimir Sementsov-Ogievskiy, 2016/02/17
- [Qemu-devel] [PATCH 14/17] iotests: add VM.test_launcn(), Vladimir Sementsov-Ogievskiy, 2016/02/17
- [Qemu-devel] [PATCH 17/17] qcow2-dirty-bitmap: add EXTRA_DATA_COMPATIBLE flag, Vladimir Sementsov-Ogievskiy, 2016/02/17
- [Qemu-devel] [PATCH 15/17] iotests: test internal persistent dirty bitmap, Vladimir Sementsov-Ogievskiy, 2016/02/17
- Re: [Qemu-devel] [PATCH v4 RFC 00/17] qcow2: persistent dirty bitmaps, John Snow, 2016/02/26