Move the code into a separate function so that the flow of creating the copy is more obvious and split into logical pieces. --- src/qemu/qemu_driver.c | 79 +++++++++++++++++++++++++++++--------------------- 1 file changed, 46 insertions(+), 33 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 48dc5e5cc..5beb14e64 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -16685,6 +16685,50 @@ qemuDomainBlockJobSetSpeed(virDomainPtr dom, } +static int +qemuDomainBlockCopyValidateMirror(virStorageSourcePtr mirror, + const char *dst, + bool *reuse) +{ + int desttype = virStorageSourceGetActualType(mirror); + struct stat st; + + if (stat(mirror->path, &st) < 0) { + if (errno != ENOENT) { + virReportSystemError(errno, _("unable to stat for disk %s: %s"), + dst, mirror->path); + return -1; + } else if (*reuse || desttype == VIR_STORAGE_TYPE_BLOCK) { + virReportSystemError(errno, + _("missing destination file for disk %s: %s"), + dst, mirror->path); + return -1; + } + } else if (!S_ISBLK(st.st_mode)) { + if (st.st_size && !(*reuse)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("external destination file for disk %s already " + "exists and is not a block device: %s"), + dst, mirror->path); + return -1; + } + if (desttype == VIR_STORAGE_TYPE_BLOCK) { + virReportError(VIR_ERR_INVALID_ARG, + _("blockdev flag requested for disk %s, but file " + "'%s' is not a block device"), + dst, mirror->path); + return -1; + } + } else { + /* if the target is a block device, assume that we are reusing it, so + * there are no attempts to create it */ + *reuse = true; + } + + return 0; +} + + /* bandwidth in bytes/s. Caller must lock vm beforehand, and not * access mirror afterwards. */ static int @@ -16703,11 +16747,9 @@ qemuDomainBlockCopyCommon(virDomainObjPtr vm, char *device = NULL; virDomainDiskDefPtr disk = NULL; int ret = -1; - struct stat st; bool need_unlink = false; virQEMUDriverConfigPtr cfg = NULL; const char *format = NULL; - int desttype = virStorageSourceGetActualType(mirror); virErrorPtr monitor_error = NULL; bool reuse = !!(flags & VIR_DOMAIN_BLOCK_COPY_REUSE_EXT); @@ -16790,37 +16832,8 @@ qemuDomainBlockCopyCommon(virDomainObjPtr vm, if (qemuDomainStorageFileInit(driver, vm, mirror) < 0) goto endjob; - if (stat(mirror->path, &st) < 0) { - if (errno != ENOENT) { - virReportSystemError(errno, _("unable to stat for disk %s: %s"), - disk->dst, mirror->path); - goto endjob; - } else if (reuse || desttype == VIR_STORAGE_TYPE_BLOCK) { - virReportSystemError(errno, - _("missing destination file for disk %s: %s"), - disk->dst, mirror->path); - goto endjob; - } - } else if (!S_ISBLK(st.st_mode)) { - if (st.st_size && !reuse) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("external destination file for disk %s already " - "exists and is not a block device: %s"), - disk->dst, mirror->path); - goto endjob; - } - if (desttype == VIR_STORAGE_TYPE_BLOCK) { - virReportError(VIR_ERR_INVALID_ARG, - _("blockdev flag requested for disk %s, but file " - "'%s' is not a block device"), - disk->dst, mirror->path); - goto endjob; - } - } else { - /* if the target is a block device, assume that we are reusing it, so - * there are no attempts to create it */ - reuse = true; - } + if (qemuDomainBlockCopyValidateMirror(mirror, disk->dst, &reuse) < 0) + goto endjob; if (!mirror->format) { if (!reuse) { -- 2.12.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list