static void mirror_start_job(BlockDriverState *bs, BlockDriverState *target,
                             const char *replaces,
                             int64_t speed, uint32_t granularity,
                             int64_t buf_size,
                             BlockdevOnError on_source_error,
                             BlockdevOnError on_target_error,
                             bool unmap,
                             BlockCompletionFunc *cb,
                             void *opaque, Error **errp,
                             const BlockJobDriver *driver,
                             bool is_none_mode, BlockDriverState *base)
{
    MirrorBlockJob *s;
    BlockDriverState *replaced_bs;
    if (granularity == 0) {
        granularity = bdrv_get_default_bitmap_granularity(target);
    assert ((granularity & (granularity - 1)) == 0);
    if ((on_source_error == BLOCKDEV_ON_ERROR_STOP ||
         on_source_error == BLOCKDEV_ON_ERROR_ENOSPC) &&
        (!bs->blk || !blk_iostatus_is_enabled(bs->blk))) {
        error_setg(errp, QERR_INVALID_PARAMETER, "on-source-error");
    if (buf_size < 0) {
        error_setg(errp, "Invalid parameter 'buf-size'");
    if (buf_size == 0) {
        buf_size = DEFAULT_MIRROR_BUF_SIZE;
    s = block_job_create(driver, bs, speed, cb, opaque, errp);
    if (!s) {
    s->replaces = g_strdup(replaces);
    s->on_source_error = on_source_error;
    s->on_target_error = on_target_error;
    s->target = target;
    s->is_none_mode = is_none_mode;
    s->base = base;
    s->granularity = granularity;
    s->buf_size = ROUND_UP(buf_size, granularity);
    s->unmap = unmap;
    s->dirty_bitmap = bdrv_create_dirty_bitmap(bs, granularity, NULL, errp);
    if (!s->dirty_bitmap) {
        g_free(s->replaces);
        block_job_unref(&s->common);
    bdrv_op_block_all(s->target, s->common.blocker);
    bdrv_set_enable_write_cache(s->target, true);
    if (s->target->blk) {
        blk_set_on_error(s->target->blk, on_target_error, on_target_error);
        blk_iostatus_enable(s->target->blk);
    s->common.co = qemu_coroutine_create(mirror_run);
    trace_mirror_start(bs, s, s->common.co, opaque);
    qemu_coroutine_enter(s->common.co, s);
static void mirror_start_job(BlockDriverState *bs, BlockDriverState *target,
                             const char *replaces,
                             int64_t speed, uint32_t granularity,
                             int64_t buf_size,
                             BlockdevOnError on_source_error,
                             BlockdevOnError on_target_error,
                             bool unmap,
                             BlockCompletionFunc *cb,
                             void *opaque, Error **errp,
                             const BlockJobDriver *driver,
                             bool is_none_mode, BlockDriverState *base)
{
    MirrorBlockJob *s;
    BlockDriverState *replaced_bs;
    if (granularity == 0) {
        granularity = bdrv_get_default_bitmap_granularity(target);
    assert ((granularity & (granularity - 1)) == 0);
    if ((on_source_error == BLOCKDEV_ON_ERROR_STOP ||
         on_source_error == BLOCKDEV_ON_ERROR_ENOSPC) &&
        (!bs->blk || !blk_iostatus_is_enabled(bs->blk))) {
        error_setg(errp, QERR_INVALID_PARAMETER, "on-source-error");
    if (buf_size < 0) {
        error_setg(errp, "Invalid parameter 'buf-size'");
    if (buf_size == 0) {
        buf_size = DEFAULT_MIRROR_BUF_SIZE;
    s = block_job_create(driver, bs, speed, cb, opaque, errp);
    if (!s) {
    s->replaces = g_strdup(replaces);
    s->on_source_error = on_source_error;
    s->on_target_error = on_target_error;
    s->target = target;
    s->is_none_mode = is_none_mode;
    s->base = base;
    s->granularity = granularity;
    s->buf_size = ROUND_UP(buf_size, granularity);
    s->unmap = unmap;
    s->dirty_bitmap = bdrv_create_dirty_bitmap(bs, granularity, NULL, errp);
    if (!s->dirty_bitmap) {
        g_free(s->replaces);
        block_job_unref(&s->common);
    bdrv_op_block_all(s->target, s->common.blocker);
    bdrv_set_enable_write_cache(s->target, true);
    if (s->target->blk) {
        blk_set_on_error(s->target->blk, on_target_error, on_target_error);
        blk_iostatus_enable(s->target->blk);
    s->common.co = qemu_coroutine_create(mirror_run);
    trace_mirror_start(bs, s, s->common.co, opaque);
    qemu_coroutine_enter(s->common.co, s);
static void FUNC_0(BlockDriverState *VAR_0, BlockDriverState *VAR_1,
                             const char *VAR_2,
                             int64_t VAR_3, uint32_t VAR_4,
                             int64_t VAR_5,
                             BlockdevOnError VAR_6,
                             BlockdevOnError VAR_7,
                             bool VAR_8,
                             BlockCompletionFunc *VAR_9,
                             void *VAR_10, Error **VAR_11,
                             const BlockJobDriver *VAR_12,
                             bool VAR_13, BlockDriverState *VAR_14)
{
    MirrorBlockJob *s;
    BlockDriverState *replaced_bs;
    if (VAR_4 == 0) {
        VAR_4 = bdrv_get_default_bitmap_granularity(VAR_1);
    assert ((VAR_4 & (VAR_4 - 1)) == 0);
    if ((VAR_6 == BLOCKDEV_ON_ERROR_STOP ||
         VAR_6 == BLOCKDEV_ON_ERROR_ENOSPC) &&
        (!VAR_0->blk || !blk_iostatus_is_enabled(VAR_0->blk))) {
        error_setg(VAR_11, QERR_INVALID_PARAMETER, "on-source-error");
    if (VAR_5 < 0) {
        error_setg(VAR_11, "Invalid parameter 'buf-size'");
    if (VAR_5 == 0) {
        VAR_5 = DEFAULT_MIRROR_BUF_SIZE;
    s = block_job_create(VAR_12, VAR_0, VAR_3, VAR_9, VAR_10, VAR_11);
    if (!s) {
    s->VAR_2 = g_strdup(VAR_2);
    s->VAR_6 = VAR_6;
    s->VAR_7 = VAR_7;
    s->VAR_1 = VAR_1;
    s->VAR_13 = VAR_13;
    s->VAR_14 = VAR_14;
    s->VAR_4 = VAR_4;
    s->VAR_5 = ROUND_UP(VAR_5, VAR_4);
    s->VAR_8 = VAR_8;
    s->dirty_bitmap = bdrv_create_dirty_bitmap(VAR_0, VAR_4, NULL, VAR_11);
    if (!s->dirty_bitmap) {
        g_free(s->VAR_2);
        block_job_unref(&s->common);
    bdrv_op_block_all(s->VAR_1, s->common.blocker);
    bdrv_set_enable_write_cache(s->VAR_1, true);
    if (s->VAR_1->blk) {
        blk_set_on_error(s->VAR_1->blk, VAR_7, VAR_7);
        blk_iostatus_enable(s->VAR_1->blk);
    s->common.co = qemu_coroutine_create(mirror_run);
    trace_mirror_start(VAR_0, s, s->common.co, VAR_10);
    qemu_coroutine_enter(s->common.co, s);
static void FUNC_0(BlockDriverState *VAR_0, BlockDriverState *VAR_1,
const char *VAR_2,
int64_t VAR_3, uint32_t VAR_4,
int64_t VAR_5,
BlockdevOnError VAR_6,
BlockdevOnError VAR_7,
bool VAR_8,
BlockCompletionFunc *VAR_9,
void *VAR_10, Error **VAR_11,
const BlockJobDriver *VAR_12,
bool VAR_13, BlockDriverState *VAR_14)
{ MirrorBlockJob *s; BlockDriverState *replaced_bs; if (VAR_4 == 0) { VAR_4 = bdrv_get_default_bitmap_granularity(VAR_1); assert ((VAR_4 & (VAR_4 - 1)) == 0); if ((VAR_6 == BLOCKDEV_ON_ERROR_STOP ||
VAR_6 == BLOCKDEV_ON_ERROR_ENOSPC) &&
(!VAR_0->blk || !blk_iostatus_is_enabled(VAR_0->blk))) { error_setg(VAR_11, QERR_INVALID_PARAMETER, "on-source-error"); if (VAR_5 < 0) { error_setg(VAR_11, "Invalid parameter 'buf-size'"); if (VAR_5 == 0) { VAR_5 = DEFAULT_MIRROR_BUF_SIZE; s = block_job_create(VAR_12, VAR_0, VAR_3, VAR_9, VAR_10, VAR_11); if (!s) { s->VAR_2 = g_strdup(VAR_2); s->VAR_6 = VAR_6; s->VAR_7 = VAR_7; s->VAR_1 = VAR_1; s->VAR_13 = VAR_13; s->VAR_14 = VAR_14; s->VAR_4 = VAR_4; s->VAR_5 = ROUND_UP(VAR_5, VAR_4); s->VAR_8 = VAR_8; s->dirty_bitmap = bdrv_create_dirty_bitmap(VAR_0, VAR_4, NULL, VAR_11); if (!s->dirty_bitmap) { g_free(s->VAR_2); block_job_unref(&s->common); bdrv_op_block_all(s->VAR_1, s->common.blocker); bdrv_set_enable_write_cache(s->VAR_1, true); if (s->VAR_1->blk) { blk_set_on_error(s->VAR_1->blk, VAR_7, VAR_7); blk_iostatus_enable(s->VAR_1->blk); s->common.co = qemu_coroutine_create(mirror_run); trace_mirror_start(VAR_0, s, s->common.co, VAR_10); qemu_coroutine_enter(s->common.co, s);