diff options
author | Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> | 2021-08-24 11:38:35 +0300 |
---|---|---|
committer | Hanna Reitz <hreitz@redhat.com> | 2021-09-01 14:03:47 +0200 |
commit | 7ddbce2dec96f1d881db0a81541072a23d2b89b4 (patch) | |
tree | 19bf36b5b9bfa854b25eeea943732e77e943c896 /block | |
parent | 3c1e63277e0e8528967ee179b63ef214d3a9a683 (diff) | |
download | qemu-7ddbce2dec96f1d881db0a81541072a23d2b89b4.zip qemu-7ddbce2dec96f1d881db0a81541072a23d2b89b4.tar.gz qemu-7ddbce2dec96f1d881db0a81541072a23d2b89b4.tar.bz2 |
block/copy-before-write: bdrv_cbw_append(): replace child at last
Refactor the function to replace child at last. Thus we don't need to
revert it and code is simplified.
block-copy state initialization being done before replacing the child
doesn't need any drained section.
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
Message-Id: <20210824083856.17408-14-vsementsov@virtuozzo.com>
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
Diffstat (limited to 'block')
-rw-r--r-- | block/copy-before-write.c | 33 |
1 files changed, 11 insertions, 22 deletions
diff --git a/block/copy-before-write.c b/block/copy-before-write.c index 7a6c15f..adbbc64 100644 --- a/block/copy-before-write.c +++ b/block/copy-before-write.c @@ -172,7 +172,6 @@ BlockDriverState *bdrv_cbw_append(BlockDriverState *source, int ret; BDRVCopyBeforeWriteState *state; BlockDriverState *top; - bool appended = false; assert(source->total_sectors == target->total_sectors); @@ -196,8 +195,7 @@ BlockDriverState *bdrv_cbw_append(BlockDriverState *source, BDRV_CHILD_DATA, errp); if (!state->target) { error_prepend(errp, "Cannot attach target child: "); - bdrv_unref(top); - return NULL; + goto fail; } bdrv_ref(source); @@ -206,18 +204,8 @@ BlockDriverState *bdrv_cbw_append(BlockDriverState *source, errp); if (!top->file) { error_prepend(errp, "Cannot attach file child: "); - bdrv_unref(top); - return NULL; - } - - bdrv_drained_begin(source); - - ret = bdrv_replace_node(source, top, errp); - if (ret < 0) { - error_prepend(errp, "Cannot append copy-before-write filter: "); goto fail; } - appended = true; state->bcs = block_copy_state_new(top->file, state->target, false, compress, errp); @@ -225,21 +213,22 @@ BlockDriverState *bdrv_cbw_append(BlockDriverState *source, error_prepend(errp, "Cannot create block-copy-state: "); goto fail; } - *bcs = state->bcs; + 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; + } + + *bcs = state->bcs; return top; fail: - if (appended) { - bdrv_cbw_drop(top); - } else { - bdrv_unref(top); - } - - bdrv_drained_end(source); - + block_copy_state_free(state->bcs); + bdrv_unref(top); return NULL; } |