From: "Benoît Canet" <benoit.canet@irqsave.net>
To: qemu-devel@nongnu.org
Cc: kwolf@redhat.com, jcody@redhat.com, stefanha@redhat.com
Subject: Re: [Qemu-devel] [PATCH V3] block: Add BlockDriver.bdrv_check_ext_snapshot.
Date: Tue, 1 Oct 2013 17:38:44 +0200 [thread overview]
Message-ID: <20131001153843.GC3342@irqsave.net> (raw)
In-Reply-To: <1380541015-10492-2-git-send-email-benoit@irqsave.net>
Le Monday 30 Sep 2013 à 13:36:55 (+0200), Benoît Canet a écrit :
> This field is used by blkverify to disable external snapshots creation.
> I will also be used by block filters like quorum to disable external snapshots
> creation.
>
> Signed-off-by: Benoit Canet <benoit@irqsave.net>
> ---
> block.c | 14 ++++++++++++++
> block/blkverify.c | 2 ++
> blockdev.c | 5 +++++
> include/block/block.h | 14 ++++++++++++++
> include/block/block_int.h | 6 ++++++
> 5 files changed, 41 insertions(+)
>
> diff --git a/block.c b/block.c
> index 93e113a..d54b5e2 100644
> --- a/block.c
> +++ b/block.c
> @@ -4632,3 +4632,17 @@ int bdrv_amend_options(BlockDriverState *bs, QEMUOptionParameter *options)
> }
> return bs->drv->bdrv_amend_options(bs, options);
> }
> +
> +ExtSnapshotPerm bdrv_check_ext_snapshot(BlockDriverState *bs)
> +{
> + /* external snashots are allowed by defaults */
> + if (!bs->drv->bdrv_check_ext_snapshot) {
> + return EXT_SNAPSHOT_ALLOWED;
> + }
> + return bs->drv->bdrv_check_ext_snapshot(bs);
> +}
> +
> +ExtSnapshotPerm bdrv_check_ext_snapshot_forbidden(BlockDriverState *bs)
> +{
> + return EXT_SNAPSHOT_FORBIDDEN;
> +}
> diff --git a/block/blkverify.c b/block/blkverify.c
> index 2077d8a..b64c638 100644
> --- a/block/blkverify.c
> +++ b/block/blkverify.c
> @@ -313,6 +313,8 @@ static BlockDriver bdrv_blkverify = {
> .bdrv_aio_readv = blkverify_aio_readv,
> .bdrv_aio_writev = blkverify_aio_writev,
> .bdrv_aio_flush = blkverify_aio_flush,
> +
> + .bdrv_check_ext_snapshot = bdrv_check_ext_snapshot_forbidden,
> };
>
> static void bdrv_blkverify_init(void)
> diff --git a/blockdev.c b/blockdev.c
> index 8aa66a9..92029d8 100644
> --- a/blockdev.c
> +++ b/blockdev.c
> @@ -1131,6 +1131,11 @@ static void external_snapshot_prepare(BlkTransactionState *common,
> }
> }
>
> + if (bdrv_check_ext_snapshot(state->old_bs) != EXT_SNAPSHOT_ALLOWED) {
> + error_set(errp, QERR_FEATURE_DISABLED, "snapshot");
> + return;
> + }
> +
> flags = state->old_bs->open_flags;
>
> /* create new image w/backing file */
> diff --git a/include/block/block.h b/include/block/block.h
> index f808550..2bf0e12 100644
> --- a/include/block/block.h
> +++ b/include/block/block.h
> @@ -244,6 +244,20 @@ int bdrv_check(BlockDriverState *bs, BdrvCheckResult *res, BdrvCheckMode fix);
>
> int bdrv_amend_options(BlockDriverState *bs_new, QEMUOptionParameter *options);
>
> +/* external snapshots */
> +
> +typedef enum {
> + EXT_SNAPSHOT_ALLOWED,
> + EXT_SNAPSHOT_FORBIDDEN,
> +} ExtSnapshotPerm;
> +
> +/* return EXT_SNAPSHOT_ALLOWED if external snapshot is allowed
> + * return EXT_SNAPSHOT_FORBIDEN if external snapshot is forbiden
> + */
> +ExtSnapshotPerm bdrv_check_ext_snapshot(BlockDriverState *bs);
> +/* helper used to forbid external snapshots like in blkverify */
> +ExtSnapshotPerm bdrv_check_ext_snapshot_forbidden(BlockDriverState *bs);
> +
> /* async block I/O */
> typedef void BlockDriverDirtyHandler(BlockDriverState *bs, int64_t sector,
> int sector_num);
> diff --git a/include/block/block_int.h b/include/block/block_int.h
> index 211087a..e6a14ae 100644
> --- a/include/block/block_int.h
> +++ b/include/block/block_int.h
> @@ -67,6 +67,12 @@ typedef struct BdrvTrackedRequest {
> struct BlockDriver {
> const char *format_name;
> int instance_size;
> +
> + /* if not defined external snapshots are allowed
> + * future block filters will query their children to build the response
> + */
> + ExtSnapshotPerm (*bdrv_check_ext_snapshot)(BlockDriverState *bs);
> +
> int (*bdrv_probe)(const uint8_t *buf, int buf_size, const char *filename);
> int (*bdrv_probe_device)(const char *filename);
>
> --
> 1.8.1.2
>
>
Well this doesn't work with protocols.
When using quorum info block show virtio1 as raw.
When doing a snapshot with quorum snapshot "desactivated" by this patch it seems
blockdev is manipulating a raw BlockDriverState and not the quorum one so
this fail.
(qemu) info block
virtio0: /home/benoit/images/debian.raw (raw)
[not inserted]
virtio1: (raw) <- quorum
[not inserted]
ide1-cd0: [not inserted]
Removable device: not locked, tray closed
(qemu) snapshot_blkdev virtio1 blah
Could not open '': Could not open '': No such file or directory: No such file or
(qemu) qemu: terminating on signal 2
Kevin: Is making quorum a protocol a good idea to start with ?
Do you have an idea on how to fix this ?
Best regards
Benoît
prev parent reply other threads:[~2013-10-01 15:39 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-09-30 11:36 [Qemu-devel] [PATCH V3] disable blkverify external snapshot creation Benoît Canet
2013-09-30 11:36 ` [Qemu-devel] [PATCH V3] block: Add BlockDriver.bdrv_check_ext_snapshot Benoît Canet
2013-09-30 17:41 ` Jeff Cody
2013-10-01 15:38 ` Benoît Canet [this message]
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=20131001153843.GC3342@irqsave.net \
--to=benoit.canet@irqsave.net \
--cc=jcody@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.