virDomainObjPtr vm,
const char *path,
virQEMUSaveDataPtr data,
- const char *compressedpath,
+ virCommandPtr compressor,
unsigned int flags,
qemuDomainAsyncJob asyncJob)
{
goto cleanup;
/* Perform the migration */
- if (qemuMigrationSrcToFile(driver, vm, fd, compressedpath, asyncJob) < 0)
+ if (qemuMigrationSrcToFile(driver, vm, fd, compressor, asyncJob) < 0)
goto cleanup;
/* Touch up file header to mark image complete. */
static int
qemuDomainSaveInternal(virQEMUDriverPtr driver,
virDomainObjPtr vm, const char *path,
- int compressed, const char *compressedpath,
+ int compressed, virCommandPtr compressor,
const char *xmlin, unsigned int flags)
{
g_autofree char *xml = NULL;
goto endjob;
xml = NULL;
- ret = qemuDomainSaveMemory(driver, vm, path, data, compressedpath,
+ ret = qemuDomainSaveMemory(driver, vm, path, data, compressor,
flags, QEMU_ASYNC_JOB_SAVE);
if (ret < 0)
goto endjob;
*/
static int ATTRIBUTE_NONNULL(2)
qemuGetCompressionProgram(const char *imageFormat,
- char **compresspath,
+ virCommandPtr *compressor,
const char *styleFormat,
bool use_raw_on_fail)
{
int ret;
+ const char *prog;
- *compresspath = NULL;
+ *compressor = NULL;
if (!imageFormat)
return QEMU_SAVE_FORMAT_RAW;
if (ret == QEMU_SAVE_FORMAT_RAW)
return QEMU_SAVE_FORMAT_RAW;
- if (!(*compresspath = virFindFileInPath(imageFormat)))
+ if (!(prog = virFindFileInPath(imageFormat)))
goto error;
+ *compressor = virCommandNew(prog);
+ virCommandAddArg(*compressor, "-c");
+ if (ret == QEMU_SAVE_FORMAT_XZ)
+ virCommandAddArg(*compressor, "-3");
+
return ret;
error:
{
virQEMUDriverPtr driver = dom->conn->privateData;
int compressed;
- g_autofree char *compressedpath = NULL;
+ g_autoptr(virCommand) compressor = NULL;
int ret = -1;
virDomainObjPtr vm = NULL;
g_autoptr(virQEMUDriverConfig) cfg = NULL;
cfg = virQEMUDriverGetConfig(driver);
if ((compressed = qemuGetCompressionProgram(cfg->saveImageFormat,
- &compressedpath,
+ &compressor,
"save", false)) < 0)
goto cleanup;
goto cleanup;
ret = qemuDomainSaveInternal(driver, vm, path, compressed,
- compressedpath, dxml, flags);
+ compressor, dxml, flags);
cleanup:
virDomainObjEndAPI(&vm);
virQEMUDriverPtr driver = dom->conn->privateData;
g_autoptr(virQEMUDriverConfig) cfg = NULL;
int compressed;
- g_autofree char *compressedpath = NULL;
+ g_autoptr(virCommand) compressor = NULL;
virDomainObjPtr vm;
g_autofree char *name = NULL;
int ret = -1;
cfg = virQEMUDriverGetConfig(driver);
if ((compressed = qemuGetCompressionProgram(cfg->saveImageFormat,
- &compressedpath,
+ &compressor,
"save", false)) < 0)
goto cleanup;
VIR_INFO("Saving state of domain '%s' to '%s'", vm->def->name, name);
ret = qemuDomainSaveInternal(driver, vm, name, compressed,
- compressedpath, NULL, flags);
+ compressor, NULL, flags);
if (ret == 0)
vm->hasManagedSave = true;
unsigned int flags = VIR_FILE_WRAPPER_NON_BLOCKING;
const char *memory_dump_format = NULL;
g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
- g_autofree char *compressedpath = NULL;
+ g_autoptr(virCommand) compressor = NULL;
/* We reuse "save" flag for "dump" here. Then, we can support the same
* format in "save" and "dump". This path doesn't need the compression
* program to exist and can ignore the return value - it only cares to
- * get the compressedpath */
+ * get the compressor */
ignore_value(qemuGetCompressionProgram(cfg->dumpImageFormat,
- &compressedpath,
+ &compressor,
"dump", true));
/* Create an empty file with appropriate ownership. */
if (!qemuMigrationSrcIsAllowed(driver, vm, false, 0))
goto cleanup;
- ret = qemuMigrationSrcToFile(driver, vm, fd, compressedpath,
+ ret = qemuMigrationSrcToFile(driver, vm, fd, compressor,
QEMU_ASYNC_JOB_DUMP);
}
int thaw = 0; /* 1 if freeze succeeded, -1 if freeze failed */
bool pmsuspended = false;
int compressed;
- g_autofree char *compressedpath = NULL;
+ g_autoptr(virCommand) compressor = NULL;
virQEMUSaveDataPtr data = NULL;
/* If quiesce was requested, then issue a freeze command, and a
JOB_MASK(QEMU_JOB_MIGRATION_OP)));
if ((compressed = qemuGetCompressionProgram(cfg->snapshotImageFormat,
- &compressedpath,
+ &compressor,
"snapshot", false)) < 0)
goto cleanup;
xml = NULL;
if ((ret = qemuDomainSaveMemory(driver, vm, snapdef->file, data,
- compressedpath, 0,
+ compressor, 0,
QEMU_ASYNC_JOB_SNAPSHOT)) < 0)
goto cleanup;
int
qemuMigrationSrcToFile(virQEMUDriverPtr driver, virDomainObjPtr vm,
int fd,
- const char *compressor,
+ virCommandPtr compressor,
qemuDomainAsyncJob asyncJob)
{
qemuDomainObjPrivatePtr priv = vm->privateData;
int rc;
int ret = -1;
- virCommandPtr cmd = NULL;
int pipeFD[2] = { -1, -1 };
unsigned long saveMigBandwidth = priv->migMaxBandwidth;
char *errbuf = NULL;
QEMU_MONITOR_MIGRATE_BACKGROUND,
fd);
} else {
- const char *prog = compressor;
- const char *args[] = {
- prog,
- "-c",
- NULL
- };
-
- cmd = virCommandNewArgs(args);
- virCommandSetInputFD(cmd, pipeFD[0]);
- virCommandSetOutputFD(cmd, &fd);
- virCommandSetErrorBuffer(cmd, &errbuf);
- virCommandDoAsyncIO(cmd);
+ virCommandSetInputFD(compressor, pipeFD[0]);
+ virCommandSetOutputFD(compressor, &fd);
+ virCommandSetErrorBuffer(compressor, &errbuf);
+ virCommandDoAsyncIO(compressor);
if (virSetCloseExec(pipeFD[1]) < 0) {
virReportSystemError(errno, "%s",
_("Unable to set cloexec flag"));
ignore_value(qemuDomainObjExitMonitor(driver, vm));
goto cleanup;
}
- if (virCommandRunAsync(cmd, NULL) < 0) {
+ if (virCommandRunAsync(compressor, NULL) < 0) {
ignore_value(qemuDomainObjExitMonitor(driver, vm));
goto cleanup;
}
if (rc < 0) {
if (rc == -2) {
virErrorPreserveLast(&orig_err);
- virCommandAbort(cmd);
+ virCommandAbort(compressor);
if (virDomainObjIsActive(vm) &&
qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) == 0) {
qemuMonitorMigrateCancel(priv->mon);
goto cleanup;
}
- if (cmd && virCommandWait(cmd, NULL) < 0)
+ if (compressor && virCommandWait(compressor, NULL) < 0)
goto cleanup;
qemuDomainEventEmitJobCompleted(driver, vm);
VIR_FORCE_CLOSE(pipeFD[0]);
VIR_FORCE_CLOSE(pipeFD[1]);
- if (cmd) {
+ if (errbuf) {
VIR_DEBUG("Compression binary stderr: %s", NULLSTR(errbuf));
VIR_FREE(errbuf);
- virCommandFree(cmd);
}
virErrorRestore(&orig_err);