void commit_active_start(BlockDriverState *bs, BlockDriverState *base,

                         int64_t speed,

                         BlockdevOnError on_error,

                         BlockDriverCompletionFunc *cb,

                         void *opaque, Error **errp)

{

    int64_t length, base_length;

    int orig_base_flags;

    int ret;

    Error *local_err = NULL;



    orig_base_flags = bdrv_get_flags(base);



    if (bdrv_reopen(base, bs->open_flags, errp)) {

        return;

    }



    length = bdrv_getlength(bs);

    if (length < 0) {

        error_setg_errno(errp, -length,

                         "Unable to determine length of %s", bs->filename);

        goto error_restore_flags;

    }



    base_length = bdrv_getlength(base);

    if (base_length < 0) {

        error_setg_errno(errp, -base_length,

                         "Unable to determine length of %s", base->filename);

        goto error_restore_flags;

    }



    if (length > base_length) {

        ret = bdrv_truncate(base, length);

        if (ret < 0) {

            error_setg_errno(errp, -ret,

                            "Top image %s is larger than base image %s, and "

                             "resize of base image failed",

                             bs->filename, base->filename);

            goto error_restore_flags;

        }

    }



    bdrv_ref(base);

    mirror_start_job(bs, base, speed, 0, 0,

                     on_error, on_error, cb, opaque, &local_err,

                     &commit_active_job_driver, false, base);

    if (error_is_set(&local_err)) {

        error_propagate(errp, local_err);

        goto error_restore_flags;

    }



    return;



error_restore_flags:

    /* ignore error and errp for bdrv_reopen, because we want to propagate

     * the original error */

    bdrv_reopen(base, orig_base_flags, NULL);

    return;

}

void commit_active_start(BlockDriverState *bs, BlockDriverState *base,

                         int64_t speed,

                         BlockdevOnError on_error,

                         BlockDriverCompletionFunc *cb,

                         void *opaque, Error **errp)

{

    int64_t length, base_length;

    int orig_base_flags;

    int ret;

    Error *local_err = NULL;



    orig_base_flags = bdrv_get_flags(base);



    if (bdrv_reopen(base, bs->open_flags, errp)) {

        return;

    }



    length = bdrv_getlength(bs);

    if (length < 0) {

        error_setg_errno(errp, -length,

                         "Unable to determine length of %s", bs->filename);

        goto error_restore_flags;

    }



    base_length = bdrv_getlength(base);

    if (base_length < 0) {

        error_setg_errno(errp, -base_length,

                         "Unable to determine length of %s", base->filename);

        goto error_restore_flags;

    }



    if (length > base_length) {

        ret = bdrv_truncate(base, length);

        if (ret < 0) {

            error_setg_errno(errp, -ret,

                            "Top image %s is larger than base image %s, and "

                             "resize of base image failed",

                             bs->filename, base->filename);

            goto error_restore_flags;

        }

    }



    bdrv_ref(base);

    mirror_start_job(bs, base, speed, 0, 0,

                     on_error, on_error, cb, opaque, &local_err,

                     &commit_active_job_driver, false, base);

    if (error_is_set(&local_err)) {

        error_propagate(errp, local_err);

        goto error_restore_flags;

    }



    return;



error_restore_flags:

    



    bdrv_reopen(base, orig_base_flags, NULL);

    return;

}

void FUNC_0(BlockDriverState *VAR_0, BlockDriverState *VAR_1,

                         int64_t VAR_2,

                         BlockdevOnError VAR_3,

                         BlockDriverCompletionFunc *VAR_4,

                         void *VAR_5, Error **VAR_6)

{

    int64_t length, base_length;

    int VAR_7;

    int VAR_8;

    Error *local_err = NULL;



    VAR_7 = bdrv_get_flags(VAR_1);



    if (bdrv_reopen(VAR_1, VAR_0->open_flags, VAR_6)) {

        return;

    }



    length = bdrv_getlength(VAR_0);

    if (length < 0) {

        error_setg_errno(VAR_6, -length,

                         "Unable to determine length of %s", VAR_0->filename);

        goto error_restore_flags;

    }



    base_length = bdrv_getlength(VAR_1);

    if (base_length < 0) {

        error_setg_errno(VAR_6, -base_length,

                         "Unable to determine length of %s", VAR_1->filename);

        goto error_restore_flags;

    }



    if (length > base_length) {

        VAR_8 = bdrv_truncate(VAR_1, length);

        if (VAR_8 < 0) {

            error_setg_errno(VAR_6, -VAR_8,

                            "Top image %s is larger than VAR_1 image %s, and "

                             "resize of VAR_1 image failed",

                             VAR_0->filename, VAR_1->filename);

            goto error_restore_flags;

        }

    }



    bdrv_ref(VAR_1);

    mirror_start_job(VAR_0, VAR_1, VAR_2, 0, 0,

                     VAR_3, VAR_3, VAR_4, VAR_5, &local_err,

                     &commit_active_job_driver, false, VAR_1);

    if (error_is_set(&local_err)) {

        error_propagate(VAR_6, local_err);

        goto error_restore_flags;

    }



    return;



error_restore_flags:

    



    bdrv_reopen(VAR_1, VAR_7, NULL);

    return;

}

void FUNC_0(BlockDriverState *VAR_0, BlockDriverState *VAR_1,
int64_t VAR_2,
BlockdevOnError VAR_3,
BlockDriverCompletionFunc *VAR_4,
void *VAR_5, Error **VAR_6)
{ int64_t length, base_length; int VAR_7; int VAR_8; Error *local_err = NULL; VAR_7 = bdrv_get_flags(VAR_1); if (bdrv_reopen(VAR_1, VAR_0->open_flags, VAR_6)) { return; } length = bdrv_getlength(VAR_0); if (length < 0) { error_setg_errno(VAR_6, -length,
"Unable to determine length of %s", VAR_0->filename); goto error_restore_flags; } base_length = bdrv_getlength(VAR_1); if (base_length < 0) { error_setg_errno(VAR_6, -base_length,
"Unable to determine length of %s", VAR_1->filename); goto error_restore_flags; } if (length > base_length) { VAR_8 = bdrv_truncate(VAR_1, length); if (VAR_8 < 0) { error_setg_errno(VAR_6, -VAR_8,
"Top image %s is larger than VAR_1 image %s, and "
"resize of VAR_1 image failed",
VAR_0->filename, VAR_1->filename); goto error_restore_flags; } } bdrv_ref(VAR_1); mirror_start_job(VAR_0, VAR_1, VAR_2, 0, 0,
VAR_3, VAR_3, VAR_4, VAR_5, &local_err,
&commit_active_job_driver, false, VAR_1); if (error_is_set(&local_err)) { error_propagate(VAR_6, local_err); goto error_restore_flags; } return; error_restore_flags:
bdrv_reopen(VAR_1, VAR_7, NULL); return; }