mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-24 22:55:23 +00:00
qemu: driver: allow remote destinations for block copy
Now that we support blockdev for qemuDomainBlockCopy we can allow copying to remote destinations as well. Signed-off-by: Peter Krempa <pkrempa@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
parent
ce7229a3b0
commit
4b58fdf280
@ -18236,6 +18236,9 @@ qemuDomainBlockCopyValidateMirror(virStorageSourcePtr mirror,
|
|||||||
int desttype = virStorageSourceGetActualType(mirror);
|
int desttype = virStorageSourceGetActualType(mirror);
|
||||||
struct stat st;
|
struct stat st;
|
||||||
|
|
||||||
|
if (!virStorageSourceIsLocalStorage(mirror))
|
||||||
|
return 0;
|
||||||
|
|
||||||
if (virStorageFileAccess(mirror, F_OK) < 0) {
|
if (virStorageFileAccess(mirror, F_OK) < 0) {
|
||||||
if (errno != ENOENT) {
|
if (errno != ENOENT) {
|
||||||
virReportSystemError(errno, "%s",
|
virReportSystemError(errno, "%s",
|
||||||
@ -18362,6 +18365,7 @@ qemuDomainBlockCopyCommon(virDomainObjPtr vm,
|
|||||||
qemuBlockJobDataPtr job = NULL;
|
qemuBlockJobDataPtr job = NULL;
|
||||||
VIR_AUTOUNREF(virStorageSourcePtr) mirror = mirrorsrc;
|
VIR_AUTOUNREF(virStorageSourcePtr) mirror = mirrorsrc;
|
||||||
bool blockdev = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV);
|
bool blockdev = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV);
|
||||||
|
bool mirror_initialized = false;
|
||||||
VIR_AUTOPTR(qemuBlockStorageSourceChainData) data = NULL;
|
VIR_AUTOPTR(qemuBlockStorageSourceChainData) data = NULL;
|
||||||
VIR_AUTOPTR(qemuBlockStorageSourceChainData) crdata = NULL;
|
VIR_AUTOPTR(qemuBlockStorageSourceChainData) crdata = NULL;
|
||||||
virStorageSourcePtr n;
|
virStorageSourcePtr n;
|
||||||
@ -18434,16 +18438,20 @@ qemuDomainBlockCopyCommon(virDomainObjPtr vm,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Prepare the destination file. */
|
/* Prepare the destination file. */
|
||||||
/* XXX Allow non-file mirror destinations */
|
if (!blockdev &&
|
||||||
if (!virStorageSourceIsLocalStorage(mirror)) {
|
!virStorageSourceIsLocalStorage(mirror)) {
|
||||||
virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
|
virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
|
||||||
_("non-file destination not supported yet"));
|
_("non-file destination not supported yet"));
|
||||||
goto endjob;
|
goto endjob;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (virStorageFileSupportsCreate(mirror) == 1) {
|
||||||
if (qemuDomainStorageFileInit(driver, vm, mirror, NULL) < 0)
|
if (qemuDomainStorageFileInit(driver, vm, mirror, NULL) < 0)
|
||||||
goto endjob;
|
goto endjob;
|
||||||
|
|
||||||
|
mirror_initialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
if (qemuDomainBlockCopyValidateMirror(mirror, disk->dst, &existing) < 0)
|
if (qemuDomainBlockCopyValidateMirror(mirror, disk->dst, &existing) < 0)
|
||||||
goto endjob;
|
goto endjob;
|
||||||
|
|
||||||
@ -18451,12 +18459,19 @@ qemuDomainBlockCopyCommon(virDomainObjPtr vm,
|
|||||||
if (!mirror_reuse) {
|
if (!mirror_reuse) {
|
||||||
mirror->format = disk->src->format;
|
mirror->format = disk->src->format;
|
||||||
} else {
|
} else {
|
||||||
|
if (mirror_initialized &&
|
||||||
|
virStorageSourceIsLocalStorage(mirror)) {
|
||||||
/* If the user passed the REUSE_EXT flag, then either they
|
/* If the user passed the REUSE_EXT flag, then either they
|
||||||
* can also pass the RAW flag or use XML to tell us the format.
|
* can also pass the RAW flag or use XML to tell us the format.
|
||||||
* So if we get here, we assume it is safe for us to probe the
|
* So if we get here, we assume it is safe for us to probe the
|
||||||
* format from the file that we will be using. */
|
* format from the file that we will be using. */
|
||||||
mirror->format = virStorageFileProbeFormat(mirror->path, cfg->user,
|
mirror->format = virStorageFileProbeFormat(mirror->path, cfg->user,
|
||||||
cfg->group);
|
cfg->group);
|
||||||
|
} else {
|
||||||
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||||
|
_("reused mirror destination format must be specified"));
|
||||||
|
goto endjob;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -18473,6 +18488,7 @@ qemuDomainBlockCopyCommon(virDomainObjPtr vm,
|
|||||||
/* pre-create the image file. In case when 'blockdev' is used this is
|
/* pre-create the image file. In case when 'blockdev' is used this is
|
||||||
* required so that libvirt can properly label the image for access by qemu */
|
* required so that libvirt can properly label the image for access by qemu */
|
||||||
if (!existing) {
|
if (!existing) {
|
||||||
|
if (mirror_initialized) {
|
||||||
if (virStorageFileCreate(mirror) < 0) {
|
if (virStorageFileCreate(mirror) < 0) {
|
||||||
virReportSystemError(errno, "%s", _("failed to create copy target"));
|
virReportSystemError(errno, "%s", _("failed to create copy target"));
|
||||||
goto endjob;
|
goto endjob;
|
||||||
@ -18480,6 +18496,7 @@ qemuDomainBlockCopyCommon(virDomainObjPtr vm,
|
|||||||
|
|
||||||
need_unlink = true;
|
need_unlink = true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (mirror->format > 0)
|
if (mirror->format > 0)
|
||||||
format = virStorageFileFormatTypeToString(mirror->format);
|
format = virStorageFileFormatTypeToString(mirror->format);
|
||||||
|
Loading…
Reference in New Issue
Block a user