Commit 4ebe0617 authored by Sam Eiderman's avatar Sam Eiderman Committed by Max Reitz
Browse files

qemu-img: rebase: Reuse parent BlockDriverState



In safe mode we open the entire chain, including the parent backing
file of the rebased file.
Do not open a new BlockBackend for the parent backing file, which
saves opening the rest of the chain twice, which for long chains
saves many "pricy" bdrv_open() calls.

Permissions for blk_new() were copied from blk_new_open() when
flags = 0.

Reviewed-by: default avatarKarl Heubaum <karl.heubaum@oracle.com>
Reviewed-by: default avatarEyal Moscovici <eyal.moscovici@oracle.com>
Signed-off-by: default avatarSagi Amit <sagi.amit@oracle.com>
Co-developed-by: default avatarSagi Amit <sagi.amit@oracle.com>
Signed-off-by: default avatarSam Eiderman <shmuel.eiderman@oracle.com>
Message-id: 20190523163337.4497-2-shmuel.eiderman@oracle.com
Signed-off-by: default avatarMax Reitz <mreitz@redhat.com>
parent b441dc71
Loading
Loading
Loading
Loading
+9 −20
Original line number Diff line number Diff line
@@ -3309,29 +3309,18 @@ static int img_rebase(int argc, char **argv)

    /* For safe rebasing we need to compare old and new backing file */
    if (!unsafe) {
        char backing_name[PATH_MAX];
        QDict *options = NULL;
        BlockDriverState *base_bs = backing_bs(bs);

        if (bs->backing) {
            if (bs->backing_format[0] != '\0') {
                options = qdict_new();
                qdict_put_str(options, "driver", bs->backing_format);
            }

            if (force_share) {
                if (!options) {
                    options = qdict_new();
                }
                qdict_put_bool(options, BDRV_OPT_FORCE_SHARE, true);
            }
            bdrv_get_backing_filename(bs, backing_name, sizeof(backing_name));
            blk_old_backing = blk_new_open(backing_name, NULL,
                                           options, src_flags, &local_err);
            if (!blk_old_backing) {
        if (base_bs) {
            blk_old_backing = blk_new(BLK_PERM_CONSISTENT_READ,
                                      BLK_PERM_ALL);
            ret = blk_insert_bs(blk_old_backing, base_bs,
                                &local_err);
            if (ret < 0) {
                error_reportf_err(local_err,
                                  "Could not open old backing file '%s': ",
                                  backing_name);
                ret = -1;
                                  "Could not reuse old backing file '%s': ",
                                  base_bs->filename);
                goto out;
            }
        } else {