Commit 330c7295 authored by Sam Eiderman's avatar Sam Eiderman Committed by Max Reitz
Browse files

qemu-img: rebase: Reuse in-chain BlockDriverState



If a chain was detected, don't open a new BlockBackend from the target
backing file which will create a new BlockDriverState. Instead, create
an empty BlockBackend and attach the already open BlockDriverState.

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-4-shmuel.eiderman@oracle.com
Signed-off-by: default avatarMax Reitz <mreitz@redhat.com>
parent 863cc78f
Loading
Loading
Loading
Loading
+23 −10
Original line number Diff line number Diff line
@@ -3358,7 +3358,19 @@ static int img_rebase(int argc, char **argv)
             * in its chain.
             */
            prefix_chain_bs = bdrv_find_backing_image(bs, out_real_path);

            if (prefix_chain_bs) {
                g_free(out_real_path);
                blk_new_backing = blk_new(BLK_PERM_CONSISTENT_READ,
                                          BLK_PERM_ALL);
                ret = blk_insert_bs(blk_new_backing, prefix_chain_bs,
                                    &local_err);
                if (ret < 0) {
                    error_reportf_err(local_err,
                                      "Could not reuse backing file '%s': ",
                                      out_baseimg);
                    goto out;
                }
            } else {
                blk_new_backing = blk_new_open(out_real_path, NULL,
                                               options, src_flags, &local_err);
                g_free(out_real_path);
@@ -3371,6 +3383,7 @@ static int img_rebase(int argc, char **argv)
                }
            }
        }
    }

    /*
     * Check each unallocated cluster in the COW file. If it is unallocated,