diff options
| author | Sam Eiderman <shmuel.eiderman@oracle.com> | 2019-05-23 19:33:35 +0300 |
|---|---|---|
| committer | Max Reitz <mreitz@redhat.com> | 2019-05-28 20:30:55 +0200 |
| commit | 4ebe0617269113ec52a74d3dbb574a62ef6a0c83 (patch) | |
| tree | 54a7832039c73f14f539692344b498f55fb3502c /qemu-img.c | |
| parent | b441dc71c0b7e8f488a6ebc2aa781b08a3a05038 (diff) | |
| download | focaccia-qemu-4ebe0617269113ec52a74d3dbb574a62ef6a0c83.tar.gz focaccia-qemu-4ebe0617269113ec52a74d3dbb574a62ef6a0c83.zip | |
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: 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> Message-id: 20190523163337.4497-2-shmuel.eiderman@oracle.com Signed-off-by: Max Reitz <mreitz@redhat.com>
Diffstat (limited to 'qemu-img.c')
| -rw-r--r-- | qemu-img.c | 29 |
1 files changed, 9 insertions, 20 deletions
diff --git a/qemu-img.c b/qemu-img.c index 28fba1e7a7..9bd0bb1e47 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -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 { |