Message ID | 20190502135828.42797-4-shmuel.eiderman@oracle.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | qemu-img: rebase: Improve/optimize rebase operation | expand |
On 02.05.19 15:58, Sam Eiderman wrote: > 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: Karl Heubaum <karl.heubaum@oracle.com> > Reviewed-by: Eyal Moscovici <eyal.moscovici@oracle.com> > Signed-off-by: Sagi Amit <sagi.amit@oracle.com> > Co-developed-by: Sagi Amit <sagi.amit@oracle.com> > Signed-off-by: Sam Eiderman <shmuel.eiderman@oracle.com> > --- > qemu-img.c | 33 +++++++++++++++++++++++---------- > 1 file changed, 23 insertions(+), 10 deletions(-) Reviewed-by: Max Reitz <mreitz@redhat.com>
diff --git a/qemu-img.c b/qemu-img.c index 7f20858cb9..b32884bfc5 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -3348,16 +3348,29 @@ static int img_rebase(int argc, char **argv) * in its chain. */ prefix_chain_bs = bdrv_find_backing_image(bs, out_real_path); - - blk_new_backing = blk_new_open(out_real_path, NULL, - options, src_flags, &local_err); - g_free(out_real_path); - if (!blk_new_backing) { - error_reportf_err(local_err, - "Could not open new backing file '%s': ", - out_baseimg); - ret = -1; - goto out; + 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); + if (!blk_new_backing) { + error_reportf_err(local_err, + "Could not open new backing file '%s': ", + out_baseimg); + ret = -1; + goto out; + } } } }