diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 155e4a301566cdd693cf83c8cd63d34cd346f8eb..70e9c702722986ce542b3b80271bda979af3c7c1 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -3221,7 +3221,7 @@ static int qemudDomainSave(virDomainPtr dom, if (header.compressed == QEMUD_SAVE_FORMAT_RAW) { const char *args[] = { "cat", NULL }; - ret = qemuMonitorMigrateToCommand(vm, args, path); + ret = qemuMonitorMigrateToCommand(vm, 0, args, path); } else { const char *prog = qemudSaveCompressionTypeToString(header.compressed); const char *args[] = { @@ -3229,7 +3229,7 @@ static int qemudDomainSave(virDomainPtr dom, "-c", NULL }; - ret = qemuMonitorMigrateToCommand(vm, args, path); + ret = qemuMonitorMigrateToCommand(vm, 0, args, path); } if (ret < 0) @@ -3303,7 +3303,7 @@ static int qemudDomainCoreDump(virDomainPtr dom, paused = 1; } - ret = qemuMonitorMigrateToCommand(vm, args, path); + ret = qemuMonitorMigrateToCommand(vm, 0, args, path); paused = 1; cleanup: @@ -6041,7 +6041,7 @@ qemudDomainMigratePerform (virDomainPtr dom, goto cleanup; } - if (qemuMonitorMigrateToHost(vm, uribits->server, uribits->port) < 0) + if (qemuMonitorMigrateToHost(vm, 0, uribits->server, uribits->port) < 0) goto cleanup; /* it is also possible that the migrate didn't fail initially, but diff --git a/src/qemu/qemu_monitor_text.c b/src/qemu/qemu_monitor_text.c index f57460c1fa1e989522f447a75b5ec8f6c5284644..5054adfb1eb987c2b4c7f503b1bf1c12a7349624 100644 --- a/src/qemu/qemu_monitor_text.c +++ b/src/qemu/qemu_monitor_text.c @@ -1138,19 +1138,26 @@ cleanup: static int qemuMonitorMigrate(const virDomainObjPtr vm, + int background, const char *dest) { char *cmd = NULL; char *info = NULL; int ret = -1; char *safedest = qemuMonitorEscapeArg(dest); + const char *extra; if (!safedest) { virReportOOMError(NULL); return -1; } - if (virAsprintf(&cmd, "migrate \"%s\"", safedest) < 0) { + if (background) + extra = "-d "; + else + extra = " "; + + if (virAsprintf(&cmd, "migrate %s\"%s\"", extra, safedest) < 0) { virReportOOMError(NULL); goto cleanup; } @@ -1186,6 +1193,7 @@ cleanup: } int qemuMonitorMigrateToHost(const virDomainObjPtr vm, + int background, const char *hostname, int port) { @@ -1200,7 +1208,7 @@ int qemuMonitorMigrateToHost(const virDomainObjPtr vm, return -1; } - ret = qemuMonitorMigrate(vm, uri); + ret = qemuMonitorMigrate(vm, background, uri); VIR_FREE(uri); @@ -1209,6 +1217,7 @@ int qemuMonitorMigrateToHost(const virDomainObjPtr vm, int qemuMonitorMigrateToCommand(const virDomainObjPtr vm, + int background, const char * const *argv, const char *target) { @@ -1238,7 +1247,7 @@ int qemuMonitorMigrateToCommand(const virDomainObjPtr vm, goto cleanup; } - ret = qemuMonitorMigrate(vm, dest); + ret = qemuMonitorMigrate(vm, background, dest); cleanup: VIR_FREE(safe_target); @@ -1247,6 +1256,38 @@ cleanup: return ret; } +int qemuMonitorMigrateToUnix(const virDomainObjPtr vm, + int background, + const char *unixfile) +{ + char *dest = NULL; + int ret = -1; + + if (virAsprintf(&dest, "unix:%s", unixfile) < 0) { + virReportOOMError(NULL); + return -1; + } + + ret = qemuMonitorMigrate(vm, background, dest); + + VIR_FREE(dest); + + return ret; +} + +int qemuMonitorMigrateCancel(const virDomainObjPtr vm) +{ + char *info = NULL; + + if (qemuMonitorCommand(vm, "migrate cancel", &info) < 0) { + qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR, + "%s", _("cannot run monitor command to cancel migration")); + return -1; + } + VIR_FREE(info); + + return 0; +} int qemuMonitorAddUSBDisk(const virDomainObjPtr vm, const char *path) diff --git a/src/qemu/qemu_monitor_text.h b/src/qemu/qemu_monitor_text.h index 82dc5dff6cd3885cc99b52ece3e14e2f11848830..917545688eeab95624ed5f2191bde784a5f721a9 100644 --- a/src/qemu/qemu_monitor_text.h +++ b/src/qemu/qemu_monitor_text.h @@ -96,13 +96,21 @@ int qemuMonitorGetMigrationStatus(const virDomainObjPtr vm, unsigned long long *total); int qemuMonitorMigrateToHost(const virDomainObjPtr vm, + int background, const char *hostname, int port); int qemuMonitorMigrateToCommand(const virDomainObjPtr vm, + int background, const char * const *argv, const char *target); +int qemuMonitorMigrateToUnix(const virDomainObjPtr vm, + int background, + const char *unixfile); + +int qemuMonitorMigrateCancel(const virDomainObjPtr vm); + /* XXX disk driver type eg, qcow/etc. * XXX cache mode