From: Max Reitz <mreitz@redhat.com>
To: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>,
qemu-block@nongnu.org, qemu-devel@nongnu.org
Cc: kwolf@redhat.com, armbru@redhat.com, eblake@redhat.com,
jsnow@redhat.com, famz@redhat.com, den@openvz.org,
stefanha@redhat.com, pbonzini@redhat.com
Subject: Re: [Qemu-devel] [PATCH 13/21] qcow2: add .bdrv_store_persistent_dirty_bitmaps()
Date: Mon, 19 Dec 2016 16:34:00 +0100 [thread overview]
Message-ID: <de2ebda3-a6db-d9da-9514-e86e3d9afa86@redhat.com> (raw)
In-Reply-To: <f3e9d063-7f2e-8308-38cb-fc61e6e9fcce@virtuozzo.com>
[-- Attachment #1: Type: text/plain, Size: 5433 bytes --]
On 19.12.2016 16:26, Vladimir Sementsov-Ogievskiy wrote:
> 19.12.2016 18:14, Max Reitz wrote:
>> On 17.12.2016 15:58, Vladimir Sementsov-Ogievskiy wrote:
>>> 09.12.2016 20:05, Max Reitz wrote:
>>>> On 22.11.2016 18:26, Vladimir Sementsov-Ogievskiy wrote:
>>>>> Realize block bitmap storing interface, to allow qcow2 images store
>>>>> persistent bitmaps.
>>>>>
>>>>> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
>>>>> ---
>>>>> block/qcow2-bitmap.c | 451
>>>>> +++++++++++++++++++++++++++++++++++++++++++++++++++
>>>>> block/qcow2.c | 1 +
>>> [...]
>>>
>>>>> +
>>>>> +/* store_bitmap_data()
>>>>> + * Store bitmap to image, filling bitmap table accordingly.
>>>>> + */
>>>>> +static uint64_t *store_bitmap_data(BlockDriverState *bs,
>>>>> + BdrvDirtyBitmap *bitmap,
>>>>> + uint32_t *bitmap_table_size,
>>>>> Error **errp)
>>>>> +{
>>>>> + int ret;
>>>>> + BDRVQcow2State *s = bs->opaque;
>>>>> + int64_t sector;
>>>>> + uint64_t dsc;
>>>>> + uint64_t bm_size = bdrv_dirty_bitmap_size(bitmap);
>>>>> + const char *bm_name = bdrv_dirty_bitmap_name(bitmap);
>>>>> + uint8_t *buf = NULL;
>>>>> + BdrvDirtyBitmapIter *dbi;
>>>>> + uint64_t *tb;
>>>>> + uint64_t tb_size =
>>>>> + size_to_clusters(s,
>>>>> + bdrv_dirty_bitmap_serialization_size(bitmap, 0,
>>>>> bm_size));
>>>>> +
>>>>> + if (tb_size > BME_MAX_TABLE_SIZE ||
>>>>> + tb_size * s->cluster_size > BME_MAX_PHYS_SIZE) {
>>>> Alignment to the opening parenthesis, please.
>>>>
>>>>> + error_setg(errp, "Bitmap '%s' is too big", bm_name);
>>>>> + return NULL;
>>>>> + }
>>>>> +
>>>>> + tb = g_try_new0(uint64_t, tb_size);
>>>>> + if (tb == NULL) {
>>>>> + error_setg(errp, "No memory");
>>>>> + return NULL;
>>>>> + }
>>>>> +
>>>>> + dbi = bdrv_dirty_iter_new(bitmap, 0);
>>>>> + buf = g_malloc(s->cluster_size);
>>>>> + dsc = disk_sectors_in_bitmap_cluster(s, bitmap);
>>>>> +
>>>>> + while ((sector = bdrv_dirty_iter_next(dbi)) != -1) {
>>>>> + uint64_t cluster = sector / dsc;
>>>>> + uint64_t end, write_size;
>>>>> + int64_t off;
>>>>> +
>>>>> + sector = cluster * dsc;
>>>>> + end = MIN(bm_size, sector + dsc);
>>>>> + write_size =
>>>>> + bdrv_dirty_bitmap_serialization_size(bitmap, sector,
>>>>> end - sector);
>>>>> +
>>>>> + off = qcow2_alloc_clusters(bs, s->cluster_size);
>>>>> + if (off < 0) {
>>>>> + error_setg_errno(errp, -off,
>>>>> + "Failed to allocate clusters for
>>>>> bitmap '%s'",
>>>>> + bm_name);
>>>>> + goto fail;
>>>>> + }
>>>>> + tb[cluster] = off;
>>>> Somehow I would feel better with either an assert(cluster < tb_size);
>>>> here or an assert(bdrv_nb_sectors(bs) / dsc == tb_size); (plus the
>>>> error
>>>> handling for bdrv_nb_sectors()) above the loop.
>>> assert((bm_size - 1) / dsc == tb_size - 1) seems ok. and no additional
>>> error handling. Right?
>> Right, bm_size is already equal to bdrv_nb_sectors(bs), and it's not
>> necessarily a multiple of dsc. So that should be good. Alternatively, I
>> think the following would be slightly easier to read:
>>
>> assert(DIV_ROUND_UP(bm_size, dsc) == tb_size);
>>
>>>>> +
>>>>> + bdrv_dirty_bitmap_serialize_part(bitmap, buf, sector, end
>>>>> - sector);
>>>>> + if (write_size < s->cluster_size) {
>>>>> + memset(buf + write_size, 0, s->cluster_size -
>>>>> write_size);
>>>>> + }
>>>> Should we assert that write_size <= s->cluster_size?
>>> Ok
>>>
>>> [...].
>>>
>>>>> + const char *name = bdrv_dirty_bitmap_name(bitmap);
>>>>> + uint32_t granularity = bdrv_dirty_bitmap_granularity(bitmap);
>>>>> + Qcow2Bitmap *bm;
>>>>> +
>>>>> + if (!bdrv_dirty_bitmap_get_persistance(bitmap)) {
>>>>> + continue;
>>>>> + }
>>>>> +
>>>>> + if (++new_nb_bitmaps > QCOW2_MAX_BITMAPS) {
>>>>> + error_setg(errp, "Too many persistent bitmaps");
>>>>> + goto fail;
>>>>> + }
>>>>> +
>>>>> + new_dir_size += calc_dir_entry_size(strlen(name), 0);
>>>>> + if (new_dir_size > QCOW2_MAX_BITMAP_DIRECTORY_SIZE) {
>>>>> + error_setg(errp, "Too large bitmap directory");
>>>>> + goto fail;
>>>>> + }
>>>> You only need to increment new_nb_bitmaps and increase new_dir_size if
>>>> the bitmap does not already exist in the image (i.e. if
>>>> find_bitmap_by_name() below returns NULL).
>>> Why? No, I need to check the whole sum and the whole size.
>> If the bitmap already exists, you don't create a new directory entry but
>> reuse the existing one. Therefore, the number of bitmaps in the image
>> and the directory size will not grow then.
>
> new_nb_bitmaps is not number of "newly created bitmaps", but just new
> value of field nb_bitmaps, so, all bitmaps - old and new are calculated
> into new_nb_bitmaps. Anyway, this misunderstanding shows that variable
> name is bad..
Yes. But when you store a bitmap of the same name as an existing one,
you are replacing it. The number of bitmaps does not grow in that case.
Max
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 512 bytes --]
next prev parent reply other threads:[~2016-12-19 15:34 UTC|newest]
Thread overview: 53+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-11-22 17:26 [Qemu-devel] [PATCH v9 00/21] qcow2: persistent dirty bitmaps Vladimir Sementsov-Ogievskiy
2016-11-22 17:26 ` [Qemu-devel] [PATCH 01/21] specs/qcow2: fix bitmap granularity qemu-specific note Vladimir Sementsov-Ogievskiy
2016-11-22 17:26 ` [Qemu-devel] [PATCH 02/21] specs/qcow2: do not use wording 'bitmap header' Vladimir Sementsov-Ogievskiy
2016-11-22 17:26 ` [Qemu-devel] [PATCH 03/21] hbitmap: improve dirty iter Vladimir Sementsov-Ogievskiy
2016-11-22 17:26 ` [Qemu-devel] [PATCH 04/21] tests: add hbitmap iter test Vladimir Sementsov-Ogievskiy
2016-11-22 17:26 ` [Qemu-devel] [PATCH 05/21] block: fix bdrv_dirty_bitmap_granularity signature Vladimir Sementsov-Ogievskiy
2016-11-22 17:26 ` [Qemu-devel] [PATCH 06/21] block/dirty-bitmap: add deserialize_ones func Vladimir Sementsov-Ogievskiy
2016-11-22 17:26 ` [Qemu-devel] [PATCH 07/21] qcow2: add bitmaps extension Vladimir Sementsov-Ogievskiy
2016-12-07 18:25 ` Max Reitz
2016-12-14 12:23 ` Vladimir Sementsov-Ogievskiy
2016-12-16 14:25 ` Max Reitz
2016-12-21 10:09 ` Vladimir Sementsov-Ogievskiy
2016-11-22 17:26 ` [Qemu-devel] [PATCH 08/21] block: introduce auto-loading bitmaps Vladimir Sementsov-Ogievskiy
2016-12-07 18:34 ` Max Reitz
2016-12-07 22:51 ` John Snow
2016-11-22 17:26 ` [Qemu-devel] [PATCH 09/21] qcow2: add .bdrv_load_autoloading_dirty_bitmaps Vladimir Sementsov-Ogievskiy
2016-12-07 20:51 ` Max Reitz
2016-12-14 15:54 ` Vladimir Sementsov-Ogievskiy
2016-12-16 14:37 ` Max Reitz
2016-12-19 11:54 ` Vladimir Sementsov-Ogievskiy
2016-11-22 17:26 ` [Qemu-devel] [PATCH 10/21] block/dirty-bitmap: add autoload field to BdrvDirtyBitmap Vladimir Sementsov-Ogievskiy
2016-11-22 17:26 ` [Qemu-devel] [PATCH 11/21] block: introduce persistent dirty bitmaps Vladimir Sementsov-Ogievskiy
2016-12-07 21:01 ` Max Reitz
2016-11-22 17:26 ` [Qemu-devel] [PATCH 12/21] block/dirty-bitmap: add bdrv_dirty_bitmap_next() Vladimir Sementsov-Ogievskiy
2016-11-22 17:26 ` [Qemu-devel] [PATCH 13/21] qcow2: add .bdrv_store_persistent_dirty_bitmaps() Vladimir Sementsov-Ogievskiy
2016-12-09 17:05 ` Max Reitz
2016-12-09 17:55 ` Vladimir Sementsov-Ogievskiy
2016-12-10 14:53 ` Max Reitz
2016-12-12 7:32 ` Vladimir Sementsov-Ogievskiy
2016-12-17 14:58 ` Vladimir Sementsov-Ogievskiy
2016-12-19 15:14 ` Max Reitz
2016-12-19 15:26 ` Vladimir Sementsov-Ogievskiy
2016-12-19 15:34 ` Max Reitz [this message]
2016-12-19 15:50 ` Vladimir Sementsov-Ogievskiy
2016-11-22 17:26 ` [Qemu-devel] [PATCH 14/21] block: add bdrv_can_store_dirty_bitmap Vladimir Sementsov-Ogievskiy
2016-12-09 17:12 ` Max Reitz
2016-11-22 17:26 ` [Qemu-devel] [PATCH 15/21] qcow2: add .bdrv_can_store_dirty_bitmap Vladimir Sementsov-Ogievskiy
2016-12-09 17:28 ` Max Reitz
2016-12-09 18:03 ` Vladimir Sementsov-Ogievskiy
2016-11-22 17:26 ` [Qemu-devel] [PATCH 16/21] qmp: add persistent flag to block-dirty-bitmap-add Vladimir Sementsov-Ogievskiy
2016-12-07 18:48 ` Eric Blake
2016-12-09 17:36 ` Max Reitz
2016-11-22 17:26 ` [Qemu-devel] [PATCH 17/21] qmp: add autoload parameter " Vladimir Sementsov-Ogievskiy
2016-12-09 17:55 ` Max Reitz
2016-11-22 17:26 ` [Qemu-devel] [PATCH 18/21] qmp: add x-debug-block-dirty-bitmap-sha256 Vladimir Sementsov-Ogievskiy
2016-12-13 16:09 ` Max Reitz
2016-11-22 17:26 ` [Qemu-devel] [PATCH 19/21] iotests: test qcow2 persistent dirty bitmap Vladimir Sementsov-Ogievskiy
2016-12-14 9:27 ` Max Reitz
2016-11-22 17:26 ` [Qemu-devel] [PATCH 20/21] qcow2-refcount: rename inc_refcounts() and make it public Vladimir Sementsov-Ogievskiy
2016-12-14 10:00 ` Max Reitz
2016-11-22 17:26 ` [Qemu-devel] [PATCH 21/21] qcow2-bitmap: refcounts Vladimir Sementsov-Ogievskiy
2016-12-14 10:27 ` Max Reitz
-- strict thread matches above, loose matches on Subject: below --
2016-11-09 18:17 [Qemu-devel] [PATCH v8 00/21] qcow2: persistent dirty bitmaps Vladimir Sementsov-Ogievskiy
2016-11-09 18:17 ` [Qemu-devel] [PATCH 13/21] qcow2: add .bdrv_store_persistent_dirty_bitmaps() Vladimir Sementsov-Ogievskiy
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=de2ebda3-a6db-d9da-9514-e86e3d9afa86@redhat.com \
--to=mreitz@redhat.com \
--cc=armbru@redhat.com \
--cc=den@openvz.org \
--cc=eblake@redhat.com \
--cc=famz@redhat.com \
--cc=jsnow@redhat.com \
--cc=kwolf@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
--cc=vsementsov@virtuozzo.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.