From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
To: qemu-block@nongnu.org
Cc: qemu-devel@nongnu.org, eblake@redhat.com, armbru@redhat.com,
crosa@redhat.com, ehabkost@redhat.com, berrange@redhat.com,
pbonzini@redhat.com, vsementsov@virtuozzo.com, jsnow@redhat.com,
mreitz@redhat.com, kwolf@redhat.com, den@openvz.org
Subject: [PATCH v2 21/33] block/copy-before-write: make public block driver
Date: Thu, 20 May 2021 17:21:53 +0300 [thread overview]
Message-ID: <20210520142205.607501-22-vsementsov@virtuozzo.com> (raw)
In-Reply-To: <20210520142205.607501-1-vsementsov@virtuozzo.com>
Finally, copy-before-write gets own .bdrv_open and .bdrv_close
handlers, block_init() call and becomes available through bdrv_open().
To achieve this:
- cbw_init gets unused flags argument and becomes cbw_open
- block_copy_state_free() call moved to new cbw_close()
- in bdrv_cbw_append:
- options are completed with driver and node-name, and we can simply
use bdrv_insert_node() to do both open and drained replacing
- in bdrv_cbw_drop:
- cbw_close() is now responsible for freeing s->bcs, so don't do it
here
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
---
block/copy-before-write.c | 60 ++++++++++++++++++---------------------
1 file changed, 28 insertions(+), 32 deletions(-)
diff --git a/block/copy-before-write.c b/block/copy-before-write.c
index ba2466a328..6ed5bce1f1 100644
--- a/block/copy-before-write.c
+++ b/block/copy-before-write.c
@@ -144,7 +144,8 @@ static void cbw_child_perm(BlockDriverState *bs, BdrvChild *c,
}
}
-static int cbw_init(BlockDriverState *bs, QDict *options, Error **errp)
+static int cbw_open(BlockDriverState *bs, QDict *options, int flags,
+ Error **errp)
{
BDRVCopyBeforeWriteState *s = bs->opaque;
BdrvDirtyBitmap *copy_bitmap;
@@ -191,10 +192,21 @@ static int cbw_init(BlockDriverState *bs, QDict *options, Error **errp)
return 0;
}
+static void cbw_close(BlockDriverState *bs)
+{
+ BDRVCopyBeforeWriteState *s = bs->opaque;
+
+ block_copy_state_free(s->bcs);
+ s->bcs = NULL;
+}
+
BlockDriver bdrv_cbw_filter = {
.format_name = "copy-before-write",
.instance_size = sizeof(BDRVCopyBeforeWriteState),
+ .bdrv_open = cbw_open,
+ .bdrv_close = cbw_close,
+
.bdrv_co_preadv = cbw_co_preadv,
.bdrv_co_pwritev = cbw_co_pwritev,
.bdrv_co_pwrite_zeroes = cbw_co_pwrite_zeroes,
@@ -216,57 +228,41 @@ BlockDriverState *bdrv_cbw_append(BlockDriverState *source,
Error **errp)
{
ERRP_GUARD();
- int ret;
BDRVCopyBeforeWriteState *state;
BlockDriverState *top;
QDict *opts;
assert(source->total_sectors == target->total_sectors);
- top = bdrv_new_open_driver(&bdrv_cbw_filter, filter_node_name,
- BDRV_O_RDWR, errp);
- if (!top) {
- error_prepend(errp, "Cannot open driver: ");
- return NULL;
- }
- state = top->opaque;
-
opts = qdict_new();
+ qdict_put_str(opts, "driver", "copy-before-write");
+ if (filter_node_name) {
+ qdict_put_str(opts, "node-name", filter_node_name);
+ }
qdict_put_str(opts, "file", bdrv_get_node_name(source));
qdict_put_str(opts, "target", bdrv_get_node_name(target));
qdict_put_bool(opts, "x-deprecated-compress", compress);
- ret = cbw_init(top, opts, errp);
- qobject_unref(opts);
- if (ret < 0) {
- goto fail;
- }
-
- bdrv_drained_begin(source);
- ret = bdrv_replace_node(source, top, errp);
- bdrv_drained_end(source);
- if (ret < 0) {
- error_prepend(errp, "Cannot append copy-before-write filter: ");
- goto fail;
+ top = bdrv_insert_node(source, opts, BDRV_O_RDWR, errp);
+ if (!top) {
+ return NULL;
}
+ state = top->opaque;
*bcs = state->bcs;
return top;
-
-fail:
- block_copy_state_free(state->bcs);
- bdrv_unref(top);
- return NULL;
}
void bdrv_cbw_drop(BlockDriverState *bs)
{
- BDRVCopyBeforeWriteState *s = bs->opaque;
-
bdrv_drop_filter(bs, &error_abort);
-
- block_copy_state_free(s->bcs);
-
bdrv_unref(bs);
}
+
+static void cbw_init(void)
+{
+ bdrv_register(&bdrv_cbw_filter);
+}
+
+block_init(cbw_init);
--
2.29.2
next prev parent reply other threads:[~2021-05-20 14:47 UTC|newest]
Thread overview: 62+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-05-20 14:21 [PATCH v2 00/33] block: publish backup-top filter Vladimir Sementsov-Ogievskiy
2021-05-20 14:21 ` [PATCH v2 01/33] block: rename bdrv_replace_child to bdrv_replace_child_tran Vladimir Sementsov-Ogievskiy
2021-05-31 12:52 ` Max Reitz
2021-05-20 14:21 ` [PATCH v2 02/33] block: comment graph-modifying function not updating permissions Vladimir Sementsov-Ogievskiy
2021-05-31 12:56 ` Max Reitz
2021-05-20 14:21 ` [PATCH v2 03/33] block: introduce bdrv_replace_child_bs() Vladimir Sementsov-Ogievskiy
2021-05-31 14:18 ` Max Reitz
2021-05-20 14:21 ` [PATCH v2 04/33] block: introduce blk_replace_bs Vladimir Sementsov-Ogievskiy
2021-05-20 14:21 ` [PATCH v2 05/33] qdev-properties: PropertyInfo: add realized_set_allowed field Vladimir Sementsov-Ogievskiy
2021-05-31 15:51 ` Max Reitz
2021-05-20 14:21 ` [PATCH v2 06/33] qdev: allow setting drive property for realized device Vladimir Sementsov-Ogievskiy
2021-05-31 15:59 ` Max Reitz
2021-05-20 14:21 ` [PATCH v2 07/33] block: rename backup-top to copy-before-write Vladimir Sementsov-Ogievskiy
2021-05-31 16:08 ` Max Reitz
2021-05-20 14:21 ` [PATCH v2 08/33] block/backup: drop support for copy_range Vladimir Sementsov-Ogievskiy
2021-05-28 15:29 ` Vladimir Sementsov-Ogievskiy
2021-05-20 14:21 ` [PATCH v2 09/33] block-copy: always set BDRV_REQ_SERIALISING flag Vladimir Sementsov-Ogievskiy
2021-05-20 14:21 ` [PATCH v2 10/33] block/backup: move cluster size calculation to block-copy Vladimir Sementsov-Ogievskiy
2021-05-20 14:21 ` [PATCH v2 11/33] block/copy-before-write: relax permission requirements when no parents Vladimir Sementsov-Ogievskiy
2021-05-20 14:21 ` [PATCH v2 12/33] block/copy-before-write: drop extra bdrv_unref on failure path Vladimir Sementsov-Ogievskiy
2021-05-31 16:19 ` Max Reitz
2021-05-20 14:21 ` [PATCH v2 13/33] block/copy-before-write: use file child instead of backing Vladimir Sementsov-Ogievskiy
2021-05-31 16:22 ` Max Reitz
2021-05-20 14:21 ` [PATCH v2 14/33] block/copy-before-write: bdrv_cbw_append(): replace child at last Vladimir Sementsov-Ogievskiy
2021-05-31 16:55 ` Max Reitz
2021-05-20 14:21 ` [PATCH v2 15/33] block/copy-before-write: introduce cbw_init() Vladimir Sementsov-Ogievskiy
2021-05-31 16:57 ` Max Reitz
2021-05-20 14:21 ` [PATCH v2 16/33] block/copy-before-write: cbw_init(): rename variables Vladimir Sementsov-Ogievskiy
2021-05-20 14:21 ` [PATCH v2 17/33] block/copy-before-write: cbw_init(): use file child after attaching Vladimir Sementsov-Ogievskiy
2021-05-20 14:21 ` [PATCH v2 18/33] block/copy-before-write: cbw_init(): use options Vladimir Sementsov-Ogievskiy
2021-05-31 17:03 ` Max Reitz
2021-05-20 14:21 ` [PATCH v2 19/33] block/copy-before-write: initialize block-copy bitmap Vladimir Sementsov-Ogievskiy
2021-05-31 17:10 ` Max Reitz
2021-05-20 14:21 ` [PATCH v2 20/33] block/block-copy: make setting progress optional Vladimir Sementsov-Ogievskiy
2021-08-10 15:22 ` Hanna Reitz
2021-05-20 14:21 ` Vladimir Sementsov-Ogievskiy [this message]
2021-05-20 14:21 ` [PATCH v2 22/33] qapi: publish copy-before-write filter Vladimir Sementsov-Ogievskiy
2021-06-01 9:08 ` Max Reitz
2021-05-20 14:21 ` [PATCH v2 23/33] python/qemu/machine.py: refactor _qemu_args() Vladimir Sementsov-Ogievskiy
2021-06-01 10:05 ` Max Reitz
2021-05-20 14:21 ` [PATCH v2 24/33] python/qemu/machine: QEMUMachine: improve qmp() method Vladimir Sementsov-Ogievskiy
2021-06-01 10:19 ` Max Reitz
2021-05-20 14:21 ` [PATCH v2 25/33] iotests.py: VM: add own __enter__ method Vladimir Sementsov-Ogievskiy
2021-06-01 10:58 ` Max Reitz
2021-05-20 14:21 ` [PATCH v2 26/33] iotests/222: fix pylint and mypy complains Vladimir Sementsov-Ogievskiy
2021-06-01 11:16 ` Max Reitz
2021-05-20 14:21 ` [PATCH v2 27/33] iotests/222: constantly use single quotes for strings Vladimir Sementsov-Ogievskiy
2021-06-01 11:17 ` Max Reitz
2021-05-20 14:22 ` [PATCH v2 28/33] iotests: move 222 to tests/image-fleecing Vladimir Sementsov-Ogievskiy
2021-06-01 11:17 ` Max Reitz
2021-05-20 14:22 ` [PATCH v2 29/33] iotests.py: hmp_qemu_io: support qdev Vladimir Sementsov-Ogievskiy
2021-06-01 11:19 ` Max Reitz
2021-05-20 14:22 ` [PATCH v2 30/33] iotests/image-fleecing: proper source device Vladimir Sementsov-Ogievskiy
2021-06-01 11:29 ` Max Reitz
2021-05-20 14:22 ` [PATCH v2 31/33] iotests/image-fleecing: rename tgt_node Vladimir Sementsov-Ogievskiy
2021-06-01 11:46 ` Max Reitz
2021-05-20 14:22 ` [PATCH v2 32/33] iotests/image-fleecing: prepare for adding new test-case Vladimir Sementsov-Ogievskiy
2021-06-01 11:47 ` Max Reitz
2021-05-20 14:22 ` [PATCH v2 33/33] iotests/image-fleecing: add test-case for copy-before-write filter Vladimir Sementsov-Ogievskiy
2021-06-01 12:02 ` Max Reitz
2021-05-31 17:11 ` [PATCH v2 00/33] block: publish backup-top filter Max Reitz
2021-05-31 17:35 ` 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=20210520142205.607501-22-vsementsov@virtuozzo.com \
--to=vsementsov@virtuozzo.com \
--cc=armbru@redhat.com \
--cc=berrange@redhat.com \
--cc=crosa@redhat.com \
--cc=den@openvz.org \
--cc=eblake@redhat.com \
--cc=ehabkost@redhat.com \
--cc=jsnow@redhat.com \
--cc=kwolf@redhat.com \
--cc=mreitz@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).