[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-block] [Qemu-devel] [PATCH 21/25] qcow2-bitmap: refcounts
From: |
John Snow |
Subject: |
Re: [Qemu-block] [Qemu-devel] [PATCH 21/25] qcow2-bitmap: refcounts |
Date: |
Tue, 14 Feb 2017 18:22:10 -0500 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.7.0 |
On 02/14/2017 11:59 AM, Vladimir Sementsov-Ogievskiy wrote:
> Calculate refcounts for qcow2 bitmaps. It is needed for qcow2's qemu-img
> check implementation.
>
> Signed-off-by: Vladimir Sementsov-Ogievskiy <address@hidden>
> Reviewed-by: Max Reitz <address@hidden>
> ---
> block/qcow2-bitmap.c | 76
> ++++++++++++++++++++++++++++++++++++++++++++++++++
> block/qcow2-refcount.c | 6 ++++
> block/qcow2.h | 3 ++
> 3 files changed, 85 insertions(+)
>
> diff --git a/block/qcow2-bitmap.c b/block/qcow2-bitmap.c
> index 419d51e..326a799 100644
> --- a/block/qcow2-bitmap.c
> +++ b/block/qcow2-bitmap.c
> @@ -1222,3 +1222,79 @@ common_errp:
> name, bdrv_get_device_or_node_name(bs), reason);
> return false;
> }
> +
> +int qcow2_check_bitmaps_refcounts(BlockDriverState *bs, BdrvCheckResult *res,
> + void **refcount_table,
> + int64_t *refcount_table_size)
> +{
> + int ret;
> + BDRVQcow2State *s = bs->opaque;
> + Qcow2BitmapList *bm_list;
> + Qcow2Bitmap *bm;
> +
> + if (s->nb_bitmaps == 0) {
> + return 0;
> + }
> +
> + ret = qcow2_inc_refcounts_imrt(bs, res, refcount_table,
> refcount_table_size,
> + s->bitmap_directory_offset,
> + s->bitmap_directory_size);
> + if (ret < 0) {
> + return ret;
> + }
> +
> + bm_list = bitmap_list_load(bs, s->bitmap_directory_offset,
> + s->bitmap_directory_size, NULL);
> + if (bm_list == NULL) {
> + res->corruptions++;
> + return -EINVAL;
> + }
> +
> + QSIMPLEQ_FOREACH(bm, bm_list, entry) {
> + uint64_t *bitmap_table = NULL;
> + int i;
> +
> + ret = qcow2_inc_refcounts_imrt(bs, res,
> + refcount_table, refcount_table_size,
> + bm->table.offset,
> + bm->table.size * sizeof(uint64_t));
> + if (ret < 0) {
> + goto out;
> + }
> +
> + ret = bitmap_table_load(bs, &bm->table, &bitmap_table);
> + if (ret < 0) {
> + res->corruptions++;
> + goto out;
> + }
> +
> + for (i = 0; i < bm->table.size; ++i) {
> + uint64_t entry = bitmap_table[i];
> + uint64_t offset = entry & BME_TABLE_ENTRY_OFFSET_MASK;
> +
> + if (check_table_entry(entry, s->cluster_size) < 0) {
> + res->corruptions++;
> + continue;
> + }
> +
> + if (offset == 0) {
> + continue;
> + }
> +
> + ret = qcow2_inc_refcounts_imrt(bs, res,
> + refcount_table,
> refcount_table_size,
> + offset, s->cluster_size);
> + if (ret < 0) {
> + g_free(bitmap_table);
> + goto out;
> + }
> + }
> +
> + g_free(bitmap_table);
> + }
> +
> +out:
> + bitmap_list_free(bm_list);
> +
> + return ret;
> +}
> diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c
> index 14a736d..cdb74ba 100644
> --- a/block/qcow2-refcount.c
> +++ b/block/qcow2-refcount.c
> @@ -1846,6 +1846,12 @@ static int calculate_refcounts(BlockDriverState *bs,
> BdrvCheckResult *res,
> return ret;
> }
>
> + /* bitmaps */
> + ret = qcow2_check_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 0a3708d..eaad34a 100644
> --- a/block/qcow2.h
> +++ b/block/qcow2.h
> @@ -624,5 +624,8 @@ bool qcow2_can_store_new_dirty_bitmap(BlockDriverState
> *bs,
> const char *name,
> uint32_t granularity,
> Error **errp);
> +int qcow2_check_bitmaps_refcounts(BlockDriverState *bs, BdrvCheckResult *res,
> + void **refcount_table,
> + int64_t *refcount_table_size);
>
> #endif
>
Looks OK.
Reviewed-by: John Snow <address@hidden>
- [Qemu-block] [PATCH 18/25] qmp: add x-debug-block-dirty-bitmap-sha256, (continued)
- [Qemu-block] [PATCH 18/25] qmp: add x-debug-block-dirty-bitmap-sha256, Vladimir Sementsov-Ogievskiy, 2017/02/14
- [Qemu-block] [PATCH 06/25] block/dirty-bitmap: add deserialize_ones func, Vladimir Sementsov-Ogievskiy, 2017/02/14
- [Qemu-block] [PATCH 25/25] qcow2-bitmap: improve check_constraints_on_bitmap, Vladimir Sementsov-Ogievskiy, 2017/02/14
- [Qemu-block] [PATCH 24/25] qmp: block-dirty-bitmap-remove: remove persistent, Vladimir Sementsov-Ogievskiy, 2017/02/14
- [Qemu-block] [PATCH 04/25] tests: add hbitmap iter test, Vladimir Sementsov-Ogievskiy, 2017/02/14
- [Qemu-block] [PATCH 02/25] specs/qcow2: do not use wording 'bitmap header', Vladimir Sementsov-Ogievskiy, 2017/02/14
- [Qemu-block] [PATCH 21/25] qcow2-bitmap: refcounts, Vladimir Sementsov-Ogievskiy, 2017/02/14
- Re: [Qemu-block] [Qemu-devel] [PATCH 21/25] qcow2-bitmap: refcounts,
John Snow <=
- [Qemu-block] [PATCH 01/25] specs/qcow2: fix bitmap granularity qemu-specific note, Vladimir Sementsov-Ogievskiy, 2017/02/14
- [Qemu-block] [PATCH 08/25] block: introduce auto-loading bitmaps, Vladimir Sementsov-Ogievskiy, 2017/02/14
- [Qemu-block] [PATCH 23/25] qcow2: add .bdrv_remove_persistent_dirty_bitmap, Vladimir Sementsov-Ogievskiy, 2017/02/14
- [Qemu-block] [PATCH 07/25] qcow2: add bitmaps extension, Vladimir Sementsov-Ogievskiy, 2017/02/14
- [Qemu-block] [PATCH 19/25] iotests: test qcow2 persistent dirty bitmap, Vladimir Sementsov-Ogievskiy, 2017/02/14
- [Qemu-block] [PATCH 17/25] qmp: add autoload parameter to block-dirty-bitmap-add, Vladimir Sementsov-Ogievskiy, 2017/02/14
- [Qemu-block] [PATCH 20/25] qcow2-refcount: rename inc_refcounts() and make it public, Vladimir Sementsov-Ogievskiy, 2017/02/14