[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 20/29] qcow2-bitmap: add AUTO flag
From: |
Vladimir Sementsov-Ogievskiy |
Subject: |
[Qemu-devel] [PATCH 20/29] qcow2-bitmap: add AUTO flag |
Date: |
Mon, 8 Aug 2016 18:05:11 +0300 |
The bitmap should be auto-loaded if auto flag is set.
Signed-off-by: Vladimir Sementsov-Ogievskiy <address@hidden>
---
block/qcow2-bitmap.c | 40 +++++++++++++++++++++++++++++++++++++++-
1 file changed, 39 insertions(+), 1 deletion(-)
diff --git a/block/qcow2-bitmap.c b/block/qcow2-bitmap.c
index bfc1db8..1c46dcb 100644
--- a/block/qcow2-bitmap.c
+++ b/block/qcow2-bitmap.c
@@ -44,8 +44,9 @@
#define BME_MAX_NAME_SIZE 1023
/* Bitmap directory entry flags */
-#define BME_RESERVED_FLAGS 0xfffffffe
+#define BME_RESERVED_FLAGS 0xfffffffc
#define BME_FLAG_IN_USE 1
+#define BME_FLAG_AUTO (1U << 1)
/* bits [1, 8] U [56, 63] are reserved */
#define BME_TABLE_ENTRY_RESERVED_MASK 0xff000000000001fe
@@ -68,6 +69,9 @@ static inline bool can_write(BlockDriverState *bs)
return !bdrv_is_read_only(bs) && !(bdrv_get_flags(bs) & BDRV_O_INACTIVE);
}
+static BdrvDirtyBitmap *load_bitmap(BlockDriverState *bs, QCow2BitmapHeader *h,
+ Error **errp);
+
void qcow2_free_bitmaps(BlockDriverState *bs)
{
BDRVQcow2State *s = bs->opaque;
@@ -214,8 +218,31 @@ fail:
return NULL;
}
+static int load_autoload_bitmaps(BlockDriverState *bs, Error **errp)
+{
+ BDRVQcow2State *s = bs->opaque;
+ QCow2BitmapHeader *h;
+
+ for_each_bitmap_header(h, s) {
+ uint32_t fl = h->flags;
+
+ if ((fl & BME_FLAG_AUTO) && !(fl & BME_FLAG_IN_USE)) {
+ BdrvDirtyBitmap *bitmap = load_bitmap(bs, h, errp);
+ if (bitmap == NULL) {
+ return -1;
+ }
+
+ bdrv_dirty_bitmap_set_persistance(bitmap, true);
+ bdrv_dirty_bitmap_set_autoload(bitmap, true);
+ }
+ }
+
+ return 0;
+}
+
int qcow2_read_bitmaps(BlockDriverState *bs, Error **errp)
{
+ int ret;
BDRVQcow2State *s = bs->opaque;
if (s->bitmap_directory != NULL) {
@@ -234,7 +261,18 @@ int qcow2_read_bitmaps(BlockDriverState *bs, Error **errp)
return -EINVAL;
}
+ ret = load_autoload_bitmaps(bs, errp);
+ if (ret < 0) {
+ goto fail;
+ }
+
return 0;
+
+fail:
+ g_free(s->bitmap_directory);
+ s->bitmap_directory = NULL;
+
+ return ret;
}
static QCow2BitmapHeader *find_bitmap_by_name(BlockDriverState *bs,
--
1.8.3.1
- Re: [Qemu-devel] [PATCH 04/29] block/dirty-bitmap: add deserialize_ones func, (continued)
- [Qemu-devel] [PATCH 07/29] qcow2-bitmap: add qcow2_bitmap_load(), Vladimir Sementsov-Ogievskiy, 2016/08/08
- [Qemu-devel] [PATCH 13/29] qcow2: add dirty bitmaps extension, Vladimir Sementsov-Ogievskiy, 2016/08/08
- [Qemu-devel] [PATCH 21/29] qcow2-bitmap: add EXTRA_DATA_COMPATIBLE flag, Vladimir Sementsov-Ogievskiy, 2016/08/08
- [Qemu-devel] [PATCH 12/29] qcow2: add qcow2_delete_bitmaps, Vladimir Sementsov-Ogievskiy, 2016/08/08
- [Qemu-devel] [PATCH 02/29] tests: add hbitmap iter test, Vladimir Sementsov-Ogievskiy, 2016/08/08
- [Qemu-devel] [PATCH 08/29] qcow2-bitmap: delete bitmap from qcow2 after load, Vladimir Sementsov-Ogievskiy, 2016/08/08
- [Qemu-devel] [PATCH 20/29] qcow2-bitmap: add AUTO flag,
Vladimir Sementsov-Ogievskiy <=
- [Qemu-devel] [PATCH 11/29] qcow2-bitmap: check constraints, Vladimir Sementsov-Ogievskiy, 2016/08/08
- [Qemu-devel] [PATCH 19/29] block/dirty-bitmap: add autoload field to BdrvDirtyBitmap, Vladimir Sementsov-Ogievskiy, 2016/08/08
- [Qemu-devel] [PATCH 18/29] qcow2-bitmap: disallow storing bitmap to other bs, Vladimir Sementsov-Ogievskiy, 2016/08/08
- [Qemu-devel] [PATCH 06/29] qcow2-bitmap: add qcow2_read_bitmaps(), Vladimir Sementsov-Ogievskiy, 2016/08/08
- [Qemu-devel] [PATCH 22/29] qmp: add persistent flag to block-dirty-bitmap-add, Vladimir Sementsov-Ogievskiy, 2016/08/08
- [Qemu-devel] [PATCH 03/29] block: fix bdrv_dirty_bitmap_granularity signature, Vladimir Sementsov-Ogievskiy, 2016/08/08