[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PATCH 20/22] qcow2-dirty-bitmap: refcounts
From: |
Vladimir Sementsov-Ogievskiy |
Subject: |
[Qemu-block] [PATCH 20/22] qcow2-dirty-bitmap: refcounts |
Date: |
Fri, 30 Sep 2016 13:53:26 +0300 |
Calculate refcounts for dirty bitmaps.
Signed-off-by: Vladimir Sementsov-Ogievskiy <address@hidden>
---
block/qcow2-bitmap.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++
block/qcow2-refcount.c | 14 +++++++-----
block/qcow2.h | 5 +++++
3 files changed, 74 insertions(+), 5 deletions(-)
diff --git a/block/qcow2-bitmap.c b/block/qcow2-bitmap.c
index 76f7e2b..6d9394a 100644
--- a/block/qcow2-bitmap.c
+++ b/block/qcow2-bitmap.c
@@ -901,3 +901,63 @@ out:
g_free(new_dir);
g_free(dir);
}
+
+int qcow2_dirty_bitmaps_refcounts(BlockDriverState *bs,
+ BdrvCheckResult *res,
+ void **refcount_table,
+ int64_t *refcount_table_size)
+{
+ BDRVQcow2State *s = bs->opaque;
+ uint8_t *dir;
+ Qcow2BitmapDirEntry *e;
+ Error *local_err = NULL;
+
+ int i;
+ int ret = inc_refcounts(bs, res, refcount_table, refcount_table_size,
+ s->bitmap_directory_offset,
+ s->bitmap_directory_size);
+ if (ret < 0) {
+ return ret;
+ }
+
+ dir = directory_read(bs, s->bitmap_directory_offset,
+ s->bitmap_directory_size, &local_err);
+ if (dir == NULL) {
+ error_report_err(local_err);
+ return -EINVAL;
+ }
+
+ for_each_bitmap_dir_entry(e, dir, s->bitmap_directory_size) {
+ uint64_t *bitmap_table = NULL;
+
+ ret = inc_refcounts(bs, res, refcount_table, refcount_table_size,
+ e->bitmap_table_offset,
+ e->bitmap_table_size);
+ if (ret < 0) {
+ return ret;
+ }
+
+ ret = bitmap_table_load(bs, e, &bitmap_table);
+ if (ret < 0) {
+ return ret;
+ }
+
+ for (i = 0; i < e->bitmap_table_size; ++i) {
+ uint64_t off = be64_to_cpu(bitmap_table[i]);
+ if (off <= 1) {
+ continue;
+ }
+
+ ret = inc_refcounts(bs, res, refcount_table, refcount_table_size,
+ off, s->cluster_size);
+ if (ret < 0) {
+ g_free(bitmap_table);
+ return ret;
+ }
+ }
+
+ g_free(bitmap_table);
+ }
+
+ return 0;
+}
diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c
index cbfb3fe..05bcc57 100644
--- a/block/qcow2-refcount.c
+++ b/block/qcow2-refcount.c
@@ -1309,11 +1309,9 @@ static int realloc_refcount_array(BDRVQcow2State *s,
void **array,
*
* Modifies the number of errors in res.
*/
-static int inc_refcounts(BlockDriverState *bs,
- BdrvCheckResult *res,
- void **refcount_table,
- int64_t *refcount_table_size,
- int64_t offset, int64_t size)
+int inc_refcounts(BlockDriverState *bs, BdrvCheckResult *res,
+ void **refcount_table, int64_t *refcount_table_size,
+ int64_t offset, int64_t size)
{
BDRVQcow2State *s = bs->opaque;
uint64_t start, last, cluster_offset, k, refcount;
@@ -1843,6 +1841,12 @@ static int calculate_refcounts(BlockDriverState *bs,
BdrvCheckResult *res,
return ret;
}
+ /* dirty bitmaps */
+ ret = qcow2_dirty_bitmaps_refcounts(bs, res, refcount_table, nb_clusters);
+ if (ret < 0) {
+ return ret;
+ }
+
return check_refblocks(bs, res, fix, rebuild, refcount_table, nb_clusters);
}
diff --git a/block/qcow2.h b/block/qcow2.h
index a5e7592..0a050ea 100644
--- a/block/qcow2.h
+++ b/block/qcow2.h
@@ -563,6 +563,9 @@ int qcow2_check_metadata_overlap(BlockDriverState *bs, int
ign, int64_t offset,
int64_t size);
int qcow2_pre_write_overlap_check(BlockDriverState *bs, int ign, int64_t
offset,
int64_t size);
+int inc_refcounts(BlockDriverState *bs, BdrvCheckResult *res,
+ void **refcount_table, int64_t *refcount_table_size,
+ int64_t offset, int64_t size);
int qcow2_change_refcount_order(BlockDriverState *bs, int refcount_order,
BlockDriverAmendStatusCB *status_cb,
@@ -616,6 +619,8 @@ int qcow2_read_snapshots(BlockDriverState *bs);
int qcow2_read_bitmaps(BlockDriverState *bs, Error **errp);
int qcow2_delete_bitmaps(BlockDriverState *bs);
+int qcow2_dirty_bitmaps_refcounts(BlockDriverState *bs, BdrvCheckResult *res,
+ void **refcount_table, int64_t *refcount_table_size);
/* qcow2-cache.c functions */
Qcow2Cache *qcow2_cache_create(BlockDriverState *bs, int num_tables);
--
1.8.3.1
- [Qemu-block] [PATCH 19/22] iotests: test qcow2 persistent dirty bitmap, (continued)
- [Qemu-block] [PATCH 19/22] iotests: test qcow2 persistent dirty bitmap, Vladimir Sementsov-Ogievskiy, 2016/09/30
- [Qemu-block] [PATCH 10/22] block/dirty-bitmap: add bdrv_dirty_bitmap_next(), Vladimir Sementsov-Ogievskiy, 2016/09/30
- [Qemu-block] [PATCH 01/22] hbitmap: improve dirty iter, Vladimir Sementsov-Ogievskiy, 2016/09/30
- [Qemu-block] [PATCH 16/22] qmp: add persistent flag to block-dirty-bitmap-add, Vladimir Sementsov-Ogievskiy, 2016/09/30
- [Qemu-block] [PATCH 12/22] qcow2-bitmap: add IN_USE flag, Vladimir Sementsov-Ogievskiy, 2016/09/30
- [Qemu-block] [PATCH 14/22] qcow2: delete bitmaps on truncate, Vladimir Sementsov-Ogievskiy, 2016/09/30
- [Qemu-block] [PATCH 15/22] qcow2-bitmap: add autoclear bit, Vladimir Sementsov-Ogievskiy, 2016/09/30
- [Qemu-block] [PATCH 13/22] qcow2-bitmap: check constraints, Vladimir Sementsov-Ogievskiy, 2016/09/30
- [Qemu-block] [PATCH 11/22] qcow2-bitmap: add qcow2_store_persistent_bitmaps(), Vladimir Sementsov-Ogievskiy, 2016/09/30
- [Qemu-block] [PATCH 08/22] block/dirty-bitmap: add autoload field to BdrvDirtyBitmap, Vladimir Sementsov-Ogievskiy, 2016/09/30
- [Qemu-block] [PATCH 20/22] qcow2-dirty-bitmap: refcounts,
Vladimir Sementsov-Ogievskiy <=
- [Qemu-block] [PATCH 04/22] block/dirty-bitmap: add deserialize_ones func, Vladimir Sementsov-Ogievskiy, 2016/09/30
- [Qemu-block] [PATCH 09/22] block: introduce persistent dirty bitmaps, Vladimir Sementsov-Ogievskiy, 2016/09/30
- [Qemu-block] [PATCH 18/22] qapi: add md5 checksum of last dirty bitmap level to query-block, Vladimir Sementsov-Ogievskiy, 2016/09/30
- [Qemu-block] [PATCH 22/22] specs/qcow2: do not use wording 'bitmap header', Vladimir Sementsov-Ogievskiy, 2016/09/30
- [Qemu-block] [PATCH 07/22] qcow2-bitmap: introduce auto-loading bitmaps, Vladimir Sementsov-Ogievskiy, 2016/09/30
- [Qemu-block] [PATCH 02/22] tests: add hbitmap iter test, Vladimir Sementsov-Ogievskiy, 2016/09/30
- [Qemu-block] [PATCH 17/22] qmp: add autoload parameter to block-dirty-bitmap-add, Vladimir Sementsov-Ogievskiy, 2016/09/30
- [Qemu-block] [PATCH 06/22] qcow2: add dirty bitmaps extension, Vladimir Sementsov-Ogievskiy, 2016/09/30
- [Qemu-block] [PATCH 05/22] qcow2-bitmap: structs and consts, Vladimir Sementsov-Ogievskiy, 2016/09/30