mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-23 06:05:27 +00:00
qemu: copy: Accept 'format' parameter when copying to a non-existing img
We have the following matrix of possible arguments handled by the logic statement touched by this patch: | flags & _REUSE_EXT | !(flags & _REUSE_EXT) -------+--------------------+---------------------- format| (1) | (2) -------+--------------------+---------------------- !format| (3) | (4) -------+--------------------+---------------------- In cases 1 and 2 the user provided a format, in cases 3 and 4 not. The user requests to use a pre-existing image in 1 and 3 and libvirt will create a new image in 2 and 4. The difference between cases 3 and 4 is that for 3 the format is probed from the user-provided image, whereas in 4 we just use the existing disk format. The current code would treat cases 1,3 and 4 correctly but in case 2 the format provided by the user would be ignored. The particular piece of code was broken in commit35c7701c64
but since it was introduced a few commits before that it was never released as working. (cherry picked from commit42619ed05d
) Signed-off-by: Eric Blake <eblake@redhat.com> Conflicts: src/qemu/qemu_driver.c - no refactoring of commit7b7bf001
This commit is contained in:
parent
6884c39455
commit
5b3af9c06c
@ -15181,29 +15181,34 @@ qemuDomainBlockCopy(virDomainObjPtr vm,
|
||||
goto endjob;
|
||||
}
|
||||
|
||||
if (format) {
|
||||
if ((mirrorFormat = virStorageFileFormatTypeFromString(format)) <= 0) {
|
||||
virReportError(VIR_ERR_INVALID_ARG, _("unrecognized format '%s'"),
|
||||
format);
|
||||
goto endjob;
|
||||
}
|
||||
} else {
|
||||
if (!(flags & VIR_DOMAIN_BLOCK_REBASE_REUSE_EXT)) {
|
||||
mirrorFormat = disk->src.format;
|
||||
} else {
|
||||
/* If the user passed the REUSE_EXT flag, then either they
|
||||
* also passed the RAW flag (and format is non-NULL), or it is
|
||||
* safe for us to probe the format from the file that we will
|
||||
* be using. */
|
||||
mirrorFormat = virStorageFileProbeFormat(dest, cfg->user,
|
||||
cfg->group);
|
||||
}
|
||||
}
|
||||
|
||||
/* pre-create the image file */
|
||||
if (!(flags & VIR_DOMAIN_BLOCK_REBASE_REUSE_EXT)) {
|
||||
int fd = qemuOpenFile(driver, vm, dest, O_WRONLY | O_TRUNC | O_CREAT,
|
||||
&need_unlink, NULL);
|
||||
if (fd < 0)
|
||||
goto endjob;
|
||||
VIR_FORCE_CLOSE(fd);
|
||||
if (!format)
|
||||
mirrorFormat = disk->src.format;
|
||||
} else if (format) {
|
||||
mirrorFormat = virStorageFileFormatTypeFromString(format);
|
||||
if (mirrorFormat <= 0) {
|
||||
virReportError(VIR_ERR_INVALID_ARG, _("unrecognized format '%s'"),
|
||||
format);
|
||||
goto endjob;
|
||||
}
|
||||
} else {
|
||||
/* If the user passed the REUSE_EXT flag, then either they
|
||||
* also passed the RAW flag (and format is non-NULL), or it is
|
||||
* safe for us to probe the format from the file that we will
|
||||
* be using. */
|
||||
mirrorFormat = virStorageFileProbeFormat(dest, cfg->user,
|
||||
cfg->group);
|
||||
}
|
||||
|
||||
if (!format && mirrorFormat > 0)
|
||||
format = virStorageFileFormatTypeToString(mirrorFormat);
|
||||
if (VIR_STRDUP(mirror, dest) < 0)
|
||||
|
Loading…
Reference in New Issue
Block a user