void commit_active_start(const char *job_id, BlockDriverState *bs,

                         BlockDriverState *base, int64_t speed,

                         BlockdevOnError on_error,

                         BlockCompletionFunc *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;

        }

    }



    mirror_start_job(job_id, bs, base, NULL, speed, 0, 0,

                     MIRROR_LEAVE_BACKING_CHAIN,

                     on_error, on_error, false, cb, opaque, &local_err,

                     &commit_active_job_driver, false, base);

    if (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(const char *job_id, BlockDriverState *bs,

                         BlockDriverState *base, int64_t speed,

                         BlockdevOnError on_error,

                         BlockCompletionFunc *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;

        }

    }



    mirror_start_job(job_id, bs, base, NULL, speed, 0, 0,

                     MIRROR_LEAVE_BACKING_CHAIN,

                     on_error, on_error, false, cb, opaque, &local_err,

                     &commit_active_job_driver, false, base);

    if (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(const char *VAR_0, BlockDriverState *VAR_1,

                         BlockDriverState *VAR_2, int64_t VAR_3,

                         BlockdevOnError VAR_4,

                         BlockCompletionFunc *VAR_5,

                         void *VAR_6, Error **VAR_7)

{

    int64_t length, base_length;

    int VAR_8;

    int VAR_9;

    Error *local_err = NULL;



    VAR_8 = bdrv_get_flags(VAR_2);



    if (bdrv_reopen(VAR_2, VAR_1->open_flags, VAR_7)) {

        return;

    }



    length = bdrv_getlength(VAR_1);

    if (length < 0) {

        error_setg_errno(VAR_7, -length,

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

        goto error_restore_flags;

    }



    base_length = bdrv_getlength(VAR_2);

    if (base_length < 0) {

        error_setg_errno(VAR_7, -base_length,

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

        goto error_restore_flags;

    }



    if (length > base_length) {

        VAR_9 = bdrv_truncate(VAR_2, length);

        if (VAR_9 < 0) {

            error_setg_errno(VAR_7, -VAR_9,

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

                             "resize of VAR_2 image failed",

                             VAR_1->filename, VAR_2->filename);

            goto error_restore_flags;

        }

    }



    mirror_start_job(VAR_0, VAR_1, VAR_2, NULL, VAR_3, 0, 0,

                     MIRROR_LEAVE_BACKING_CHAIN,

                     VAR_4, VAR_4, false, VAR_5, VAR_6, &local_err,

                     &commit_active_job_driver, false, VAR_2);

    if (local_err) {

        error_propagate(VAR_7, local_err);

        goto error_restore_flags;

    }



    return;



error_restore_flags:

    



    bdrv_reopen(VAR_2, VAR_8, NULL);

    return;

}

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