All of lore.kernel.org
 help / color / mirror / Atom feed
From: Max Reitz <mreitz@redhat.com>
To: John Snow <jsnow@redhat.com>, qemu-devel@nongnu.org
Cc: kwolf@redhat.com, famz@redhat.com, armbru@redhat.com,
	vsementsov@parallels.com, stefanha@redhat.com
Subject: Re: [Qemu-devel] [PATCH v12 06/17] block: Add bitmap successors
Date: Wed, 11 Feb 2015 11:50:01 -0500	[thread overview]
Message-ID: <54DB8839.3060901@redhat.com> (raw)
In-Reply-To: <1423532117-14490-7-git-send-email-jsnow@redhat.com>

On 2015-02-09 at 20:35, John Snow wrote:
> A bitmap successor is an anonymous BdrvDirtyBitmap that is intended to
> be created just prior to a sensitive operation (e.g. Incremental Backup)
> that can either succeed or fail, but during the course of which we still
> want a bitmap tracking writes.
>
> On creating a successor, we "freeze" the parent bitmap which prevents
> its deletion, enabling, anonymization, or creating a bitmap with the
> same name.
>
> On success, the parent bitmap can "abdicate" responsibility to the
> successor, which will inherit its name. The successor will have been
> tracking writes during the course of the backup operation. The parent
> will be safely deleted.
>
> On failure, we can "reclaim" the successor from the parent, unifying
> them such that the resulting bitmap describes all writes occurring since
> the last successful backup, for instance. Reclamation will thaw the
> parent, but not explicitly re-enable it.
>
> BdrvDirtyBitmap operations that target a single bitmap are protected
> by assertions that the bitmap is not frozen and/or disabled.
>
> BdrvDirtyBitmap operations that target a group of bitmaps, such as
> bdrv_{set,reset}_dirty will ignore frozen/disabled drives with a
> conditional instead.
>
> QMP transactions that enable/disable bitmaps have extra error checking
> surrounding them that prevent modifying bitmaps that are frozen.
>
> Signed-off-by: John Snow <jsnow@redhat.com>
> ---
>   block.c               | 104 +++++++++++++++++++++++++++++++++++++++++++++++++-
>   blockdev.c            |  22 +++++++++++
>   include/block/block.h |  10 +++++
>   qapi/block-core.json  |   3 ++
>   4 files changed, 138 insertions(+), 1 deletion(-)
>
> diff --git a/block.c b/block.c
> index 8d63375..8d84ace 100644
> --- a/block.c
> +++ b/block.c
> @@ -51,8 +51,17 @@
>   #include <windows.h>
>   #endif
>   
> +/**
> + * A BdrvDirtyBitmap can be in three possible states:
> + * (1) successor is false and disabled is false: full r/w mode
> + * (2) successor is false and disabled is true: read only mode ("disabled")
> + * (3) successor is set: frozen mode.
> + *     A frozen bitmap cannot be renamed, deleted, anonymized, cleared, set,
> + *     or enabled. A frozen bitmap can only abdicate() or reclaim().
> + */
>   struct BdrvDirtyBitmap {
>       HBitmap *bitmap;
> +    BdrvDirtyBitmap *successor;
>       char *name;
>       bool disabled;
>       QLIST_ENTRY(BdrvDirtyBitmap) list;
> @@ -5383,6 +5392,7 @@ BdrvDirtyBitmap *bdrv_find_dirty_bitmap(BlockDriverState *bs, const char *name)
>   
>   void bdrv_dirty_bitmap_make_anon(BlockDriverState *bs, BdrvDirtyBitmap *bitmap)
>   {
> +    assert(!bdrv_dirty_bitmap_frozen(bitmap));
>       g_free(bitmap->name);
>       bitmap->name = NULL;
>   }
> @@ -5418,9 +5428,98 @@ BdrvDirtyBitmap *bdrv_create_dirty_bitmap(BlockDriverState *bs,
>       return bitmap;
>   }
>   
> +bool bdrv_dirty_bitmap_frozen(BdrvDirtyBitmap *bitmap)
> +{
> +    return bitmap->successor;
> +}
> +
>   bool bdrv_dirty_bitmap_enabled(BdrvDirtyBitmap *bitmap)
>   {
> -    return !bitmap->disabled;
> +    return !(bitmap->disabled || bitmap->successor);
> +}
> +
> +/**
> + * Create a successor bitmap destined to replace this bitmap after an operation.
> + * Requires that the bitmap is not frozen and has no successor.
> + */
> +int bdrv_dirty_bitmap_create_successor(BlockDriverState *bs,
> +                                       BdrvDirtyBitmap *bitmap, Error **errp)
> +{
> +    uint64_t granularity;
> +    BdrvDirtyBitmap *child;
> +
> +    if (bdrv_dirty_bitmap_frozen(bitmap)) {
> +        error_setg(errp, "Cannot create a successor for a bitmap that is "
> +                   "currently frozen.");

Hm, I seem to remember Markus saying something about full stops at the 
end of error messages...

> +        return -1;
> +    }
> +    assert(!bitmap->successor);
> +
> +    /* Create an anonymous successor */
> +    granularity = bdrv_dirty_bitmap_granularity(bitmap);
> +    child = bdrv_create_dirty_bitmap(bs, granularity, NULL, errp);
> +    if (!child) {
> +        return -1;
> +    }
> +
> +    /* Successor will be on or off based on our current state. */
> +    child->disabled = bitmap->disabled;
> +
> +    /* Install the successor and freeze the parent */
> +    bitmap->successor = child;
> +    return 0;
> +}
> +
> +/**
> + * For a bitmap with a successor, yield our name to the successor,
> + * Delete the old bitmap, and return a handle to the new bitmap.
> + */
> +BdrvDirtyBitmap *bdrv_dirty_bitmap_abdicate(BlockDriverState *bs,
> +                                            BdrvDirtyBitmap *bitmap,
> +                                            Error **errp)
> +{
> +    char *name;
> +    BdrvDirtyBitmap *successor = bitmap->successor;
> +
> +    if (successor == NULL) {
> +        error_setg(errp, "Cannot relinquish control if "
> +                   "there's no successor present.\n");

So while I'm unsure about full stops, I am pretty sure that we don't 
really want newlines.

With the full stops and newlines removed (in all error_setg() calls in 
this patch):

Reviewed-by: Max Reitz <mreitz@redhat.com>

  reply	other threads:[~2015-02-11 16:50 UTC|newest]

Thread overview: 55+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-02-10  1:35 [Qemu-devel] [PATCH v12 00/17] block: incremental backup series John Snow
2015-02-10  1:35 ` [Qemu-devel] [PATCH v12 01/17] qapi: Add optional field "name" to block dirty bitmap John Snow
2015-02-10  1:35 ` [Qemu-devel] [PATCH v12 02/17] qmp: Add block-dirty-bitmap-add and block-dirty-bitmap-remove John Snow
2015-02-10 21:56   ` Max Reitz
2015-02-13 22:24   ` Eric Blake
2015-02-13 22:39     ` John Snow
2015-02-10  1:35 ` [Qemu-devel] [PATCH v12 03/17] block: Introduce bdrv_dirty_bitmap_granularity() John Snow
2015-02-10 22:03   ` Max Reitz
2015-02-11 18:57     ` John Snow
2015-02-11 18:58       ` Max Reitz
2015-02-10 22:13   ` Max Reitz
2015-02-10 22:15     ` John Snow
2015-02-10  1:35 ` [Qemu-devel] [PATCH v12 04/17] hbitmap: add hbitmap_merge John Snow
2015-02-10 22:16   ` Max Reitz
2015-02-10  1:35 ` [Qemu-devel] [PATCH v12 05/17] qmp: Add block-dirty-bitmap-enable and block-dirty-bitmap-disable John Snow
2015-02-11 16:26   ` Max Reitz
2015-02-10  1:35 ` [Qemu-devel] [PATCH v12 06/17] block: Add bitmap successors John Snow
2015-02-11 16:50   ` Max Reitz [this message]
2015-02-11 16:51     ` John Snow
2015-02-10  1:35 ` [Qemu-devel] [PATCH v12 07/17] qmp: Add support of "dirty-bitmap" sync mode for drive-backup John Snow
2015-02-11 17:47   ` Max Reitz
2015-02-11 17:54     ` John Snow
2015-02-11 18:18       ` Max Reitz
2015-02-11 18:31         ` John Snow
2015-02-11 18:33           ` Max Reitz
2015-02-11 21:13     ` John Snow
2015-02-13 17:33   ` Vladimir Sementsov-Ogievskiy
2015-02-13 18:35     ` John Snow
2015-02-10  1:35 ` [Qemu-devel] [PATCH v12 08/17] qmp: add block-dirty-bitmap-clear John Snow
2015-02-11 18:28   ` Max Reitz
2015-02-11 18:36     ` John Snow
2015-02-10  1:35 ` [Qemu-devel] [PATCH v12 09/17] qapi: Add transaction support to block-dirty-bitmap operations John Snow
2015-02-11 19:07   ` Max Reitz
2015-02-10  1:35 ` [Qemu-devel] [PATCH v12 10/17] qmp: Add dirty bitmap status fields in query-block John Snow
2015-02-11 19:10   ` Max Reitz
2015-02-11 19:19     ` John Snow
2015-02-10  1:35 ` [Qemu-devel] [PATCH v12 11/17] block: add BdrvDirtyBitmap documentation John Snow
2015-02-11 19:14   ` Max Reitz
2015-02-10  1:35 ` [Qemu-devel] [PATCH v12 12/17] block: Ensure consistent bitmap function prototypes John Snow
2015-02-11 19:20   ` Max Reitz
2015-02-10  1:35 ` [Qemu-devel] [PATCH v12 13/17] iotests: add invalid input incremental backup tests John Snow
2015-02-11 20:45   ` Max Reitz
2015-02-10  1:35 ` [Qemu-devel] [PATCH v12 14/17] iotests: add simple incremental backup case John Snow
2015-02-11 21:40   ` Max Reitz
2015-02-11 22:02     ` John Snow
2015-02-10  1:35 ` [Qemu-devel] [PATCH v12 15/17] iotests: add transactional incremental backup test John Snow
2015-02-11 21:49   ` Max Reitz
2015-02-10  1:35 ` [Qemu-devel] [PATCH v12 16/17] blkdebug: fix "once" rule John Snow
2015-02-11 21:50   ` Max Reitz
2015-02-11 22:04     ` John Snow
2015-02-10  1:35 ` [Qemu-devel] [PATCH v12 17/17] iotests: add incremental backup failure recovery test John Snow
2015-02-11 22:01   ` Max Reitz
2015-02-11 22:08     ` John Snow
2015-02-11 22:11       ` Max Reitz
2015-02-10 16:32 ` [Qemu-devel] [PATCH v12 00/17] block: incremental backup series John Snow

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=54DB8839.3060901@redhat.com \
    --to=mreitz@redhat.com \
    --cc=armbru@redhat.com \
    --cc=famz@redhat.com \
    --cc=jsnow@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    --cc=vsementsov@parallels.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.