block/copy-before-write: cbw_init(): use options

One more step closer to .bdrv_open(): use options instead of plain
arguments. Move to bdrv_open_child() calls, native for drive open
handlers.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Hanna Reitz <hreitz@redhat.com>
Message-Id: <20210824083856.17408-19-vsementsov@virtuozzo.com>
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
This commit is contained in:
Vladimir Sementsov-Ogievskiy 2021-08-24 11:38:40 +03:00 committed by Hanna Reitz
parent 4c1e992bf2
commit f44fd7399c

View File

@ -144,25 +144,20 @@ static void cbw_child_perm(BlockDriverState *bs, BdrvChild *c,
} }
} }
static int cbw_init(BlockDriverState *bs, BlockDriverState *source, static int cbw_init(BlockDriverState *bs, QDict *options, Error **errp)
BlockDriverState *target, Error **errp)
{ {
BDRVCopyBeforeWriteState *s = bs->opaque; BDRVCopyBeforeWriteState *s = bs->opaque;
bdrv_ref(target); bs->file = bdrv_open_child(NULL, options, "file", bs, &child_of_bds,
s->target = bdrv_attach_child(bs, target, "target", &child_of_bds, BDRV_CHILD_FILTERED | BDRV_CHILD_PRIMARY,
BDRV_CHILD_DATA, errp); false, errp);
if (!s->target) { if (!bs->file) {
error_prepend(errp, "Cannot attach target child: ");
return -EINVAL; return -EINVAL;
} }
bdrv_ref(source); s->target = bdrv_open_child(NULL, options, "target", bs, &child_of_bds,
bs->file = bdrv_attach_child(bs, source, "file", &child_of_bds, BDRV_CHILD_DATA, false, errp);
BDRV_CHILD_FILTERED | BDRV_CHILD_PRIMARY, if (!s->target) {
errp);
if (!bs->file) {
error_prepend(errp, "Cannot attach file child: ");
return -EINVAL; return -EINVAL;
} }
@ -209,6 +204,7 @@ BlockDriverState *bdrv_cbw_append(BlockDriverState *source,
int ret; int ret;
BDRVCopyBeforeWriteState *state; BDRVCopyBeforeWriteState *state;
BlockDriverState *top; BlockDriverState *top;
QDict *opts;
assert(source->total_sectors == target->total_sectors); assert(source->total_sectors == target->total_sectors);
@ -220,7 +216,12 @@ BlockDriverState *bdrv_cbw_append(BlockDriverState *source,
} }
state = top->opaque; state = top->opaque;
ret = cbw_init(top, source, target, errp); opts = qdict_new();
qdict_put_str(opts, "file", bdrv_get_node_name(source));
qdict_put_str(opts, "target", bdrv_get_node_name(target));
ret = cbw_init(top, opts, errp);
qobject_unref(opts);
if (ret < 0) { if (ret < 0) {
goto fail; goto fail;
} }