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>
master
Vladimir Sementsov-Ogievskiy 2021-08-24 11:38:40 +03:00 committed by Hanna Reitz
parent 4c1e992bf2
commit f44fd7399c
1 changed files with 15 additions and 14 deletions

View File

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