diff options
Diffstat (limited to 'block/copy-before-write.c')
-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; } |