[libvirt] [PATCH 3/4] Refactor qemudDomainStart
Cole Robinson
crobinso at redhat.com
Thu May 20 19:05:09 UTC 2010
On 05/20/2010 08:54 AM, Jiri Denemark wrote:
> We need a common internal function for starting managed domains to be
> used during autostart. This patch factors out relevant code from
> qemudDomainStart into qemudDomainObjStart and makes it use the
> refactored code for domain restore instead of calling qemudDomainRestore
> API directly.
> ---
> src/qemu/qemu_driver.c | 123 ++++++++++++++++++++++++++++++++---------------
> 1 files changed, 84 insertions(+), 39 deletions(-)
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index d048570..8f5cae1 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -143,6 +143,10 @@ static void qemuDomainEventFlush(int timer, void *opaque);
> static void qemuDomainEventQueue(struct qemud_driver *driver,
> virDomainEventPtr event);
>
> +static int qemudDomainObjStart(virConnectPtr conn,
> + struct qemud_driver *driver,
> + virDomainObjPtr vm);
> +
> static int qemudStartVMDaemon(virConnectPtr conn,
> struct qemud_driver *driver,
> virDomainObjPtr vm,
> @@ -6287,6 +6291,47 @@ cleanup:
> return ret;
> }
>
> +static int qemudDomainObjRestore(virConnectPtr conn,
> + struct qemud_driver *driver,
> + virDomainObjPtr vm,
> + const char *path)
> +{
> + virDomainDefPtr def = NULL;
> + int fd = -1;
> + pid_t read_pid = -1;
> + int ret = -1;
> + struct qemud_save_header header;
> +
> + fd = qemudDomainImageOpen(driver, path, &def, &header, &read_pid);
> + if (fd < 0)
> + goto cleanup;
> +
> + if (STRNEQ(vm->def->name, def->name) ||
> + memcmp(vm->def->uuid, def->uuid, VIR_UUID_BUFLEN)) {
> + char vm_uuidstr[VIR_UUID_STRING_BUFLEN];
> + char def_uuidstr[VIR_UUID_STRING_BUFLEN];
> + virUUIDFormat(vm->def->uuid, vm_uuidstr);
> + virUUIDFormat(def->uuid, def_uuidstr);
> + qemuReportError(VIR_ERR_OPERATION_FAILED,
> + _("cannot restore domain '%s' uuid %s from a file"
> + " which belongs to domain '%s' uuid %s"),
> + vm->def->name, vm_uuidstr,
> + def->name, def_uuidstr);
> + goto cleanup;
> + }
> +
> + virDomainObjAssignDef(vm, def, true);
> + def = NULL;
> +
> + ret = qemudDomainImageStartVM(conn, driver, vm, fd,
> + read_pid, &header, path);
> +
> +cleanup:
> + virDomainDefFree(def);
> + qemudDomainImageClose(fd, read_pid, NULL);
> + return ret;
> +}
> +
>
> static char *qemudVMDumpXML(struct qemud_driver *driver,
> virDomainObjPtr vm,
> @@ -6561,12 +6606,49 @@ static int qemudNumDefinedDomains(virConnectPtr conn) {
> }
>
>
> +static int qemudDomainObjStart(virConnectPtr conn,
> + struct qemud_driver *driver,
> + virDomainObjPtr vm)
> +{
> + int ret = -1;
> + char *managed_save;
> +
> + /*
> + * If there is a managed saved state restore it instead of starting
> + * from scratch. In any case the old state is removed.
> + */
> + managed_save = qemuDomainManagedSavePath(driver, vm);
> + if ((managed_save) && (virFileExists(managed_save))) {
> + ret = qemudDomainObjRestore(conn, driver, vm, managed_save);
> +
> + if (unlink(managed_save) < 0) {
> + VIR_WARN("Failed to remove the managed state %s", managed_save);
> + }
> +
> + if (ret == 0)
> + goto cleanup;
> + }
> +
> + ret = qemudStartVMDaemon(conn, driver, vm, NULL, -1);
> + if (ret != -1) {
> + virDomainEventPtr event =
> + virDomainEventNewFromObj(vm,
> + VIR_DOMAIN_EVENT_STARTED,
> + VIR_DOMAIN_EVENT_STARTED_BOOTED);
> + if (event)
> + qemuDomainEventQueue(driver, event);
> + }
> +
> +cleanup:
> + VIR_FREE(managed_save);
> + return ret;
> +}
> +
> static int qemudDomainStart(virDomainPtr dom) {
> struct qemud_driver *driver = dom->conn->privateData;
> virDomainObjPtr vm;
> int ret = -1;
> virDomainEventPtr event = NULL;
> - char *managed_save = NULL;
>
> qemuDriverLock(driver);
> vm = virDomainFindByUUID(&driver->domains, dom->uuid);
> @@ -6588,50 +6670,13 @@ static int qemudDomainStart(virDomainPtr dom) {
> goto endjob;
> }
>
> - /*
> - * If there is a managed saved state restore it instead of starting
> - * from scratch. In any case the old state is removed.
> - */
> - managed_save = qemuDomainManagedSavePath(driver, vm);
> - if ((managed_save) && (virFileExists(managed_save))) {
> - /*
> - * We should still have a reference left to vm but
> - * one should check for 0 anyway
> - */
> - if (qemuDomainObjEndJob(vm) == 0) {
> - vm = NULL;
> - goto cleanup;
> - }
> -
> - virDomainObjUnlock(vm);
> - qemuDriverUnlock(driver);
> - ret = qemudDomainRestore(dom->conn, managed_save);
> -
> - if (unlink(managed_save) < 0) {
> - VIR_WARN("Failed to remove the managed state %s", managed_save);
> - }
> -
> - if (ret == 0) {
> - /* qemudDomainRestore should have sent the Started/Restore event */
> - VIR_FREE(managed_save);
> - return(ret);
> - }
> - qemuDriverLock(driver);
> - virDomainObjLock(vm);
> - }
> -
> - ret = qemudStartVMDaemon(dom->conn, driver, vm, NULL, -1);
> - if (ret != -1)
> - event = virDomainEventNewFromObj(vm,
> - VIR_DOMAIN_EVENT_STARTED,
> - VIR_DOMAIN_EVENT_STARTED_BOOTED);
> + ret = qemudDomainObjStart(dom->conn, driver, vm);
>
> endjob:
> if (qemuDomainObjEndJob(vm) == 0)
> vm = NULL;
>
> cleanup:
> - VIR_FREE(managed_save);
> if (vm)
> virDomainObjUnlock(vm);
> if (event)
ACK
- Cole
More information about the libvir-list
mailing list