From nobody Fri May 16 08:41:42 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1496824695200636.0967290002887; Wed, 7 Jun 2017 01:38:15 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 64762C0587D3; Wed, 7 Jun 2017 08:38:12 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 2E12A1797E; Wed, 7 Jun 2017 08:38:12 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id D8B77181A104; Wed, 7 Jun 2017 08:38:11 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v578bpmx004840 for ; Wed, 7 Jun 2017 04:37:51 -0400 Received: by smtp.corp.redhat.com (Postfix) id AE3F1757D9; Wed, 7 Jun 2017 08:37:51 +0000 (UTC) Received: from virval.usersys.redhat.com (dhcp129-92.brq.redhat.com [10.34.129.92]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 379A8757CD for ; Wed, 7 Jun 2017 08:37:51 +0000 (UTC) Received: by virval.usersys.redhat.com (Postfix, from userid 500) id 7EE5F101935; Wed, 7 Jun 2017 10:37:46 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 64762C0587D3 Authentication-Results: ext-mx08.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx08.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=libvir-list-bounces@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 64762C0587D3 From: Jiri Denemark To: libvir-list@redhat.com Date: Wed, 7 Jun 2017 10:37:35 +0200 Message-Id: <558f4e5d91e0652f055033a806d2d3d1f63a73c1.1496824604.git.jdenemar@redhat.com> In-Reply-To: References: In-Reply-To: References: Mail-Followup-To: libvir-list@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v2 10/20] qemu: Introduce virQEMUSaveData structure X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Wed, 07 Jun 2017 08:38:13 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" The new structure encapsulates save image header and associated data (domain XML). Signed-off-by: Jiri Denemark --- Notes: Version 2: - new patch (separated from the original 06/15) src/qemu/qemu_driver.c | 165 ++++++++++++++++++++++++++-------------------= ---- 1 file changed, 86 insertions(+), 79 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 5f5215b3d..dba0d4025 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -2811,6 +2811,14 @@ struct _virQEMUSaveHeader { uint32_t unused[15]; }; =20 +typedef struct _virQEMUSaveData virQEMUSaveData; +typedef virQEMUSaveData *virQEMUSaveDataPtr; +struct _virQEMUSaveData { + virQEMUSaveHeader header; + char *xml; +}; + + static inline void bswap_header(virQEMUSaveHeaderPtr hdr) { @@ -2822,31 +2830,39 @@ bswap_header(virQEMUSaveHeaderPtr hdr) =20 =20 static void -virQEMUSaveDataFree(virQEMUSaveHeaderPtr header) +virQEMUSaveDataFree(virQEMUSaveDataPtr data) { - if (!header) + if (!data) return; =20 - VIR_FREE(header); + VIR_FREE(data->xml); + VIR_FREE(data); } =20 =20 -static virQEMUSaveHeaderPtr -virQEMUSaveDataNew(char *domXML ATTRIBUTE_UNUSED, +/** + * This function steals @domXML on success. + */ +static virQEMUSaveDataPtr +virQEMUSaveDataNew(char *domXML, bool running, int compressed) { - virQEMUSaveHeaderPtr header =3D NULL; + virQEMUSaveDataPtr data =3D NULL; + virQEMUSaveHeaderPtr header; =20 - if (VIR_ALLOC(header) < 0) + if (VIR_ALLOC(data) < 0) return NULL; =20 + VIR_STEAL_PTR(data->xml, domXML); + + header =3D &data->header; memcpy(header->magic, QEMU_SAVE_PARTIAL, sizeof(header->magic)); header->version =3D QEMU_SAVE_VERSION; header->was_running =3D running ? 1 : 0; header->compressed =3D compressed; =20 - return header; + return data; } =20 =20 @@ -2860,17 +2876,17 @@ virQEMUSaveDataNew(char *domXML ATTRIBUTE_UNUSED, * Returns -1 on failure, or 0 on success. */ static int -virQEMUSaveDataWrite(virQEMUSaveHeaderPtr header, - const char *xml, +virQEMUSaveDataWrite(virQEMUSaveDataPtr data, int fd, const char *path) { + virQEMUSaveHeaderPtr header =3D &data->header; size_t len; int ret =3D -1; size_t zerosLen =3D 0; char *zeros =3D NULL; =20 - len =3D strlen(xml) + 1; + len =3D strlen(data->xml) + 1; =20 if (header->data_len > 0) { if (len > header->data_len) { @@ -2893,7 +2909,7 @@ virQEMUSaveDataWrite(virQEMUSaveHeaderPtr header, goto cleanup; } =20 - if (safewrite(fd, xml, header->data_len) !=3D header->data_len || + if (safewrite(fd, data->xml, header->data_len) !=3D header->data_len || safewrite(fd, zeros, zerosLen) !=3D zerosLen) { virReportSystemError(errno, _("failed to write domain xml to '%s'"), @@ -2910,10 +2926,12 @@ virQEMUSaveDataWrite(virQEMUSaveHeaderPtr header, =20 =20 static int -virQEMUSaveDataFinish(virQEMUSaveHeaderPtr header, +virQEMUSaveDataFinish(virQEMUSaveDataPtr data, int *fd, const char *path) { + virQEMUSaveHeaderPtr header =3D &data->header; + memcpy(header->magic, QEMU_SAVE_MAGIC, sizeof(header->magic)); =20 if (safewrite(*fd, header, sizeof(*header)) !=3D sizeof(*header) || @@ -3142,8 +3160,7 @@ static int qemuDomainSaveMemory(virQEMUDriverPtr driver, virDomainObjPtr vm, const char *path, - const char *domXML, - virQEMUSaveHeaderPtr header, + virQEMUSaveDataPtr data, const char *compressedpath, unsigned int flags, qemuDomainAsyncJob asyncJob) @@ -3178,7 +3195,7 @@ qemuDomainSaveMemory(virQEMUDriverPtr driver, if (!(wrapperFd =3D virFileWrapperFdNew(&fd, path, wrapperFlags))) goto cleanup; =20 - if (virQEMUSaveDataWrite(header, domXML, fd, path) < 0) + if (virQEMUSaveDataWrite(data, fd, path) < 0) goto cleanup; =20 /* Perform the migration */ @@ -3200,7 +3217,7 @@ qemuDomainSaveMemory(virQEMUDriverPtr driver, goto cleanup; =20 if ((fd =3D qemuOpenFile(driver, vm, path, O_WRONLY, NULL, NULL)) < 0 = || - virQEMUSaveDataFinish(header, &fd, path) < 0) + virQEMUSaveDataFinish(data, &fd, path) < 0) goto cleanup; =20 ret =3D 0; @@ -3232,7 +3249,7 @@ qemuDomainSaveInternal(virQEMUDriverPtr driver, virDo= mainPtr dom, virObjectEventPtr event =3D NULL; qemuDomainObjPrivatePtr priv =3D vm->privateData; virCapsPtr caps; - virQEMUSaveHeaderPtr header =3D NULL; + virQEMUSaveDataPtr data =3D NULL; =20 if (!(caps =3D virQEMUDriverGetCapabilities(driver, false))) goto cleanup; @@ -3298,10 +3315,11 @@ qemuDomainSaveInternal(virQEMUDriverPtr driver, vir= DomainPtr dom, goto endjob; } =20 - if (!(header =3D virQEMUSaveDataNew(xml, was_running, compressed))) + if (!(data =3D virQEMUSaveDataNew(xml, was_running, compressed))) goto endjob; + xml =3D NULL; =20 - ret =3D qemuDomainSaveMemory(driver, vm, path, xml, header, compressed= path, + ret =3D qemuDomainSaveMemory(driver, vm, path, data, compressedpath, flags, QEMU_ASYNC_JOB_SAVE); if (ret < 0) goto endjob; @@ -3335,7 +3353,7 @@ qemuDomainSaveInternal(virQEMUDriverPtr driver, virDo= mainPtr dom, =20 cleanup: VIR_FREE(xml); - virQEMUSaveDataFree(header); + virQEMUSaveDataFree(data); qemuDomainEventQueue(driver, event); virObjectUnref(caps); return ret; @@ -6244,8 +6262,7 @@ qemuDomainSaveImageUpdateDef(virQEMUDriverPtr driver, * @driver: qemu driver data * @path: path of the save image * @ret_def: returns domain definition created from the XML stored in the = image - * @ret_header: returns structure filled with data from the image header - * @xmlout: returns the XML from the image file (may be NULL) + * @ret_data: returns structure filled with data from the image header * @bypass_cache: bypass cache when opening the file * @wrapperFd: returns the file wrapper structure * @open_write: open the file for writing (for updates) @@ -6259,16 +6276,15 @@ static int ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4) qemuDomainSaveImageOpen(virQEMUDriverPtr driver, const char *path, virDomainDefPtr *ret_def, - virQEMUSaveHeaderPtr *ret_header, - char **xmlout, + virQEMUSaveDataPtr *ret_data, bool bypass_cache, virFileWrapperFdPtr *wrapperFd, bool open_write, bool unlink_corrupt) { int fd =3D -1; - char *xml =3D NULL; - virQEMUSaveHeaderPtr header =3D NULL; + virQEMUSaveDataPtr data =3D NULL; + virQEMUSaveHeaderPtr header; virDomainDefPtr def =3D NULL; int oflags =3D open_write ? O_RDWR : O_RDONLY; virCapsPtr caps =3D NULL; @@ -6293,9 +6309,10 @@ qemuDomainSaveImageOpen(virQEMUDriverPtr driver, VIR_FILE_WRAPPER_BYPASS_CACHE))) goto error; =20 - if (VIR_ALLOC(header) < 0) + if (VIR_ALLOC(data) < 0) goto error; =20 + header =3D &data->header; if (saferead(fd, header, sizeof(*header)) !=3D sizeof(*header)) { if (unlink_corrupt) { if (VIR_CLOSE(fd) < 0 || unlink(path) < 0) { @@ -6347,32 +6364,27 @@ qemuDomainSaveImageOpen(virQEMUDriverPtr driver, =20 if (header->data_len <=3D 0) { virReportError(VIR_ERR_OPERATION_FAILED, - _("invalid XML length: %d"), header->data_len); + _("invalid header data length: %d"), header->data_l= en); goto error; } =20 - if (VIR_ALLOC_N(xml, header->data_len) < 0) + if (VIR_ALLOC_N(data->xml, header->data_len) < 0) goto error; =20 - if (saferead(fd, xml, header->data_len) !=3D header->data_len) { + if (saferead(fd, data->xml, header->data_len) !=3D header->data_len) { virReportError(VIR_ERR_OPERATION_FAILED, - "%s", _("failed to read XML")); + "%s", _("failed to read domain XML")); goto error; } =20 /* Create a domain from this XML */ - if (!(def =3D virDomainDefParseString(xml, caps, driver->xmlopt, NULL, + if (!(def =3D virDomainDefParseString(data->xml, caps, driver->xmlopt,= NULL, VIR_DOMAIN_DEF_PARSE_INACTIVE | VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE= ))) goto error; =20 - if (xmlout) - *xmlout =3D xml; - else - VIR_FREE(xml); - *ret_def =3D def; - *ret_header =3D header; + *ret_data =3D data; =20 virObjectUnref(caps); =20 @@ -6380,8 +6392,7 @@ qemuDomainSaveImageOpen(virQEMUDriverPtr driver, =20 error: virDomainDefFree(def); - VIR_FREE(xml); - virQEMUSaveDataFree(header); + virQEMUSaveDataFree(data); VIR_FORCE_CLOSE(fd); virObjectUnref(caps); =20 @@ -6393,7 +6404,7 @@ qemuDomainSaveImageStartVM(virConnectPtr conn, virQEMUDriverPtr driver, virDomainObjPtr vm, int *fd, - virQEMUSaveHeaderPtr header, + virQEMUSaveDataPtr data, const char *path, bool start_paused, qemuDomainAsyncJob asyncJob) @@ -6405,6 +6416,7 @@ qemuDomainSaveImageStartVM(virConnectPtr conn, virCommandPtr cmd =3D NULL; char *errbuf =3D NULL; virQEMUDriverConfigPtr cfg =3D virQEMUDriverGetConfig(driver); + virQEMUSaveHeaderPtr header =3D &data->header; =20 if ((header->version =3D=3D 2) && (header->compressed !=3D QEMU_SAVE_FORMAT_RAW)) { @@ -6514,12 +6526,11 @@ qemuDomainRestoreFlags(virConnectPtr conn, qemuDomainObjPrivatePtr priv =3D NULL; virDomainDefPtr def =3D NULL; virDomainObjPtr vm =3D NULL; - char *xml =3D NULL; char *xmlout =3D NULL; const char *newxml =3D dxml; int fd =3D -1; int ret =3D -1; - virQEMUSaveHeaderPtr header =3D NULL; + virQEMUSaveDataPtr data =3D NULL; virFileWrapperFdPtr wrapperFd =3D NULL; bool hook_taint =3D false; =20 @@ -6530,7 +6541,7 @@ qemuDomainRestoreFlags(virConnectPtr conn, =20 virNWFilterReadLockFilterUpdates(); =20 - fd =3D qemuDomainSaveImageOpen(driver, path, &def, &header, &xml, + fd =3D qemuDomainSaveImageOpen(driver, path, &def, &data, (flags & VIR_DOMAIN_SAVE_BYPASS_CACHE) != =3D 0, &wrapperFd, false, false); if (fd < 0) @@ -6546,7 +6557,7 @@ qemuDomainRestoreFlags(virConnectPtr conn, VIR_HOOK_QEMU_OP_RESTORE, VIR_HOOK_SUBOP_BEGIN, NULL, - dxml ? dxml : xml, + dxml ? dxml : data->xml, &xmlout)) < 0) goto cleanup; =20 @@ -6576,9 +6587,9 @@ qemuDomainRestoreFlags(virConnectPtr conn, def =3D NULL; =20 if (flags & VIR_DOMAIN_SAVE_RUNNING) - header->was_running =3D 1; + data->header.was_running =3D 1; else if (flags & VIR_DOMAIN_SAVE_PAUSED) - header->was_running =3D 0; + data->header.was_running =3D 0; =20 if (hook_taint) { priv =3D vm->privateData; @@ -6588,7 +6599,7 @@ qemuDomainRestoreFlags(virConnectPtr conn, if (qemuProcessBeginJob(driver, vm, VIR_DOMAIN_JOB_OPERATION_RESTORE) = < 0) goto cleanup; =20 - ret =3D qemuDomainSaveImageStartVM(conn, driver, vm, &fd, header, path, + ret =3D qemuDomainSaveImageStartVM(conn, driver, vm, &fd, data, path, false, QEMU_ASYNC_JOB_START); if (virFileWrapperFdClose(wrapperFd) < 0) VIR_WARN("Failed to close %s", path); @@ -6598,8 +6609,7 @@ qemuDomainRestoreFlags(virConnectPtr conn, cleanup: virDomainDefFree(def); VIR_FORCE_CLOSE(fd); - VIR_FREE(xml); - virQEMUSaveDataFree(header); + virQEMUSaveDataFree(data); VIR_FREE(xmlout); virFileWrapperFdFree(wrapperFd); if (vm && ret < 0) @@ -6624,12 +6634,12 @@ qemuDomainSaveImageGetXMLDesc(virConnectPtr conn, c= onst char *path, char *ret =3D NULL; virDomainDefPtr def =3D NULL; int fd =3D -1; - virQEMUSaveHeaderPtr header =3D NULL; + virQEMUSaveDataPtr data =3D NULL; =20 /* We only take subset of virDomainDefFormat flags. */ virCheckFlags(VIR_DOMAIN_XML_SECURE, NULL); =20 - fd =3D qemuDomainSaveImageOpen(driver, path, &def, &header, NULL, + fd =3D qemuDomainSaveImageOpen(driver, path, &def, &data, false, NULL, false, false); =20 if (fd < 0) @@ -6641,7 +6651,7 @@ qemuDomainSaveImageGetXMLDesc(virConnectPtr conn, con= st char *path, ret =3D qemuDomainDefFormatXML(driver, def, flags); =20 cleanup: - virQEMUSaveDataFree(header); + virQEMUSaveDataFree(data); virDomainDefFree(def); VIR_FORCE_CLOSE(fd); return ret; @@ -6656,8 +6666,7 @@ qemuDomainSaveImageDefineXML(virConnectPtr conn, cons= t char *path, virDomainDefPtr def =3D NULL; virDomainDefPtr newdef =3D NULL; int fd =3D -1; - char *xml =3D NULL; - virQEMUSaveHeaderPtr header =3D NULL; + virQEMUSaveDataPtr data =3D NULL; int state =3D -1; =20 virCheckFlags(VIR_DOMAIN_SAVE_RUNNING | @@ -6668,7 +6677,7 @@ qemuDomainSaveImageDefineXML(virConnectPtr conn, cons= t char *path, else if (flags & VIR_DOMAIN_SAVE_PAUSED) state =3D 0; =20 - fd =3D qemuDomainSaveImageOpen(driver, path, &def, &header, &xml, + fd =3D qemuDomainSaveImageOpen(driver, path, &def, &data, false, NULL, true, false); =20 if (fd < 0) @@ -6677,25 +6686,25 @@ qemuDomainSaveImageDefineXML(virConnectPtr conn, co= nst char *path, if (virDomainSaveImageDefineXMLEnsureACL(conn, def) < 0) goto cleanup; =20 - if (STREQ(xml, dxml) && - (state < 0 || state =3D=3D header->was_running)) { + if (STREQ(data->xml, dxml) && + (state < 0 || state =3D=3D data->header.was_running)) { /* no change to the XML */ ret =3D 0; goto cleanup; } =20 if (state >=3D 0) - header->was_running =3D state; + data->header.was_running =3D state; =20 if (!(newdef =3D qemuDomainSaveImageUpdateDef(driver, def, dxml))) goto cleanup; =20 - VIR_FREE(xml); + VIR_FREE(data->xml); =20 - if (!(xml =3D qemuDomainDefFormatXML(driver, newdef, - VIR_DOMAIN_XML_INACTIVE | - VIR_DOMAIN_XML_SECURE | - VIR_DOMAIN_XML_MIGRATABLE))) + if (!(data->xml =3D qemuDomainDefFormatXML(driver, newdef, + VIR_DOMAIN_XML_INACTIVE | + VIR_DOMAIN_XML_SECURE | + VIR_DOMAIN_XML_MIGRATABLE))) goto cleanup; =20 if (lseek(fd, 0, SEEK_SET) !=3D 0) { @@ -6703,7 +6712,7 @@ qemuDomainSaveImageDefineXML(virConnectPtr conn, cons= t char *path, goto cleanup; } =20 - if (virQEMUSaveDataWrite(header, xml, fd, path) < 0) + if (virQEMUSaveDataWrite(data, fd, path) < 0) goto cleanup; =20 if (VIR_CLOSE(fd) < 0) { @@ -6717,8 +6726,7 @@ qemuDomainSaveImageDefineXML(virConnectPtr conn, cons= t char *path, virDomainDefFree(def); virDomainDefFree(newdef); VIR_FORCE_CLOSE(fd); - VIR_FREE(xml); - virQEMUSaveDataFree(header); + virQEMUSaveDataFree(data); return ret; } =20 @@ -6737,12 +6745,11 @@ qemuDomainObjRestore(virConnectPtr conn, qemuDomainObjPrivatePtr priv =3D vm->privateData; int fd =3D -1; int ret =3D -1; - char *xml =3D NULL; char *xmlout =3D NULL; - virQEMUSaveHeaderPtr header =3D NULL; + virQEMUSaveDataPtr data =3D NULL; virFileWrapperFdPtr wrapperFd =3D NULL; =20 - fd =3D qemuDomainSaveImageOpen(driver, path, &def, &header, &xml, + fd =3D qemuDomainSaveImageOpen(driver, path, &def, &data, bypass_cache, &wrapperFd, false, true); if (fd < 0) { if (fd =3D=3D -3) @@ -6756,7 +6763,7 @@ qemuDomainObjRestore(virConnectPtr conn, if ((hookret =3D virHookCall(VIR_HOOK_DRIVER_QEMU, def->name, VIR_HOOK_QEMU_OP_RESTORE, VIR_HOOK_SUBOP_BEGIN, - NULL, xml, &xmlout)) < 0) + NULL, data->xml, &xmlout)) < 0) goto cleanup; =20 if (hookret =3D=3D 0 && !virStringIsEmpty(xmlout)) { @@ -6790,14 +6797,13 @@ qemuDomainObjRestore(virConnectPtr conn, virDomainObjAssignDef(vm, def, true, NULL); def =3D NULL; =20 - ret =3D qemuDomainSaveImageStartVM(conn, driver, vm, &fd, header, path, + ret =3D qemuDomainSaveImageStartVM(conn, driver, vm, &fd, data, path, start_paused, asyncJob); if (virFileWrapperFdClose(wrapperFd) < 0) VIR_WARN("Failed to close %s", path); =20 cleanup: - VIR_FREE(xml); - virQEMUSaveDataFree(header); + virQEMUSaveDataFree(data); VIR_FREE(xmlout); virDomainDefFree(def); VIR_FORCE_CLOSE(fd); @@ -14363,7 +14369,7 @@ qemuDomainSnapshotCreateActiveExternal(virConnectPt= r conn, virQEMUDriverConfigPtr cfg =3D NULL; int compressed; char *compressedpath =3D NULL; - virQEMUSaveHeaderPtr header =3D NULL; + virQEMUSaveDataPtr data =3D NULL; =20 /* If quiesce was requested, then issue a freeze command, and a * counterpart thaw command when it is actually sent to agent. @@ -14435,10 +14441,11 @@ qemuDomainSnapshotCreateActiveExternal(virConnect= Ptr conn, if (!(xml =3D qemuDomainDefFormatLive(driver, vm->def, true, true)= )) goto cleanup; =20 - if (!(header =3D virQEMUSaveDataNew(xml, resume, compressed))) + if (!(data =3D virQEMUSaveDataNew(xml, resume, compressed))) goto cleanup; + xml =3D NULL; =20 - if ((ret =3D qemuDomainSaveMemory(driver, vm, snap->def->file, xml= , header, + if ((ret =3D qemuDomainSaveMemory(driver, vm, snap->def->file, dat= a, compressedpath, 0, QEMU_ASYNC_JOB_SNAPSHOT)) < 0) goto cleanup; @@ -14508,7 +14515,7 @@ qemuDomainSnapshotCreateActiveExternal(virConnectPt= r conn, ret =3D -1; } =20 - virQEMUSaveDataFree(header); + virQEMUSaveDataFree(data); VIR_FREE(xml); VIR_FREE(compressedpath); virObjectUnref(cfg); --=20 2.13.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list