From: "Benoît Canet" <benoit.canet@irqsave.net>
To: Fam Zheng <famz@redhat.com>
Cc: kwolf@redhat.com, qemu-devel@nongnu.org, stefanha@redhat.com
Subject: Re: [Qemu-devel] [PATCH v2 1/9] qapi: Add optional field "name" to block dirty bitmap
Date: Thu, 13 Mar 2014 14:15:31 +0100 [thread overview]
Message-ID: <20140313131531.GA4534@irqsave.net> (raw)
In-Reply-To: <1394605864-32237-2-git-send-email-famz@redhat.com>
The Wednesday 12 Mar 2014 à 14:30:56 (+0800), Fam Zheng wrote :
> This field will be set for user created dirty bitmap. Also pass in an
> error pointer to bdrv_create_dirty_bitmap, so when a name is already
> taken on this BDS, it can report an error message. This is not global
> check, two BDSes can have dirty bitmap with a common name.
>
> Implemented bdrv_find_dirty_bitmap to find a dirty bitmap by name, will
> be used later when other QMP commands want to reference dirty bitmap by
> name.
>
> Add bdrv_dirty_bitmap_make_anon. This unsets the name of dirty bitmap.
>
> Signed-off-by: Fam Zheng <famz@redhat.com>
> ---
> block-migration.c | 3 ++-
> block.c | 34 +++++++++++++++++++++++++++++++++-
> block/mirror.c | 2 +-
> include/block/block.h | 8 +++++++-
> qapi-schema.json | 4 +++-
> 5 files changed, 46 insertions(+), 5 deletions(-)
>
> diff --git a/block-migration.c b/block-migration.c
> index 897fdba..e6e016a 100644
> --- a/block-migration.c
> +++ b/block-migration.c
> @@ -315,7 +315,8 @@ static void set_dirty_tracking(void)
> BlkMigDevState *bmds;
>
> QSIMPLEQ_FOREACH(bmds, &block_mig_state.bmds_list, entry) {
> - bmds->dirty_bitmap = bdrv_create_dirty_bitmap(bmds->bs, BLOCK_SIZE);
> + bmds->dirty_bitmap = bdrv_create_dirty_bitmap(bmds->bs, BLOCK_SIZE,
> + NULL, NULL);
> }
> }
>
> diff --git a/block.c b/block.c
> index f1ef4b0..ce48fff 100644
> --- a/block.c
> +++ b/block.c
> @@ -52,6 +52,7 @@
>
> struct BdrvDirtyBitmap {
> HBitmap *bitmap;
> + char *name;
Why not making name a regular char array like bs->device_name or bs->node_name.
Its emptyness could still be tested and it also would remove some memory management
duties.
> QLIST_ENTRY(BdrvDirtyBitmap) list;
> };
>
> @@ -5048,18 +5049,46 @@ bool bdrv_qiov_is_aligned(BlockDriverState *bs, QEMUIOVector *qiov)
> return true;
> }
>
> -BdrvDirtyBitmap *bdrv_create_dirty_bitmap(BlockDriverState *bs, int granularity)
> +BdrvDirtyBitmap *bdrv_find_dirty_bitmap(BlockDriverState *bs,
> + const char *name)
> +{
> + BdrvDirtyBitmap *bm;
> + QLIST_FOREACH(bm, &bs->dirty_bitmaps, list) {
> + if (!strcmp(name, bm->name)) {
> + return bm;
> + }
> + }
> + return NULL;
> +}
> +
> +void bdrv_dirty_bitmap_make_anon(BlockDriverState *bs, BdrvDirtyBitmap *bitmap)
> +{
> + g_free(bitmap->name);
> + bitmap->name = NULL;
> +}
> +
> +BdrvDirtyBitmap *bdrv_create_dirty_bitmap(BlockDriverState *bs,
> + int granularity,
> + const char *name,
> + Error **errp)
> {
> int64_t bitmap_size;
> BdrvDirtyBitmap *bitmap;
>
> assert((granularity & (granularity - 1)) == 0);
>
> + if (name && bdrv_find_dirty_bitmap(bs, name)) {
> + error_setg(errp, "Bitmap already exists: %s", name);
> + return NULL;
> + }
> granularity >>= BDRV_SECTOR_BITS;
> assert(granularity);
> bitmap_size = (bdrv_getlength(bs) >> BDRV_SECTOR_BITS);
> bitmap = g_malloc0(sizeof(BdrvDirtyBitmap));
> bitmap->bitmap = hbitmap_alloc(bitmap_size, ffs(granularity) - 1);
> + if (name) {
> + bitmap->name = g_strdup(name);
> + }
> QLIST_INSERT_HEAD(&bs->dirty_bitmaps, bitmap, list);
> return bitmap;
> }
> @@ -5071,6 +5100,7 @@ void bdrv_release_dirty_bitmap(BlockDriverState *bs, BdrvDirtyBitmap *bitmap)
> if (bm == bitmap) {
> QLIST_REMOVE(bitmap, list);
> hbitmap_free(bitmap->bitmap);
> + g_free(bitmap->name);
> g_free(bitmap);
> return;
> }
> @@ -5089,6 +5119,8 @@ BlockDirtyInfoList *bdrv_query_dirty_bitmaps(BlockDriverState *bs)
> info->count = bdrv_get_dirty_count(bs, bm);
> info->granularity =
> ((int64_t) BDRV_SECTOR_SIZE << hbitmap_granularity(bm->bitmap));
> + info->has_name = bm->name[0] != '\0';
> + info->name = g_strdup(bm->name);
Could bm->name be == NULl here ?
> entry->value = info;
> *plist = entry;
> plist = &entry->next;
> diff --git a/block/mirror.c b/block/mirror.c
> index dd5ee05..be8b2a1 100644
> --- a/block/mirror.c
> +++ b/block/mirror.c
> @@ -596,7 +596,7 @@ static void mirror_start_job(BlockDriverState *bs, BlockDriverState *target,
> s->granularity = granularity;
> s->buf_size = MAX(buf_size, granularity);
>
> - s->dirty_bitmap = bdrv_create_dirty_bitmap(bs, granularity);
> + s->dirty_bitmap = bdrv_create_dirty_bitmap(bs, granularity, NULL, errp);
> bdrv_set_enable_write_cache(s->target, true);
> bdrv_set_on_error(s->target, on_target_error, on_target_error);
> bdrv_iostatus_enable(s->target);
> diff --git a/include/block/block.h b/include/block/block.h
> index 780f48b..aa0c5e4 100644
> --- a/include/block/block.h
> +++ b/include/block/block.h
> @@ -437,7 +437,13 @@ bool bdrv_qiov_is_aligned(BlockDriverState *bs, QEMUIOVector *qiov);
>
> struct HBitmapIter;
> typedef struct BdrvDirtyBitmap BdrvDirtyBitmap;
> -BdrvDirtyBitmap *bdrv_create_dirty_bitmap(BlockDriverState *bs, int granularity);
> +BdrvDirtyBitmap *bdrv_create_dirty_bitmap(BlockDriverState *bs,
> + int granularity,
> + const char *name,
> + Error **errp);
> +BdrvDirtyBitmap *bdrv_find_dirty_bitmap(BlockDriverState *bs,
> + const char *name);
This exactly fit in 80 char so no line split is required.
> +void bdrv_dirty_bitmap_make_anon(BlockDriverState *bs, BdrvDirtyBitmap *bitmap);
> void bdrv_release_dirty_bitmap(BlockDriverState *bs, BdrvDirtyBitmap *bitmap);
> BlockDirtyInfoList *bdrv_query_dirty_bitmaps(BlockDriverState *bs);
> int bdrv_get_dirty(BlockDriverState *bs, BdrvDirtyBitmap *bitmap, int64_t sector);
> diff --git a/qapi-schema.json b/qapi-schema.json
> index 6c381b7..4d5bc13 100644
> --- a/qapi-schema.json
> +++ b/qapi-schema.json
> @@ -1000,6 +1000,8 @@
> #
> # Block dirty bitmap information.
> #
> +# @name: the name of dirty bitmap (Since 2.1)
# @name: #optional the name of dirty bitmap (Since 2.1)
> +#
> # @count: number of dirty bytes according to the dirty bitmap
> #
> # @granularity: granularity of the dirty bitmap in bytes (since 1.4)
> @@ -1007,7 +1009,7 @@
> # Since: 1.3
> ##
> { 'type': 'BlockDirtyInfo',
> - 'data': {'count': 'int', 'granularity': 'int'} }
> + 'data': {'*name': 'str', 'count': 'int', 'granularity': 'int'} }
>
> ##
> # @BlockInfo:
> --
> 1.9.0
>
>
next prev parent reply other threads:[~2014-03-13 13:15 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-03-12 6:30 [Qemu-devel] [PATCH v2 0/9] QMP: Introduce incremental drive-backup with in-memory dirty bitmap Fam Zheng
2014-03-12 6:30 ` [Qemu-devel] [PATCH v2 1/9] qapi: Add optional field "name" to block " Fam Zheng
2014-03-13 13:15 ` Benoît Canet [this message]
2014-03-14 7:16 ` Fam Zheng
2014-03-12 6:30 ` [Qemu-devel] [PATCH v2 2/9] qmp: Add dirty-bitmap-add and dirty-bitmap-remove Fam Zheng
2014-03-13 13:26 ` Benoît Canet
2014-03-14 7:18 ` Fam Zheng
2014-03-14 12:32 ` Eric Blake
2014-03-12 6:30 ` [Qemu-devel] [PATCH v2 3/9] block: Handle error of bdrv_getlength in bdrv_create_dirty_bitmap Fam Zheng
2014-03-13 13:29 ` Benoît Canet
2014-03-12 6:30 ` [Qemu-devel] [PATCH v2 4/9] block: Introduce bdrv_dirty_bitmap_granularity() Fam Zheng
2014-03-13 13:30 ` Benoît Canet
2014-03-12 6:31 ` [Qemu-devel] [PATCH v2 5/9] hbitmap: Add hbitmap_copy Fam Zheng
2014-03-13 13:45 ` Benoît Canet
2014-03-13 14:28 ` Paolo Bonzini
2014-03-20 10:22 ` Paolo Bonzini
2014-03-20 10:47 ` Fam Zheng
2014-03-12 6:31 ` [Qemu-devel] [PATCH v2 6/9] block: Add bdrv_copy_dirty_bitmap and bdrv_reset_dirty_bitmap Fam Zheng
2014-03-12 6:31 ` [Qemu-devel] [PATCH v2 7/9] qmp: Add dirty-bitmap-enable and dirty-bitmap-disable Fam Zheng
2014-03-13 13:55 ` Benoît Canet
2014-03-14 7:25 ` Fam Zheng
2014-03-12 6:31 ` [Qemu-devel] [PATCH v2 8/9] qmp: Add support of "dirty-bitmap" sync mode for drive-backup Fam Zheng
2014-03-13 14:32 ` Benoît Canet
2014-03-14 7:27 ` Fam Zheng
2014-03-12 6:31 ` [Qemu-devel] [PATCH v2 9/9] qapi: Add transaction support to dirty-bitmap-{add, disable} Fam Zheng
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20140313131531.GA4534@irqsave.net \
--to=benoit.canet@irqsave.net \
--cc=famz@redhat.com \
--cc=kwolf@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.