Move the code to qemu_domain.c so that it can be reused in other parts of the qemu driver. 'qemu_domain' was chosen as we check the domain state after closing the wrapper. Signed-off-by: Peter Krempa <pkrempa@xxxxxxxxxx> --- src/qemu/qemu_domain.c | 28 ++++++++++++++++++++++++++++ src/qemu/qemu_domain.h | 4 ++++ src/qemu/qemu_driver.c | 36 ++++-------------------------------- 3 files changed, 36 insertions(+), 32 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 670db6ebfb..e28f704dba 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -10721,3 +10721,31 @@ qemuDomainOpenFile(virQEMUDriverPtr driver, return virQEMUFileOpenAs(user, group, dynamicOwnership, path, oflags, needUnlink); } + + +int +qemuDomainFileWrapperFDClose(virDomainObjPtr vm, + virFileWrapperFdPtr fd) +{ + int ret; + + /* virFileWrapperFd uses iohelper to write data onto disk. + * However, iohelper calls fdatasync() which may take ages to + * finish. Therefore, we shouldn't be waiting with the domain + * object locked. */ + + /* XXX Currently, this function is intended for *Save() only + * as restore needs some reworking before it's ready for + * this. */ + + virObjectUnlock(vm); + ret = virFileWrapperFdClose(fd); + virObjectLock(vm); + if (!virDomainObjIsActive(vm)) { + if (virGetLastErrorCode() == VIR_ERR_OK) + virReportError(VIR_ERR_OPERATION_FAILED, "%s", + _("domain is no longer running")); + ret = -1; + } + return ret; +} diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index ef03702fa1..e4c22864dc 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -1024,3 +1024,7 @@ qemuDomainOpenFile(virQEMUDriverPtr driver, const char *path, int oflags, bool *needUnlink); + +int +qemuDomainFileWrapperFDClose(virDomainObjPtr vm, + virFileWrapperFdPtr fd); diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 0bc7eebe9a..8f61759f53 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -3022,34 +3022,6 @@ qemuCompressGetCommand(virQEMUSaveFormat compression) } -static int -qemuFileWrapperFDClose(virDomainObjPtr vm, - virFileWrapperFdPtr fd) -{ - int ret; - - /* virFileWrapperFd uses iohelper to write data onto disk. - * However, iohelper calls fdatasync() which may take ages to - * finish. Therefore, we shouldn't be waiting with the domain - * object locked. */ - - /* XXX Currently, this function is intended for *Save() only - * as restore needs some reworking before it's ready for - * this. */ - - virObjectUnlock(vm); - ret = virFileWrapperFdClose(fd); - virObjectLock(vm); - if (!virDomainObjIsActive(vm)) { - if (virGetLastErrorCode() == VIR_ERR_OK) - virReportError(VIR_ERR_OPERATION_FAILED, "%s", - _("domain is no longer running")); - ret = -1; - } - return ret; -} - - /* Helper function to execute a migration to file with a correct save header * the caller needs to make sure that the processors are stopped and do all other * actions besides saving memory */ @@ -3111,7 +3083,7 @@ qemuDomainSaveMemory(virQEMUDriverPtr driver, goto cleanup; } - if (qemuFileWrapperFDClose(vm, wrapperFd) < 0) + if (qemuDomainFileWrapperFDClose(vm, wrapperFd) < 0) goto cleanup; if ((fd = qemuDomainOpenFile(driver, vm, path, O_WRONLY, NULL)) < 0 || @@ -3122,7 +3094,7 @@ qemuDomainSaveMemory(virQEMUDriverPtr driver, cleanup: VIR_FORCE_CLOSE(fd); - if (qemuFileWrapperFDClose(vm, wrapperFd) < 0) + if (qemuDomainFileWrapperFDClose(vm, wrapperFd) < 0) ret = -1; virFileWrapperFdFree(wrapperFd); @@ -3703,14 +3675,14 @@ doCoreDump(virQEMUDriverPtr driver, path); goto cleanup; } - if (qemuFileWrapperFDClose(vm, wrapperFd) < 0) + if (qemuDomainFileWrapperFDClose(vm, wrapperFd) < 0) goto cleanup; ret = 0; cleanup: VIR_FORCE_CLOSE(fd); - if (qemuFileWrapperFDClose(vm, wrapperFd) < 0) + if (qemuDomainFileWrapperFDClose(vm, wrapperFd) < 0) ret = -1; virFileWrapperFdFree(wrapperFd); if (ret != 0) -- 2.26.2