mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-11-05 20:35:44 +00:00
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>
This commit is contained in:
parent
b441dc71c0
commit
4ebe061726
1 changed files with 9 additions and 20 deletions
29
qemu-img.c
29
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 {
|
||||
|
|
Loading…
Reference in a new issue