From nobody Tue Feb 10 13:43:01 2026 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 1496824700653380.741896519163; Wed, 7 Jun 2017 01:38:20 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 42E2281255; Wed, 7 Jun 2017 08:38:19 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id EC4BC62926; Wed, 7 Jun 2017 08:38:18 +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 A50A34A493; Wed, 7 Jun 2017 08:38:18 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v578bp5V004824 for ; Wed, 7 Jun 2017 04:37:51 -0400 Received: by smtp.corp.redhat.com (Postfix) id 723647D51A; 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 F068560467 for ; Wed, 7 Jun 2017 08:37:50 +0000 (UTC) Received: by virval.usersys.redhat.com (Postfix, from userid 500) id 78E71101932; Wed, 7 Jun 2017 10:37:46 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 42E2281255 Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx01.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 42E2281255 From: Jiri Denemark To: libvir-list@redhat.com Date: Wed, 7 Jun 2017 10:37:32 +0200 Message-Id: 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.11 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v2 07/20] qemu: Introduce virQEMUSaveData{New, Free} 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.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Wed, 07 Jun 2017 08:38:19 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" This is a preparation for creating a new virQEMUSaveData structure which will encapsulate all save image header data. Signed-off-by: Jiri Denemark --- Notes: Version 2: - new patch (separated from the original 06/15) src/qemu/qemu_driver.c | 128 ++++++++++++++++++++++++++++++++-------------= ---- 1 file changed, 83 insertions(+), 45 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 9d0feb268..be6bedd6a 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -2821,6 +2821,36 @@ bswap_header(virQEMUSaveHeaderPtr hdr) } =20 =20 +static void +virQEMUSaveDataFree(virQEMUSaveHeaderPtr header) +{ + if (!header) + return; + + VIR_FREE(header); +} + + +static virQEMUSaveHeaderPtr +virQEMUSaveDataNew(char *domXML, + bool running, + int compressed) +{ + virQEMUSaveHeaderPtr header =3D NULL; + + if (VIR_ALLOC(header) < 0) + return NULL; + + 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; + header->data_len =3D strlen(domXML) + 1; + + return header; +} + + /* return -errno on failure, or 0 on success */ static int qemuDomainSaveHeader(int fd, const char *path, const char *xml, @@ -3062,13 +3092,11 @@ qemuDomainSaveMemory(virQEMUDriverPtr driver, virDomainObjPtr vm, const char *path, const char *domXML, - int compressed, + virQEMUSaveHeaderPtr header, const char *compressedpath, - bool was_running, unsigned int flags, qemuDomainAsyncJob asyncJob) { - virQEMUSaveHeader header; bool bypassSecurityDriver =3D false; bool needUnlink =3D false; int ret =3D -1; @@ -3077,13 +3105,6 @@ qemuDomainSaveMemory(virQEMUDriverPtr driver, virFileWrapperFdPtr wrapperFd =3D NULL; unsigned int wrapperFlags =3D VIR_FILE_WRAPPER_NON_BLOCKING; =20 - memset(&header, 0, sizeof(header)); - memcpy(header.magic, QEMU_SAVE_PARTIAL, sizeof(header.magic)); - header.version =3D QEMU_SAVE_VERSION; - header.was_running =3D was_running ? 1 : 0; - header.compressed =3D compressed; - header.data_len =3D strlen(domXML) + 1; - /* Obtain the file handle. */ if ((flags & VIR_DOMAIN_SAVE_BYPASS_CACHE)) { wrapperFlags |=3D VIR_FILE_WRAPPER_BYPASS_CACHE; @@ -3107,7 +3128,7 @@ qemuDomainSaveMemory(virQEMUDriverPtr driver, goto cleanup; =20 /* Write header to file, followed by XML */ - if (qemuDomainSaveHeader(fd, path, domXML, &header) < 0) + if (qemuDomainSaveHeader(fd, path, domXML, header) < 0) goto cleanup; =20 /* Perform the migration */ @@ -3131,7 +3152,7 @@ qemuDomainSaveMemory(virQEMUDriverPtr driver, if ((fd =3D qemuOpenFile(driver, vm, path, O_WRONLY, NULL, NULL)) < 0) goto cleanup; =20 - memcpy(header.magic, QEMU_SAVE_MAGIC, sizeof(header.magic)); + memcpy(header->magic, QEMU_SAVE_MAGIC, sizeof(header->magic)); =20 if (safewrite(fd, &header, sizeof(header)) !=3D sizeof(header)) { virReportSystemError(errno, _("unable to write %s"), path); @@ -3172,6 +3193,7 @@ qemuDomainSaveInternal(virQEMUDriverPtr driver, virDo= mainPtr dom, virObjectEventPtr event =3D NULL; qemuDomainObjPrivatePtr priv =3D vm->privateData; virCapsPtr caps; + virQEMUSaveHeaderPtr header =3D NULL; =20 if (!(caps =3D virQEMUDriverGetCapabilities(driver, false))) goto cleanup; @@ -3237,9 +3259,11 @@ qemuDomainSaveInternal(virQEMUDriverPtr driver, virD= omainPtr dom, goto endjob; } =20 - ret =3D qemuDomainSaveMemory(driver, vm, path, xml, compressed, - compressedpath, was_running, flags, - QEMU_ASYNC_JOB_SAVE); + if (!(header =3D virQEMUSaveDataNew(xml, was_running, compressed))) + goto endjob; + + ret =3D qemuDomainSaveMemory(driver, vm, path, xml, header, compressed= path, + flags, QEMU_ASYNC_JOB_SAVE); if (ret < 0) goto endjob; =20 @@ -3272,6 +3296,7 @@ qemuDomainSaveInternal(virQEMUDriverPtr driver, virDo= mainPtr dom, =20 cleanup: VIR_FREE(xml); + virQEMUSaveDataFree(header); qemuDomainEventQueue(driver, event); virObjectUnref(caps); return ret; @@ -6195,7 +6220,7 @@ static int ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4) qemuDomainSaveImageOpen(virQEMUDriverPtr driver, const char *path, virDomainDefPtr *ret_def, - virQEMUSaveHeaderPtr ret_header, + virQEMUSaveHeaderPtr *ret_header, char **xmlout, bool bypass_cache, virFileWrapperFdPtr *wrapperFd, @@ -6203,8 +6228,8 @@ qemuDomainSaveImageOpen(virQEMUDriverPtr driver, bool unlink_corrupt) { int fd =3D -1; - virQEMUSaveHeader header; char *xml =3D NULL; + virQEMUSaveHeaderPtr header =3D NULL; virDomainDefPtr def =3D NULL; int oflags =3D open_write ? O_RDWR : O_RDONLY; virCapsPtr caps =3D NULL; @@ -6229,7 +6254,10 @@ qemuDomainSaveImageOpen(virQEMUDriverPtr driver, VIR_FILE_WRAPPER_BYPASS_CACHE))) goto error; =20 - if (saferead(fd, &header, sizeof(header)) !=3D sizeof(header)) { + if (VIR_ALLOC(header) < 0) + goto error; + + if (saferead(fd, header, sizeof(*header)) !=3D sizeof(*header)) { if (unlink_corrupt) { if (VIR_CLOSE(fd) < 0 || unlink(path) < 0) { virReportSystemError(errno, @@ -6245,11 +6273,11 @@ qemuDomainSaveImageOpen(virQEMUDriverPtr driver, goto error; } =20 - if (memcmp(header.magic, QEMU_SAVE_MAGIC, sizeof(header.magic)) !=3D 0= ) { + if (memcmp(header->magic, QEMU_SAVE_MAGIC, sizeof(header->magic)) !=3D= 0) { const char *msg =3D _("image magic is incorrect"); =20 - if (memcmp(header.magic, QEMU_SAVE_PARTIAL, - sizeof(header.magic)) =3D=3D 0) { + if (memcmp(header->magic, QEMU_SAVE_PARTIAL, + sizeof(header->magic)) =3D=3D 0) { msg =3D _("save image is incomplete"); if (unlink_corrupt) { if (VIR_CLOSE(fd) < 0 || unlink(path) < 0) { @@ -6266,28 +6294,28 @@ qemuDomainSaveImageOpen(virQEMUDriverPtr driver, goto error; } =20 - if (header.version > QEMU_SAVE_VERSION) { + if (header->version > QEMU_SAVE_VERSION) { /* convert endianess and try again */ - bswap_header(&header); + bswap_header(header); } =20 - if (header.version > QEMU_SAVE_VERSION) { + if (header->version > QEMU_SAVE_VERSION) { virReportError(VIR_ERR_OPERATION_FAILED, _("image version is not supported (%d > %d)"), - header.version, QEMU_SAVE_VERSION); + header->version, QEMU_SAVE_VERSION); goto error; } =20 - if (header.data_len <=3D 0) { + if (header->data_len <=3D 0) { virReportError(VIR_ERR_OPERATION_FAILED, - _("invalid XML length: %d"), header.data_len); + _("invalid XML length: %d"), header->data_len); goto error; } =20 - if (VIR_ALLOC_N(xml, header.data_len) < 0) + if (VIR_ALLOC_N(xml, header->data_len) < 0) goto error; =20 - if (saferead(fd, xml, header.data_len) !=3D header.data_len) { + if (saferead(fd, xml, header->data_len) !=3D header->data_len) { virReportError(VIR_ERR_OPERATION_FAILED, "%s", _("failed to read XML")); goto error; @@ -6314,6 +6342,7 @@ qemuDomainSaveImageOpen(virQEMUDriverPtr driver, error: virDomainDefFree(def); VIR_FREE(xml); + virQEMUSaveDataFree(header); VIR_FORCE_CLOSE(fd); virObjectUnref(caps); =20 @@ -6325,7 +6354,7 @@ qemuDomainSaveImageStartVM(virConnectPtr conn, virQEMUDriverPtr driver, virDomainObjPtr vm, int *fd, - const virQEMUSaveHeader *header, + virQEMUSaveHeaderPtr header, const char *path, bool start_paused, qemuDomainAsyncJob asyncJob) @@ -6451,7 +6480,7 @@ qemuDomainRestoreFlags(virConnectPtr conn, const char *newxml =3D dxml; int fd =3D -1; int ret =3D -1; - virQEMUSaveHeader header; + virQEMUSaveHeaderPtr header =3D NULL; virFileWrapperFdPtr wrapperFd =3D NULL; bool hook_taint =3D false; =20 @@ -6508,9 +6537,9 @@ qemuDomainRestoreFlags(virConnectPtr conn, def =3D NULL; =20 if (flags & VIR_DOMAIN_SAVE_RUNNING) - header.was_running =3D 1; + header->was_running =3D 1; else if (flags & VIR_DOMAIN_SAVE_PAUSED) - header.was_running =3D 0; + header->was_running =3D 0; =20 if (hook_taint) { priv =3D vm->privateData; @@ -6520,7 +6549,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, pat= h, + ret =3D qemuDomainSaveImageStartVM(conn, driver, vm, &fd, header, path, false, QEMU_ASYNC_JOB_START); if (virFileWrapperFdClose(wrapperFd) < 0) VIR_WARN("Failed to close %s", path); @@ -6531,6 +6560,7 @@ qemuDomainRestoreFlags(virConnectPtr conn, virDomainDefFree(def); VIR_FORCE_CLOSE(fd); VIR_FREE(xml); + virQEMUSaveDataFree(header); VIR_FREE(xmlout); virFileWrapperFdFree(wrapperFd); if (vm && ret < 0) @@ -6555,7 +6585,7 @@ qemuDomainSaveImageGetXMLDesc(virConnectPtr conn, con= st char *path, char *ret =3D NULL; virDomainDefPtr def =3D NULL; int fd =3D -1; - virQEMUSaveHeader header; + virQEMUSaveHeaderPtr header =3D NULL; =20 /* We only take subset of virDomainDefFormat flags. */ virCheckFlags(VIR_DOMAIN_XML_SECURE, NULL); @@ -6572,6 +6602,7 @@ qemuDomainSaveImageGetXMLDesc(virConnectPtr conn, con= st char *path, ret =3D qemuDomainDefFormatXML(driver, def, flags); =20 cleanup: + virQEMUSaveDataFree(header); virDomainDefFree(def); VIR_FORCE_CLOSE(fd); return ret; @@ -6586,9 +6617,9 @@ qemuDomainSaveImageDefineXML(virConnectPtr conn, cons= t char *path, virDomainDefPtr def =3D NULL; virDomainDefPtr newdef =3D NULL; int fd =3D -1; - virQEMUSaveHeader header; char *xml =3D NULL; size_t len; + virQEMUSaveHeaderPtr header =3D NULL; int state =3D -1; =20 virCheckFlags(VIR_DOMAIN_SAVE_RUNNING | @@ -6609,14 +6640,14 @@ qemuDomainSaveImageDefineXML(virConnectPtr conn, co= nst char *path, goto cleanup; =20 if (STREQ(xml, dxml) && - (state < 0 || state =3D=3D header.was_running)) { + (state < 0 || state =3D=3D header->was_running)) { /* no change to the XML */ ret =3D 0; goto cleanup; } =20 if (state >=3D 0) - header.was_running =3D state; + header->was_running =3D state; =20 if (!(newdef =3D qemuDomainSaveImageUpdateDef(driver, def, dxml))) goto cleanup; @@ -6631,12 +6662,12 @@ qemuDomainSaveImageDefineXML(virConnectPtr conn, co= nst char *path, goto cleanup; len =3D strlen(xml) + 1; =20 - if (len > header.data_len) { + if (len > header->data_len) { virReportError(VIR_ERR_OPERATION_FAILED, "%s", _("new xml too large to fit in file")); goto cleanup; } - if (VIR_EXPAND_N(xml, len, header.data_len - len) < 0) + if (VIR_EXPAND_N(xml, len, header->data_len - len) < 0) goto cleanup; =20 if (lseek(fd, 0, SEEK_SET) !=3D 0) { @@ -6657,6 +6688,7 @@ qemuDomainSaveImageDefineXML(virConnectPtr conn, cons= t char *path, virDomainDefFree(newdef); VIR_FORCE_CLOSE(fd); VIR_FREE(xml); + virQEMUSaveDataFree(header); return ret; } =20 @@ -6677,7 +6709,7 @@ qemuDomainObjRestore(virConnectPtr conn, int ret =3D -1; char *xml =3D NULL; char *xmlout =3D NULL; - virQEMUSaveHeader header; + virQEMUSaveHeaderPtr header =3D NULL; virFileWrapperFdPtr wrapperFd =3D NULL; =20 fd =3D qemuDomainSaveImageOpen(driver, path, &def, &header, &xml, @@ -6728,13 +6760,14 @@ qemuDomainObjRestore(virConnectPtr conn, virDomainObjAssignDef(vm, def, true, NULL); def =3D NULL; =20 - ret =3D qemuDomainSaveImageStartVM(conn, driver, vm, &fd, &header, pat= h, + ret =3D qemuDomainSaveImageStartVM(conn, driver, vm, &fd, header, path, start_paused, asyncJob); if (virFileWrapperFdClose(wrapperFd) < 0) VIR_WARN("Failed to close %s", path); =20 cleanup: VIR_FREE(xml); + virQEMUSaveDataFree(header); VIR_FREE(xmlout); virDomainDefFree(def); VIR_FORCE_CLOSE(fd); @@ -14300,6 +14333,7 @@ qemuDomainSnapshotCreateActiveExternal(virConnectPt= r conn, virQEMUDriverConfigPtr cfg =3D NULL; int compressed; char *compressedpath =3D NULL; + virQEMUSaveHeaderPtr header =3D NULL; =20 /* If quiesce was requested, then issue a freeze command, and a * counterpart thaw command when it is actually sent to agent. @@ -14371,9 +14405,12 @@ qemuDomainSnapshotCreateActiveExternal(virConnectP= tr conn, if (!(xml =3D qemuDomainDefFormatLive(driver, vm->def, true, true)= )) goto cleanup; =20 - if ((ret =3D qemuDomainSaveMemory(driver, vm, snap->def->file, xml, - compressed, compressedpath, resume, - 0, QEMU_ASYNC_JOB_SNAPSHOT)) < 0) + if (!(header =3D virQEMUSaveDataNew(xml, resume, compressed))) + goto cleanup; + + if ((ret =3D qemuDomainSaveMemory(driver, vm, snap->def->file, xml= , header, + compressedpath, 0, + QEMU_ASYNC_JOB_SNAPSHOT)) < 0) goto cleanup; =20 /* the memory image was created, remove it on errors */ @@ -14441,6 +14478,7 @@ qemuDomainSnapshotCreateActiveExternal(virConnectPt= r conn, ret =3D -1; } =20 + virQEMUSaveDataFree(header); 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