From nobody Mon Apr 29 18:08:23 2024 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 1496824694293455.36052719218765; Wed, 7 Jun 2017 01:38:14 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 457D3C057FA1; Wed, 7 Jun 2017 08:38:12 +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 030EF171F9; 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 A0E344A48E; Wed, 7 Jun 2017 08:38:11 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v578bnCj004793 for ; Wed, 7 Jun 2017 04:37:49 -0400 Received: by smtp.corp.redhat.com (Postfix) id DA6BF1724E; Wed, 7 Jun 2017 08:37:49 +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 88C535C88E for ; Wed, 7 Jun 2017 08:37:47 +0000 (UTC) Received: by virval.usersys.redhat.com (Postfix, from userid 500) id 6B47710008A; Wed, 7 Jun 2017 10:37:46 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 457D3C057FA1 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 457D3C057FA1 From: Jiri Denemark To: libvir-list@redhat.com Date: Wed, 7 Jun 2017 10:37:26 +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.16 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v2 01/20] conf: Make error reporting in virCPUDefIsEqual optional 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.16 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 function will be used in paths where mismatching CPU defs are not an error. Signed-off-by: Jiri Denemark --- Notes: Version 2: - move all the if (reportError) statements into a macro src/conf/cpu_conf.c | 83 +++++++++++++++++++++++-----------------------= ---- src/conf/cpu_conf.h | 3 +- src/conf/domain_conf.c | 2 +- 3 files changed, 41 insertions(+), 47 deletions(-) diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c index a4be5742e..ffb2e83d6 100644 --- a/src/conf/cpu_conf.c +++ b/src/conf/cpu_conf.c @@ -811,7 +811,8 @@ virCPUDefAddFeature(virCPUDefPtr def, =20 bool virCPUDefIsEqual(virCPUDefPtr src, - virCPUDefPtr dst) + virCPUDefPtr dst, + bool reportError) { bool identical =3D false; size_t i; @@ -819,98 +820,89 @@ virCPUDefIsEqual(virCPUDefPtr src, if (!src && !dst) return true; =20 +#define MISMATCH(fmt, ...) \ + if (reportError) \ + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, fmt, __VA_ARGS__) + if ((src && !dst) || (!src && dst)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Target CPU does not match source")); + MISMATCH("%s", _("Target CPU does not match source")); goto cleanup; } =20 if (src->type !=3D dst->type) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Target CPU type %s does not match source %s"), - virCPUTypeToString(dst->type), - virCPUTypeToString(src->type)); + MISMATCH(_("Target CPU type %s does not match source %s"), + virCPUTypeToString(dst->type), + virCPUTypeToString(src->type)); goto cleanup; } =20 if (src->mode !=3D dst->mode) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Target CPU mode %s does not match source %s"), - virCPUModeTypeToString(dst->mode), - virCPUModeTypeToString(src->mode)); + MISMATCH(_("Target CPU mode %s does not match source %s"), + virCPUModeTypeToString(dst->mode), + virCPUModeTypeToString(src->mode)); goto cleanup; } =20 if (src->arch !=3D dst->arch) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Target CPU arch %s does not match source %s"), - virArchToString(dst->arch), - virArchToString(src->arch)); + MISMATCH(_("Target CPU arch %s does not match source %s"), + virArchToString(dst->arch), + virArchToString(src->arch)); goto cleanup; } =20 if (STRNEQ_NULLABLE(src->model, dst->model)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Target CPU model %s does not match source %s"), - NULLSTR(dst->model), NULLSTR(src->model)); + MISMATCH(_("Target CPU model %s does not match source %s"), + NULLSTR(dst->model), NULLSTR(src->model)); goto cleanup; } =20 if (STRNEQ_NULLABLE(src->vendor, dst->vendor)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Target CPU vendor %s does not match source %s"), - NULLSTR(dst->vendor), NULLSTR(src->vendor)); + MISMATCH(_("Target CPU vendor %s does not match source %s"), + NULLSTR(dst->vendor), NULLSTR(src->vendor)); goto cleanup; } =20 if (STRNEQ_NULLABLE(src->vendor_id, dst->vendor_id)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Target CPU vendor id %s does not match source %s= "), - NULLSTR(dst->vendor_id), NULLSTR(src->vendor_id)); + MISMATCH(_("Target CPU vendor id %s does not match source %s"), + NULLSTR(dst->vendor_id), NULLSTR(src->vendor_id)); goto cleanup; } =20 if (src->sockets !=3D dst->sockets) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Target CPU sockets %d does not match source %d"), - dst->sockets, src->sockets); + MISMATCH(_("Target CPU sockets %d does not match source %d"), + dst->sockets, src->sockets); goto cleanup; } =20 if (src->cores !=3D dst->cores) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Target CPU cores %d does not match source %d"), - dst->cores, src->cores); + MISMATCH(_("Target CPU cores %d does not match source %d"), + dst->cores, src->cores); goto cleanup; } =20 if (src->threads !=3D dst->threads) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Target CPU threads %d does not match source %d"), - dst->threads, src->threads); + MISMATCH(_("Target CPU threads %d does not match source %d"), + dst->threads, src->threads); goto cleanup; } =20 if (src->nfeatures !=3D dst->nfeatures) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Target CPU feature count %zu does not match sour= ce %zu"), - dst->nfeatures, src->nfeatures); + MISMATCH(_("Target CPU feature count %zu does not match source %zu= "), + dst->nfeatures, src->nfeatures); goto cleanup; } =20 for (i =3D 0; i < src->nfeatures; i++) { if (STRNEQ(src->features[i].name, dst->features[i].name)) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Target CPU feature %s does not match source = %s"), - dst->features[i].name, src->features[i].name); + MISMATCH(_("Target CPU feature %s does not match source %s"), + dst->features[i].name, src->features[i].name); goto cleanup; } =20 if (src->features[i].policy !=3D dst->features[i].policy) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Target CPU feature policy %s does not match = source %s"), - virCPUFeaturePolicyTypeToString(dst->features[i= ].policy), - virCPUFeaturePolicyTypeToString(src->features[i= ].policy)); + MISMATCH(_("Target CPU feature policy %s does not match source= %s"), + virCPUFeaturePolicyTypeToString(dst->features[i].poli= cy), + virCPUFeaturePolicyTypeToString(src->features[i].poli= cy)); goto cleanup; } } @@ -920,11 +912,12 @@ virCPUDefIsEqual(virCPUDefPtr src, (src->cache && dst->cache && (src->cache->level !=3D dst->cache->level || src->cache->mode !=3D dst->cache->mode))) { - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Target CPU cache does not match source")); + MISMATCH("%s", _("Target CPU cache does not match source")); goto cleanup; } =20 +#undef MISMATCH + identical =3D true; =20 cleanup: diff --git a/src/conf/cpu_conf.h b/src/conf/cpu_conf.h index 09438b68b..b0d891552 100644 --- a/src/conf/cpu_conf.h +++ b/src/conf/cpu_conf.h @@ -189,7 +189,8 @@ virCPUDefParseXML(xmlNodePtr node, =20 bool virCPUDefIsEqual(virCPUDefPtr src, - virCPUDefPtr dst); + virCPUDefPtr dst, + bool reportError); =20 char * virCPUDefFormat(virCPUDefPtr def, diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 958a5b7cd..5f99dad9c 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -20090,7 +20090,7 @@ virDomainDefCheckABIStabilityFlags(virDomainDefPtr = src, goto error; } =20 - if (!virCPUDefIsEqual(src->cpu, dst->cpu)) + if (!virCPUDefIsEqual(src->cpu, dst->cpu, true)) goto error; =20 if (!virSysinfoIsEqual(src->sysinfo, dst->sysinfo)) --=20 2.13.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Mon Apr 29 18:08:23 2024 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 1496824691376292.3734560017416; Wed, 7 Jun 2017 01:38:11 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id EFCD47F6C7; Wed, 7 Jun 2017 08:38:09 +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 CA14A757D9; Wed, 7 Jun 2017 08:38:09 +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 8438C180BAFF; Wed, 7 Jun 2017 08:38:09 +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 v578bnOP004791 for ; Wed, 7 Jun 2017 04:37:49 -0400 Received: by smtp.corp.redhat.com (Postfix) id D42D6757CD; Wed, 7 Jun 2017 08:37:49 +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 5D57F757D9 for ; Wed, 7 Jun 2017 08:37:47 +0000 (UTC) Received: by virval.usersys.redhat.com (Postfix, from userid 500) id 6DDE810192D; Wed, 7 Jun 2017 10:37:46 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com EFCD47F6C7 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 EFCD47F6C7 From: Jiri Denemark To: libvir-list@redhat.com Date: Wed, 7 Jun 2017 10:37:27 +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.14 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v2 02/20] conf: Refactor virCPUDefParseXML 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.14 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:10 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Jiri Denemark --- Notes: Version 2: - no need to distinguish 0 vs 1 return codes - better documentation src/conf/cpu_conf.c | 109 +++++++++++++++++++++++++++------------------= ---- src/conf/cpu_conf.h | 9 ++-- src/conf/domain_conf.c | 12 +----- src/cpu/cpu.c | 5 +-- tests/cputest.c | 5 +-- 5 files changed, 72 insertions(+), 68 deletions(-) diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c index ffb2e83d6..ae9f52c8d 100644 --- a/src/conf/cpu_conf.c +++ b/src/conf/cpu_conf.c @@ -245,12 +245,25 @@ virCPUDefCopy(const virCPUDef *cpu) } =20 =20 -virCPUDefPtr -virCPUDefParseXML(xmlNodePtr node, - xmlXPathContextPtr ctxt, - virCPUType type) +/* + * Parses CPU definition XML from a node pointed to by @xpath. If @xpath is + * NULL, the current node of @ctxt is used (i.e., it is a shortcut to "."). + * + * Missing element in the XML document is not considered an error un= less + * @xpath is NULL in which case the function expects it was provided with a + * valid element already. In other words, the function returns succe= ss + * and sets @cpu to NULL if @xpath is not NULL and the node pointed to by + * @xpath is not found. + * + * Returns 0 on success, -1 on error. + */ +int +virCPUDefParseXML(xmlXPathContextPtr ctxt, + const char *xpath, + virCPUType type, + virCPUDefPtr *cpu) { - virCPUDefPtr def; + virCPUDefPtr def =3D NULL; xmlNodePtr *nodes =3D NULL; xmlNodePtr oldnode =3D ctxt->node; int n; @@ -258,15 +271,23 @@ virCPUDefParseXML(xmlNodePtr node, char *cpuMode; char *fallback =3D NULL; char *vendor_id =3D NULL; + int ret =3D -1; =20 - if (!xmlStrEqual(node->name, BAD_CAST "cpu")) { + *cpu =3D NULL; + + if (xpath && !(ctxt->node =3D virXPathNode(xpath, ctxt))) { + ret =3D 0; + goto cleanup; + } + + if (!xmlStrEqual(ctxt->node->name, BAD_CAST "cpu")) { virReportError(VIR_ERR_XML_ERROR, "%s", _("XML does not contain expected 'cpu' element")); - return NULL; + goto cleanup; } =20 if (VIR_ALLOC(def) < 0) - return NULL; + goto cleanup; =20 if (type =3D=3D VIR_CPU_TYPE_AUTO) { if (virXPathBoolean("boolean(./arch)", ctxt)) { @@ -274,7 +295,7 @@ virCPUDefParseXML(xmlNodePtr node, virReportError(VIR_ERR_XML_ERROR, "%s", _("'arch' element cannot be used inside 'cp= u'" " element with 'match' attribute'")); - goto error; + goto cleanup; } def->type =3D VIR_CPU_TYPE_HOST; } else { @@ -284,12 +305,12 @@ virCPUDefParseXML(xmlNodePtr node, def->type =3D type; } =20 - if ((cpuMode =3D virXMLPropString(node, "mode"))) { + if ((cpuMode =3D virXMLPropString(ctxt->node, "mode"))) { if (def->type =3D=3D VIR_CPU_TYPE_HOST) { VIR_FREE(cpuMode); virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Attribute mode is only allowed for guest CPU= ")); - goto error; + goto cleanup; } else { def->mode =3D virCPUModeTypeFromString(cpuMode); =20 @@ -298,7 +319,7 @@ virCPUDefParseXML(xmlNodePtr node, _("Invalid mode attribute '%s'"), cpuMode); VIR_FREE(cpuMode); - goto error; + goto cleanup; } VIR_FREE(cpuMode); } @@ -310,7 +331,7 @@ virCPUDefParseXML(xmlNodePtr node, } =20 if (def->type =3D=3D VIR_CPU_TYPE_GUEST) { - char *match =3D virXMLPropString(node, "match"); + char *match =3D virXMLPropString(ctxt->node, "match"); char *check; =20 if (!match) { @@ -326,11 +347,11 @@ virCPUDefParseXML(xmlNodePtr node, virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Invalid match attribute for CPU " "specification")); - goto error; + goto cleanup; } } =20 - if ((check =3D virXMLPropString(node, "check"))) { + if ((check =3D virXMLPropString(ctxt->node, "check"))) { int value =3D virCPUCheckTypeFromString(check); VIR_FREE(check); =20 @@ -338,7 +359,7 @@ virCPUDefParseXML(xmlNodePtr node, virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Invalid check attribute for CPU " "specification")); - goto error; + goto cleanup; } def->check =3D value; } @@ -349,13 +370,13 @@ virCPUDefParseXML(xmlNodePtr node, if (!arch) { virReportError(VIR_ERR_XML_ERROR, "%s", _("Missing CPU architecture")); - goto error; + goto cleanup; } if ((def->arch =3D virArchFromString(arch)) =3D=3D VIR_ARCH_NONE) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Unknown architecture %s"), arch); VIR_FREE(arch); - goto error; + goto cleanup; } VIR_FREE(arch); } @@ -364,7 +385,7 @@ virCPUDefParseXML(xmlNodePtr node, def->type =3D=3D VIR_CPU_TYPE_HOST) { virReportError(VIR_ERR_XML_ERROR, "%s", _("Missing CPU model name")); - goto error; + goto cleanup; } =20 if (def->type =3D=3D VIR_CPU_TYPE_GUEST && @@ -374,7 +395,7 @@ virCPUDefParseXML(xmlNodePtr node, if ((def->fallback =3D virCPUFallbackTypeFromString(fallback))= < 0) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Invalid fallback attribute")); - goto error; + goto cleanup; } } =20 @@ -384,14 +405,14 @@ virCPUDefParseXML(xmlNodePtr node, virReportError(VIR_ERR_XML_ERROR, _("vendor_id must be exactly %d characters = long"), VIR_CPU_VENDOR_ID_LENGTH); - goto error; + goto cleanup; } =20 /* ensure that the string can be passed to qemu*/ if (strchr(vendor_id, ',')) { virReportError(VIR_ERR_XML_ERROR, "%s", _("vendor id is invalid")); - goto error; + goto cleanup; } =20 def->vendor_id =3D vendor_id; @@ -403,61 +424,54 @@ virCPUDefParseXML(xmlNodePtr node, if (def->vendor && !def->model) { virReportError(VIR_ERR_XML_ERROR, "%s", _("CPU vendor specified without CPU model")); - goto error; + goto cleanup; } =20 if (virXPathNode("./topology[1]", ctxt)) { - int ret; unsigned long ul; =20 - ret =3D virXPathULong("string(./topology[1]/@sockets)", - ctxt, &ul); - if (ret < 0) { + if (virXPathULong("string(./topology[1]/@sockets)", ctxt, &ul) < 0= ) { virReportError(VIR_ERR_XML_ERROR, "%s", _("Missing 'sockets' attribute in CPU topology"= )); - goto error; + goto cleanup; } def->sockets =3D (unsigned int) ul; =20 - ret =3D virXPathULong("string(./topology[1]/@cores)", - ctxt, &ul); - if (ret < 0) { + if (virXPathULong("string(./topology[1]/@cores)", ctxt, &ul) < 0) { virReportError(VIR_ERR_XML_ERROR, "%s", _("Missing 'cores' attribute in CPU topology")); - goto error; + goto cleanup; } def->cores =3D (unsigned int) ul; =20 - ret =3D virXPathULong("string(./topology[1]/@threads)", - ctxt, &ul); - if (ret < 0) { + if (virXPathULong("string(./topology[1]/@threads)", ctxt, &ul) < 0= ) { virReportError(VIR_ERR_XML_ERROR, "%s", _("Missing 'threads' attribute in CPU topology"= )); - goto error; + goto cleanup; } def->threads =3D (unsigned int) ul; =20 if (!def->sockets || !def->cores || !def->threads) { virReportError(VIR_ERR_XML_ERROR, "%s", _("Invalid CPU topology")); - goto error; + goto cleanup; } } =20 if ((n =3D virXPathNodeSet("./feature", ctxt, &nodes)) < 0) - goto error; + goto cleanup; =20 if (n > 0) { if (!def->model && def->mode =3D=3D VIR_CPU_MODE_CUSTOM) { virReportError(VIR_ERR_XML_ERROR, "%s", _("Non-empty feature list specified without " "CPU model")); - goto error; + goto cleanup; } =20 if (VIR_RESIZE_N(def->features, def->nfeatures_max, def->nfeatures, n) < 0) - goto error; + goto cleanup; =20 def->nfeatures =3D n; } @@ -480,7 +494,7 @@ virCPUDefParseXML(xmlNodePtr node, if (policy < 0) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Invalid CPU feature policy")); - goto error; + goto cleanup; } } else { policy =3D -1; @@ -490,7 +504,7 @@ virCPUDefParseXML(xmlNodePtr node, VIR_FREE(name); virReportError(VIR_ERR_XML_ERROR, "%s", _("Invalid CPU feature name")); - goto error; + goto cleanup; } =20 for (j =3D 0; j < i; j++) { @@ -499,7 +513,7 @@ virCPUDefParseXML(xmlNodePtr node, _("CPU feature '%s' specified more than onc= e"), name); VIR_FREE(name); - goto error; + goto cleanup; } } =20 @@ -542,17 +556,16 @@ virCPUDefParseXML(xmlNodePtr node, def->cache->mode =3D mode; } =20 + VIR_STEAL_PTR(*cpu, def); + ret =3D 0; + cleanup: ctxt->node =3D oldnode; VIR_FREE(fallback); VIR_FREE(vendor_id); VIR_FREE(nodes); - return def; - - error: virCPUDefFree(def); - def =3D NULL; - goto cleanup; + return ret; } =20 =20 diff --git a/src/conf/cpu_conf.h b/src/conf/cpu_conf.h index b0d891552..b44974f47 100644 --- a/src/conf/cpu_conf.h +++ b/src/conf/cpu_conf.h @@ -182,10 +182,11 @@ virCPUDefCopy(const virCPUDef *cpu); virCPUDefPtr virCPUDefCopyWithoutModel(const virCPUDef *cpu); =20 -virCPUDefPtr -virCPUDefParseXML(xmlNodePtr node, - xmlXPathContextPtr ctxt, - virCPUType mode); +int +virCPUDefParseXML(xmlXPathContextPtr ctxt, + const char *xpath, + virCPUType mode, + virCPUDefPtr *cpu); =20 bool virCPUDefIsEqual(virCPUDefPtr src, diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 5f99dad9c..53c145f16 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -17444,16 +17444,8 @@ virDomainDefParseXML(xmlDocPtr xml, } VIR_FREE(nodes); =20 - /* analysis of cpu handling */ - if ((node =3D virXPathNode("./cpu[1]", ctxt)) !=3D NULL) { - xmlNodePtr oldnode =3D ctxt->node; - ctxt->node =3D node; - def->cpu =3D virCPUDefParseXML(node, ctxt, VIR_CPU_TYPE_GUEST); - ctxt->node =3D oldnode; - - if (def->cpu =3D=3D NULL) - goto error; - } + if (virCPUDefParseXML(ctxt, "./cpu[1]", VIR_CPU_TYPE_GUEST, &def->cpu)= < 0) + goto error; =20 if (virDomainNumaDefCPUParseXML(def->numa, ctxt) < 0) goto error; diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c index 702b14dbb..96160901e 100644 --- a/src/cpu/cpu.c +++ b/src/cpu/cpu.c @@ -130,7 +130,7 @@ virCPUCompareXML(virArch arch, if (!(doc =3D virXMLParseStringCtxt(xml, _("(CPU_definition)"), &ctxt)= )) goto cleanup; =20 - if (!(cpu =3D virCPUDefParseXML(ctxt->node, ctxt, VIR_CPU_TYPE_AUTO))) + if (virCPUDefParseXML(ctxt, NULL, VIR_CPU_TYPE_AUTO, &cpu) < 0) goto cleanup; =20 ret =3D virCPUCompare(arch, host, cpu, failIncompatible); @@ -562,8 +562,7 @@ cpuBaselineXML(const char **xmlCPUs, if (!(doc =3D virXMLParseStringCtxt(xmlCPUs[i], _("(CPU_definition= )"), &ctxt))) goto error; =20 - cpus[i] =3D virCPUDefParseXML(ctxt->node, ctxt, VIR_CPU_TYPE_HOST); - if (cpus[i] =3D=3D NULL) + if (virCPUDefParseXML(ctxt, NULL, VIR_CPU_TYPE_HOST, &cpus[i]) < 0) goto error; =20 xmlXPathFreeContext(ctxt); diff --git a/tests/cputest.c b/tests/cputest.c index d5e023c40..89c645e64 100644 --- a/tests/cputest.c +++ b/tests/cputest.c @@ -88,7 +88,7 @@ cpuTestLoadXML(virArch arch, const char *name) if (!(doc =3D virXMLParseFileCtxt(xml, &ctxt))) goto cleanup; =20 - cpu =3D virCPUDefParseXML(ctxt->node, ctxt, VIR_CPU_TYPE_AUTO); + virCPUDefParseXML(ctxt, NULL, VIR_CPU_TYPE_AUTO, &cpu); =20 cleanup: xmlXPathFreeContext(ctxt); @@ -126,8 +126,7 @@ cpuTestLoadMultiXML(virArch arch, =20 for (i =3D 0; i < n; i++) { ctxt->node =3D nodes[i]; - cpus[i] =3D virCPUDefParseXML(nodes[i], ctxt, VIR_CPU_TYPE_HOST); - if (!cpus[i]) + if (virCPUDefParseXML(ctxt, NULL, VIR_CPU_TYPE_HOST, &cpus[i]) < 0) goto cleanup_cpus; } =20 --=20 2.13.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Mon Apr 29 18:08:23 2024 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 1496824675433949.7558512906444; Wed, 7 Jun 2017 01:37:55 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 83B7C537B; Wed, 7 Jun 2017 08:37:53 +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 9B5535C54F; Wed, 7 Jun 2017 08:37:52 +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 A2853180BAFA; Wed, 7 Jun 2017 08:37:50 +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 v578bnEe004786 for ; Wed, 7 Jun 2017 04:37:49 -0400 Received: by smtp.corp.redhat.com (Postfix) id 9FC337D967; Wed, 7 Jun 2017 08:37:49 +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 7453D7D955 for ; Wed, 7 Jun 2017 08:37:47 +0000 (UTC) Received: by virval.usersys.redhat.com (Postfix, from userid 500) id 70D4610192E; Wed, 7 Jun 2017 10:37:46 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 83B7C537B Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx06.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 83B7C537B From: Jiri Denemark To: libvir-list@redhat.com Date: Wed, 7 Jun 2017 10:37:28 +0200 Message-Id: <8909d510289a4a54e9136009df29948c1cda6406.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.11 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v2 03/20] conf: Make virDomainSnapshotDefFormat easier to read 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.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Wed, 07 Jun 2017 08:37:54 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Jiri Denemark Reviewed-by: Pavel Hrdina --- Notes: Version 2: - no change src/conf/snapshot_conf.c | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/src/conf/snapshot_conf.c b/src/conf/snapshot_conf.c index b6cba5ac3..7daa9b22a 100644 --- a/src/conf/snapshot_conf.c +++ b/src/conf/snapshot_conf.c @@ -686,11 +686,13 @@ virDomainSnapshotDiskDefFormat(virBufferPtr buf, virBufferAddLit(buf, "\n"); } =20 -char *virDomainSnapshotDefFormat(const char *domain_uuid, - virDomainSnapshotDefPtr def, - virCapsPtr caps, - unsigned int flags, - int internal) + +char * +virDomainSnapshotDefFormat(const char *domain_uuid, + virDomainSnapshotDefPtr def, + virCapsPtr caps, + unsigned int flags, + int internal) { virBuffer buf =3D VIR_BUFFER_INITIALIZER; size_t i; @@ -702,12 +704,14 @@ char *virDomainSnapshotDefFormat(const char *domain_u= uid, =20 virBufferAddLit(&buf, "\n"); virBufferAdjustIndent(&buf, 2); + virBufferEscapeString(&buf, "%s\n", def->name); if (def->description) virBufferEscapeString(&buf, "%s\n", def->description); virBufferAsprintf(&buf, "%s\n", virDomainSnapshotStateTypeToString(def->state)); + if (def->parent) { virBufferAddLit(&buf, "\n"); virBufferAdjustIndent(&buf, 2); @@ -715,14 +719,17 @@ char *virDomainSnapshotDefFormat(const char *domain_u= uid, virBufferAdjustIndent(&buf, -2); virBufferAddLit(&buf, "\n"); } + virBufferAsprintf(&buf, "%lld\n", def->creationTime); + if (def->memory) { virBufferAsprintf(&buf, "memor= y)); virBufferEscapeString(&buf, " file=3D'%s'", def->file); virBufferAddLit(&buf, "/>\n"); } + if (def->ndisks) { virBufferAddLit(&buf, "\n"); virBufferAdjustIndent(&buf, 2); @@ -731,11 +738,10 @@ char *virDomainSnapshotDefFormat(const char *domain_u= uid, virBufferAdjustIndent(&buf, -2); virBufferAddLit(&buf, "\n"); } + if (def->dom) { - if (virDomainDefFormatInternal(def->dom, caps, flags, &buf) < 0) { - virBufferFreeAndReset(&buf); - return NULL; - } + if (virDomainDefFormatInternal(def->dom, caps, flags, &buf) < 0) + goto error; } else if (domain_uuid) { virBufferAddLit(&buf, "\n"); virBufferAdjustIndent(&buf, 2); @@ -743,8 +749,10 @@ char *virDomainSnapshotDefFormat(const char *domain_uu= id, virBufferAdjustIndent(&buf, -2); virBufferAddLit(&buf, "\n"); } + if (internal) virBufferAsprintf(&buf, "%d\n", def->current); + virBufferAdjustIndent(&buf, -2); virBufferAddLit(&buf, "\n"); =20 @@ -752,6 +760,10 @@ char *virDomainSnapshotDefFormat(const char *domain_uu= id, return NULL; =20 return virBufferContentAndReset(&buf); + + error: + virBufferFreeAndReset(&buf); + return NULL; } =20 /* Snapshot Obj functions */ --=20 2.13.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Mon Apr 29 18:08:23 2024 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 1496824695097129.13458030442985; Wed, 7 Jun 2017 01:38:15 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B27B4DC8EF; Wed, 7 Jun 2017 08:38:13 +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 8067C757D9; Wed, 7 Jun 2017 08:38:13 +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 347C94A48F; Wed, 7 Jun 2017 08:38:13 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v578bnge004795 for ; Wed, 7 Jun 2017 04:37:49 -0400 Received: by smtp.corp.redhat.com (Postfix) id DAE1917251; Wed, 7 Jun 2017 08:37:49 +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 88C105C54F for ; Wed, 7 Jun 2017 08:37:47 +0000 (UTC) Received: by virval.usersys.redhat.com (Postfix, from userid 500) id 72D6210192F; Wed, 7 Jun 2017 10:37:46 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com B27B4DC8EF Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx09.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 B27B4DC8EF From: Jiri Denemark To: libvir-list@redhat.com Date: Wed, 7 Jun 2017 10:37:29 +0200 Message-Id: <0497f58e99661bbaf70afd4a7041e936b80c9b62.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.16 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v2 04/20] conf: Pass xmlopt to virDomainSnapshotDefFormat 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.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Wed, 07 Jun 2017 08:38:14 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" This will be used later when a save cookie will become part of the snapshot XML using new driver specific parser/formatter functions. Signed-off-by: Jiri Denemark Reviewed-by: Pavel Hrdina --- Notes: I know the line in vbox_common.c is too long, but I don't really want to touch that horrible piece of code more than making it compile. =20 Version 2: - enhanced commit message src/conf/snapshot_conf.c | 1 + src/conf/snapshot_conf.h | 1 + src/esx/esx_driver.c | 2 +- src/qemu/qemu_domain.c | 4 +++- src/qemu/qemu_domain.h | 1 + src/qemu/qemu_driver.c | 16 ++++++++++++---- src/test/test_driver.c | 1 + src/vbox/vbox_common.c | 4 ++-- src/vz/vz_driver.c | 1 + tests/domainsnapshotxml2xmltest.c | 1 + 10 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/conf/snapshot_conf.c b/src/conf/snapshot_conf.c index 7daa9b22a..e3bba985d 100644 --- a/src/conf/snapshot_conf.c +++ b/src/conf/snapshot_conf.c @@ -691,6 +691,7 @@ char * virDomainSnapshotDefFormat(const char *domain_uuid, virDomainSnapshotDefPtr def, virCapsPtr caps, + virDomainXMLOptionPtr xmlopt ATTRIBUTE_UNUSED, unsigned int flags, int internal) { diff --git a/src/conf/snapshot_conf.h b/src/conf/snapshot_conf.h index da904f946..2ce526fa6 100644 --- a/src/conf/snapshot_conf.h +++ b/src/conf/snapshot_conf.h @@ -114,6 +114,7 @@ void virDomainSnapshotDefFree(virDomainSnapshotDefPtr d= ef); char *virDomainSnapshotDefFormat(const char *domain_uuid, virDomainSnapshotDefPtr def, virCapsPtr caps, + virDomainXMLOptionPtr xmlopt, unsigned int flags, int internal); int virDomainSnapshotAlignDisks(virDomainSnapshotDefPtr snapshot, diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c index 6333855c7..1f4f2c7a7 100644 --- a/src/esx/esx_driver.c +++ b/src/esx/esx_driver.c @@ -4265,7 +4265,7 @@ esxDomainSnapshotGetXMLDesc(virDomainSnapshotPtr snap= shot, =20 virUUIDFormat(snapshot->domain->uuid, uuid_string); =20 - xml =3D virDomainSnapshotDefFormat(uuid_string, &def, priv->caps, + xml =3D virDomainSnapshotDefFormat(uuid_string, &def, priv->caps, priv= ->xmlopt, virDomainDefFormatConvertXMLFlags(fla= gs), 0); =20 diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 698632489..814232164 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -4820,6 +4820,7 @@ int qemuDomainSnapshotWriteMetadata(virDomainObjPtr vm, virDomainSnapshotObjPtr snapshot, virCapsPtr caps, + virDomainXMLOptionPtr xmlopt, char *snapshotDir) { char *newxml =3D NULL; @@ -4830,7 +4831,7 @@ qemuDomainSnapshotWriteMetadata(virDomainObjPtr vm, =20 virUUIDFormat(vm->def->uuid, uuidstr); newxml =3D virDomainSnapshotDefFormat( - uuidstr, snapshot->def, caps, + uuidstr, snapshot->def, caps, xmlopt, virDomainDefFormatConvertXMLFlags(QEMU_DOMAIN_FORMAT_LIVE_FLAGS), 1); if (newxml =3D=3D NULL) @@ -4991,6 +4992,7 @@ qemuDomainSnapshotDiscard(virQEMUDriverPtr driver, } else { parentsnap->def->current =3D true; if (qemuDomainSnapshotWriteMetadata(vm, parentsnap, driver= ->caps, + driver->xmlopt, cfg->snapshotDir) < 0)= { VIR_WARN("failed to set parent snapshot '%s' as curren= t", snap->def->parent); diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index 829f7746e..d0e2e0628 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -555,6 +555,7 @@ const char *qemuFindQemuImgBinary(virQEMUDriverPtr driv= er); int qemuDomainSnapshotWriteMetadata(virDomainObjPtr vm, virDomainSnapshotObjPtr snapshot, virCapsPtr caps, + virDomainXMLOptionPtr xmlopt, char *snapshotDir); =20 int qemuDomainSnapshotForEachQcow2(virQEMUDriverPtr driver, diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index f0cdea659..f97d41030 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -14649,7 +14649,7 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, if (update_current) { vm->current_snapshot->def->current =3D false; if (qemuDomainSnapshotWriteMetadata(vm, vm->current_snapshot, - driver->caps, + driver->caps, driver->xmlo= pt, cfg->snapshotDir) < 0) goto endjob; vm->current_snapshot =3D NULL; @@ -14699,6 +14699,7 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, endjob: if (snapshot && !(flags & VIR_DOMAIN_SNAPSHOT_CREATE_NO_METADATA)) { if (qemuDomainSnapshotWriteMetadata(vm, snap, driver->caps, + driver->xmlopt, cfg->snapshotDir) < 0) { /* if writing of metadata fails, error out rather than trying * to silently carry on without completing the snapshot */ @@ -15036,7 +15037,8 @@ qemuDomainSnapshotGetXMLDesc(virDomainSnapshotPtr s= napshot, =20 virUUIDFormat(snapshot->domain->uuid, uuidstr); =20 - xml =3D virDomainSnapshotDefFormat(uuidstr, snap->def, driver->caps, + xml =3D virDomainSnapshotDefFormat(uuidstr, snap->def, + driver->caps, driver->xmlopt, virDomainDefFormatConvertXMLFlags(fla= gs), 0); =20 @@ -15218,7 +15220,8 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr sna= pshot, if (vm->current_snapshot) { vm->current_snapshot->def->current =3D false; if (qemuDomainSnapshotWriteMetadata(vm, vm->current_snapshot, - driver->caps, cfg->snapshotDir= ) < 0) + driver->caps, driver->xmlopt, + cfg->snapshotDir) < 0) goto endjob; vm->current_snapshot =3D NULL; /* XXX Should we restore vm->current_snapshot after this point @@ -15458,6 +15461,7 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr sna= pshot, cleanup: if (ret =3D=3D 0) { if (qemuDomainSnapshotWriteMetadata(vm, snap, driver->caps, + driver->xmlopt, cfg->snapshotDir) < 0) ret =3D -1; else @@ -15494,6 +15498,7 @@ struct _virQEMUSnapReparent { virDomainSnapshotObjPtr parent; virDomainObjPtr vm; virCapsPtr caps; + virDomainXMLOptionPtr xmlopt; int err; virDomainSnapshotObjPtr last; }; @@ -15522,7 +15527,8 @@ qemuDomainSnapshotReparentChildren(void *payload, if (!snap->sibling) rep->last =3D snap; =20 - rep->err =3D qemuDomainSnapshotWriteMetadata(rep->vm, snap, rep->caps, + rep->err =3D qemuDomainSnapshotWriteMetadata(rep->vm, snap, + rep->caps, rep->xmlopt, rep->cfg->snapshotDir); return 0; } @@ -15593,6 +15599,7 @@ qemuDomainSnapshotDelete(virDomainSnapshotPtr snaps= hot, if (flags & VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN_ONLY) { snap->def->current =3D true; if (qemuDomainSnapshotWriteMetadata(vm, snap, driver->caps, + driver->xmlopt, cfg->snapshotDir) < 0)= { virReportError(VIR_ERR_INTERNAL_ERROR, _("failed to set snapshot '%s' as curre= nt"), @@ -15610,6 +15617,7 @@ qemuDomainSnapshotDelete(virDomainSnapshotPtr snaps= hot, rep.err =3D 0; rep.last =3D NULL; rep.caps =3D driver->caps; + rep.xmlopt =3D driver->xmlopt; virDomainSnapshotForEachChild(snap, qemuDomainSnapshotReparentChildren, &rep); diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 338b7d35d..8cecc6add 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -6235,6 +6235,7 @@ testDomainSnapshotGetXMLDesc(virDomainSnapshotPtr sna= pshot, virUUIDFormat(snapshot->domain->uuid, uuidstr); =20 xml =3D virDomainSnapshotDefFormat(uuidstr, snap->def, privconn->caps, + privconn->xmlopt, virDomainDefFormatConvertXMLFlags(fla= gs), 0); =20 diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c index c66939e01..1a90d00aa 100644 --- a/src/vbox/vbox_common.c +++ b/src/vbox/vbox_common.c @@ -5105,7 +5105,7 @@ vboxSnapshotRedefine(virDomainPtr dom, VIR_FREE(currentSnapshotXmlFilePath); if (virAsprintf(¤tSnapshotXmlFilePath, "%s%s.xml", machineLo= cationPath, snapshotMachineDesc->currentSnapshot) < 0) goto cleanup; - char *snapshotContent =3D virDomainSnapshotDefFormat(NULL, def, da= ta->caps, VIR_DOMAIN_DEF_FORMAT_SECURE, 0); + char *snapshotContent =3D virDomainSnapshotDefFormat(NULL, def, da= ta->caps, data->xmlopt, VIR_DOMAIN_DEF_FORMAT_SECURE, 0); if (snapshotContent =3D=3D NULL) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Unable to get snapshot content")); @@ -6027,7 +6027,7 @@ static char *vboxDomainSnapshotGetXMLDesc(virDomainSn= apshotPtr snapshot, =20 virUUIDFormat(dom->uuid, uuidstr); memcpy(def->dom->uuid, dom->uuid, VIR_UUID_BUFLEN); - ret =3D virDomainSnapshotDefFormat(uuidstr, def, data->caps, + ret =3D virDomainSnapshotDefFormat(uuidstr, def, data->caps, data->xml= opt, virDomainDefFormatConvertXMLFlags(fl= ags), 0); =20 diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index 2c021884f..e6bb20182 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -2303,6 +2303,7 @@ vzDomainSnapshotGetXMLDesc(virDomainSnapshotPtr snaps= hot, unsigned int flags) virUUIDFormat(snapshot->domain->uuid, uuidstr); =20 xml =3D virDomainSnapshotDefFormat(uuidstr, snap->def, privconn->drive= r->caps, + privconn->driver->xmlopt, virDomainDefFormatConvertXMLFlags(fla= gs), 0); =20 diff --git a/tests/domainsnapshotxml2xmltest.c b/tests/domainsnapshotxml2xm= ltest.c index bb4d60f7d..3a6f86b4a 100644 --- a/tests/domainsnapshotxml2xmltest.c +++ b/tests/domainsnapshotxml2xmltest.c @@ -101,6 +101,7 @@ testCompareXMLToXMLFiles(const char *inxml, goto cleanup; =20 if (!(actual =3D virDomainSnapshotDefFormat(uuid, def, driver.caps, + driver.xmlopt, VIR_DOMAIN_DEF_FORMAT_SECURE, internal))) goto cleanup; --=20 2.13.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Mon Apr 29 18:08:23 2024 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 1496824697106830.7568116235567; Wed, 7 Jun 2017 01:38:17 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D4B868047B; Wed, 7 Jun 2017 08:38:15 +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 97D987C76C; Wed, 7 Jun 2017 08:38:15 +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 565EF4A492; Wed, 7 Jun 2017 08:38:15 +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 v578bpd7004809 for ; Wed, 7 Jun 2017 04:37:51 -0400 Received: by smtp.corp.redhat.com (Postfix) id 0F67E757D9; 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 D8AD5757CD for ; Wed, 7 Jun 2017 08:37:50 +0000 (UTC) Received: by virval.usersys.redhat.com (Postfix, from userid 500) id 74E0E101930; Wed, 7 Jun 2017 10:37:46 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com D4B868047B Authentication-Results: ext-mx04.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx04.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 D4B868047B From: Jiri Denemark To: libvir-list@redhat.com Date: Wed, 7 Jun 2017 10:37:30 +0200 Message-Id: <4ed948dfe107535e7fd7a1ec9475592a719acdf0.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 05/20] qemu: Rename xml_len in virQEMUSaveHeader as data_len 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.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Wed, 07 Jun 2017 08:38:16 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Since virQEMUSaveHeader will be followed by more than just domain XML, the old name would be confusing as it was designed to describe the length of all data following the save image header. Signed-off-by: Jiri Denemark Reviewed-by: Pavel Hrdina --- Notes: Version 2: - enhanced commit message src/qemu/qemu_driver.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index f97d41030..b0d67adc1 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -2805,7 +2805,7 @@ typedef virQEMUSaveHeader *virQEMUSaveHeaderPtr; struct _virQEMUSaveHeader { char magic[sizeof(QEMU_SAVE_MAGIC)-1]; uint32_t version; - uint32_t xml_len; + uint32_t data_len; uint32_t was_running; uint32_t compressed; uint32_t unused[15]; @@ -2815,7 +2815,7 @@ static inline void bswap_header(virQEMUSaveHeaderPtr hdr) { hdr->version =3D bswap_32(hdr->version); - hdr->xml_len =3D bswap_32(hdr->xml_len); + hdr->data_len =3D bswap_32(hdr->data_len); hdr->was_running =3D bswap_32(hdr->was_running); hdr->compressed =3D bswap_32(hdr->compressed); } @@ -2836,7 +2836,7 @@ qemuDomainSaveHeader(int fd, const char *path, const = char *xml, goto endjob; } =20 - if (safewrite(fd, xml, header->xml_len) !=3D header->xml_len) { + if (safewrite(fd, xml, header->data_len) !=3D header->data_len) { ret =3D -errno; virReportError(VIR_ERR_OPERATION_FAILED, _("failed to write xml to '%s'"), path); @@ -3082,7 +3082,7 @@ qemuDomainSaveMemory(virQEMUDriverPtr driver, header.version =3D QEMU_SAVE_VERSION; header.was_running =3D was_running ? 1 : 0; header.compressed =3D compressed; - header.xml_len =3D strlen(domXML) + 1; + header.data_len =3D strlen(domXML) + 1; =20 /* Obtain the file handle. */ if ((flags & VIR_DOMAIN_SAVE_BYPASS_CACHE)) { @@ -6276,16 +6276,16 @@ qemuDomainSaveImageOpen(virQEMUDriverPtr driver, goto error; } =20 - if (header.xml_len <=3D 0) { + if (header.data_len <=3D 0) { virReportError(VIR_ERR_OPERATION_FAILED, - _("invalid XML length: %d"), header.xml_len); + _("invalid XML length: %d"), header.data_len); goto error; } =20 - if (VIR_ALLOC_N(xml, header.xml_len) < 0) + if (VIR_ALLOC_N(xml, header.data_len) < 0) goto error; =20 - if (saferead(fd, xml, header.xml_len) !=3D header.xml_len) { + if (saferead(fd, xml, header.data_len) !=3D header.data_len) { virReportError(VIR_ERR_OPERATION_FAILED, "%s", _("failed to read XML")); goto error; @@ -6629,12 +6629,12 @@ qemuDomainSaveImageDefineXML(virConnectPtr conn, co= nst char *path, goto cleanup; len =3D strlen(xml) + 1; =20 - if (len > header.xml_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.xml_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) { --=20 2.13.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Mon Apr 29 18:08:23 2024 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 149682467595972.50654248337344; Wed, 7 Jun 2017 01:37:55 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 1D1E813AA1; Wed, 7 Jun 2017 08:37:54 +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 E06DB82793; Wed, 7 Jun 2017 08:37:53 +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 9EAD84BB7F; Wed, 7 Jun 2017 08:37:53 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v578bpjH004810 for ; Wed, 7 Jun 2017 04:37:51 -0400 Received: by smtp.corp.redhat.com (Postfix) id 146681724E; 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 DC2A21725D for ; Wed, 7 Jun 2017 08:37:50 +0000 (UTC) Received: by virval.usersys.redhat.com (Postfix, from userid 500) id 76F8A101931; Wed, 7 Jun 2017 10:37:46 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 1D1E813AA1 Authentication-Results: ext-mx05.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx05.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 1D1E813AA1 From: Jiri Denemark To: libvir-list@redhat.com Date: Wed, 7 Jun 2017 10:37:31 +0200 Message-Id: <0ea269e45c3e898a50f199993f3ee731d9d4e5d6.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.16 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v2 06/20] qemu: Fix memory leaks in qemuDomainSaveImageOpen 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.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Wed, 07 Jun 2017 08:37:54 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Jiri Denemark --- Notes: Version 2: - new patch, separated from the original 06/15 src/qemu/qemu_driver.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index b0d67adc1..9d0feb268 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -6235,12 +6235,13 @@ qemuDomainSaveImageOpen(virQEMUDriverPtr driver, virReportSystemError(errno, _("cannot remove corrupt file: %s"), path); - goto error; + } else { + fd =3D -3; } - return -3; + } else { + virReportError(VIR_ERR_OPERATION_FAILED, + "%s", _("failed to read qemu header")); } - virReportError(VIR_ERR_OPERATION_FAILED, - "%s", _("failed to read qemu header")); goto error; } =20 @@ -6255,9 +6256,10 @@ qemuDomainSaveImageOpen(virQEMUDriverPtr driver, virReportSystemError(errno, _("cannot remove corrupt file: %s= "), path); - goto error; + } else { + fd =3D -3; } - return -3; + goto error; } } virReportError(VIR_ERR_OPERATION_FAILED, "%s", msg); --=20 2.13.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Mon Apr 29 18:08:23 2024 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 From nobody Mon Apr 29 18:08:23 2024 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 1496824732130509.9611735855908; Wed, 7 Jun 2017 01:38:52 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id BD74D4DB15; Wed, 7 Jun 2017 08:38:49 +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 9242E5C54F; Wed, 7 Jun 2017 08:38:49 +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 C825318523C4; Wed, 7 Jun 2017 08:38:25 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v578brxX004867 for ; Wed, 7 Jun 2017 04:37:53 -0400 Received: by smtp.corp.redhat.com (Postfix) id 0F65582788; Wed, 7 Jun 2017 08:37:53 +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 D7A6882793 for ; Wed, 7 Jun 2017 08:37:51 +0000 (UTC) Received: by virval.usersys.redhat.com (Postfix, from userid 500) id 7AF66101933; Wed, 7 Jun 2017 10:37:46 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com BD74D4DB15 Authentication-Results: ext-mx05.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx05.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 BD74D4DB15 From: Jiri Denemark To: libvir-list@redhat.com Date: Wed, 7 Jun 2017 10:37:33 +0200 Message-Id: <46e323ed3fbbb350dd551d9546a5843cb1c128d4.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.12 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v2 08/20] qemu: Introduce virQEMUSaveDataFinish 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.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Wed, 07 Jun 2017 08:38:50 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" The function is supposed to update the save image header after a successful migration to the save image file. Signed-off-by: Jiri Denemark --- Notes: Version 2: - new patch (separated from the original 06/15) src/qemu/qemu_driver.c | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index be6bedd6a..b51a41641 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -2877,6 +2877,25 @@ qemuDomainSaveHeader(int fd, const char *path, const= char *xml, } =20 =20 +static int +virQEMUSaveDataFinish(virQEMUSaveHeaderPtr header, + int *fd, + const char *path) +{ + memcpy(header->magic, QEMU_SAVE_MAGIC, sizeof(header->magic)); + + if (safewrite(*fd, header, sizeof(*header)) !=3D sizeof(*header) || + VIR_CLOSE(*fd) < 0) { + virReportSystemError(errno, + _("failed to write header to domain save file= '%s'"), + path); + return -1; + } + + return 0; +} + + static virCommandPtr qemuCompressGetCommand(virQEMUSaveFormat compression) { @@ -3149,21 +3168,10 @@ qemuDomainSaveMemory(virQEMUDriverPtr driver, if (virFileWrapperFdClose(wrapperFd) < 0) goto cleanup; =20 - if ((fd =3D qemuOpenFile(driver, vm, path, O_WRONLY, NULL, NULL)) < 0) + if ((fd =3D qemuOpenFile(driver, vm, path, O_WRONLY, NULL, NULL)) < 0 = || + virQEMUSaveDataFinish(header, &fd, path) < 0) goto cleanup; =20 - memcpy(header->magic, QEMU_SAVE_MAGIC, sizeof(header->magic)); - - if (safewrite(fd, &header, sizeof(header)) !=3D sizeof(header)) { - virReportSystemError(errno, _("unable to write %s"), path); - goto cleanup; - } - - if (VIR_CLOSE(fd) < 0) { - virReportSystemError(errno, _("unable to close %s"), path); - goto cleanup; - } - ret =3D 0; =20 cleanup: --=20 2.13.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Mon Apr 29 18:08:23 2024 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 1496824773060832.5198712414827; Wed, 7 Jun 2017 01:39:33 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6E55BC0587DD; Wed, 7 Jun 2017 08:39:30 +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 31DDF18210; Wed, 7 Jun 2017 08:39:30 +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 9A1F81869FF4; Wed, 7 Jun 2017 08:38:36 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v578brVF004885 for ; Wed, 7 Jun 2017 04:37:53 -0400 Received: by smtp.corp.redhat.com (Postfix) id 5530D1837A; Wed, 7 Jun 2017 08:37:53 +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 04A7F183E1 for ; Wed, 7 Jun 2017 08:37:51 +0000 (UTC) Received: by virval.usersys.redhat.com (Postfix, from userid 500) id 7CEEB101934; Wed, 7 Jun 2017 10:37:46 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 6E55BC0587DD 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 6E55BC0587DD From: Jiri Denemark To: libvir-list@redhat.com Date: Wed, 7 Jun 2017 10:37:34 +0200 Message-Id: <833dfe9c3e1822a876382f0b4454008b3b8b638a.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.15 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v2 09/20] qemu: Refactor qemuDomainSaveHeader 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.16 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:39:31 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" The function is now called virQEMUSaveDataWrite and it is now doing everything it needs to save both the save image header and domain XML to a file. Be it a new file or an existing file in which a user wants to change the domain XML. Signed-off-by: Jiri Denemark --- Notes: Version 2: - new patch (separated from the original 06/15) - VIR_EXPAND_N is no longer used to pad domain XML with zeros src/qemu/qemu_driver.c | 98 ++++++++++++++++++++++++++++++----------------= ---- 1 file changed, 60 insertions(+), 38 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index b51a41641..5f5215b3d 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -2832,7 +2832,7 @@ virQEMUSaveDataFree(virQEMUSaveHeaderPtr header) =20 =20 static virQEMUSaveHeaderPtr -virQEMUSaveDataNew(char *domXML, +virQEMUSaveDataNew(char *domXML ATTRIBUTE_UNUSED, bool running, int compressed) { @@ -2845,34 +2845,66 @@ virQEMUSaveDataNew(char *domXML, header->version =3D QEMU_SAVE_VERSION; header->was_running =3D running ? 1 : 0; header->compressed =3D compressed; - header->data_len =3D strlen(domXML) + 1; =20 return header; } =20 =20 -/* return -errno on failure, or 0 on success */ +/* virQEMUSaveDataWrite: + * + * Writes libvirt's header (including domain XML) into a saved image of a + * running domain. If @header has data_len filled in (because it was previ= ously + * read from the file), the function will make sure the new data will fit + * within data_len. + * + * Returns -1 on failure, or 0 on success. + */ static int -qemuDomainSaveHeader(int fd, const char *path, const char *xml, - virQEMUSaveHeaderPtr header) +virQEMUSaveDataWrite(virQEMUSaveHeaderPtr header, + const char *xml, + int fd, + const char *path) { - int ret =3D 0; + size_t len; + int ret =3D -1; + size_t zerosLen =3D 0; + char *zeros =3D NULL; + + len =3D strlen(xml) + 1; + + if (header->data_len > 0) { + if (len > header->data_len) { + virReportError(VIR_ERR_OPERATION_FAILED, "%s", + _("new xml too large to fit in file")); + goto cleanup; + } + + zerosLen =3D header->data_len - len; + if (VIR_ALLOC_N(zeros, zerosLen) < 0) + goto cleanup; + } else { + header->data_len =3D len; + } =20 if (safewrite(fd, header, sizeof(*header)) !=3D sizeof(*header)) { - ret =3D -errno; - virReportError(VIR_ERR_OPERATION_FAILED, - _("failed to write header to domain save file '%s'"= ), - path); - goto endjob; + virReportSystemError(errno, + _("failed to write header to domain save file= '%s'"), + path); + goto cleanup; } =20 - if (safewrite(fd, xml, header->data_len) !=3D header->data_len) { - ret =3D -errno; - virReportError(VIR_ERR_OPERATION_FAILED, - _("failed to write xml to '%s'"), path); - goto endjob; + if (safewrite(fd, xml, header->data_len) !=3D header->data_len || + safewrite(fd, zeros, zerosLen) !=3D zerosLen) { + virReportSystemError(errno, + _("failed to write domain xml to '%s'"), + path); + goto cleanup; } - endjob: + + ret =3D 0; + + cleanup: + VIR_FREE(zeros); return ret; } =20 @@ -3146,8 +3178,7 @@ qemuDomainSaveMemory(virQEMUDriverPtr driver, if (!(wrapperFd =3D virFileWrapperFdNew(&fd, path, wrapperFlags))) goto cleanup; =20 - /* Write header to file, followed by XML */ - if (qemuDomainSaveHeader(fd, path, domXML, header) < 0) + if (virQEMUSaveDataWrite(header, domXML, fd, path) < 0) goto cleanup; =20 /* Perform the migration */ @@ -6626,7 +6657,6 @@ qemuDomainSaveImageDefineXML(virConnectPtr conn, cons= t char *path, virDomainDefPtr newdef =3D NULL; int fd =3D -1; char *xml =3D NULL; - size_t len; virQEMUSaveHeaderPtr header =3D NULL; int state =3D -1; =20 @@ -6662,30 +6692,22 @@ qemuDomainSaveImageDefineXML(virConnectPtr conn, co= nst char *path, =20 VIR_FREE(xml); =20 - xml =3D qemuDomainDefFormatXML(driver, newdef, - VIR_DOMAIN_XML_INACTIVE | - VIR_DOMAIN_XML_SECURE | - VIR_DOMAIN_XML_MIGRATABLE); - if (!xml) - goto cleanup; - len =3D strlen(xml) + 1; - - 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 (!(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) { virReportSystemError(errno, _("cannot seek in '%s'"), path); goto cleanup; } - if (safewrite(fd, &header, sizeof(header)) !=3D sizeof(header) || - safewrite(fd, xml, len) !=3D len || - VIR_CLOSE(fd) < 0) { - virReportSystemError(errno, _("failed to write xml to '%s'"), path= ); + + if (virQEMUSaveDataWrite(header, xml, fd, path) < 0) + goto cleanup; + + if (VIR_CLOSE(fd) < 0) { + virReportSystemError(errno, _("failed to write header data to '%s'= "), path); goto cleanup; } =20 --=20 2.13.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Mon Apr 29 18:08:23 2024 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 From nobody Mon Apr 29 18:08:23 2024 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 1496824702109307.11330326859684; Wed, 7 Jun 2017 01:38:22 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6D3F580F96; 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 4A1997E64F; Wed, 7 Jun 2017 08:38:19 +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 08EF94A494; Wed, 7 Jun 2017 08:38:19 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v578brc9004884 for ; Wed, 7 Jun 2017 04:37:53 -0400 Received: by smtp.corp.redhat.com (Postfix) id 54DD018364; Wed, 7 Jun 2017 08:37:53 +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 046C6183DB for ; Wed, 7 Jun 2017 08:37:51 +0000 (UTC) Received: by virval.usersys.redhat.com (Postfix, from userid 500) id 80C72101936; Wed, 7 Jun 2017 10:37:46 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 6D3F580F96 Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx03.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 6D3F580F96 From: Jiri Denemark To: libvir-list@redhat.com Date: Wed, 7 Jun 2017 10:37:36 +0200 Message-Id: <42b7ba431aba608d37278d88d957097573a19223.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.15 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v2 11/20] conf: Introduce virSaveCookie 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.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Wed, 07 Jun 2017 08:38:20 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" The code will be used by snapshots and domain save/restore code to store additional data for a saved running domain. It is analogous to migration cookies, but simple and one way only. Signed-off-by: Jiri Denemark Reviewed-by: Pavel Hrdina --- Notes: Version 2: - no change po/POTFILES.in | 1 + src/Makefile.am | 1 + src/conf/virsavecookie.c | 144 +++++++++++++++++++++++++++++++++++++++++++= ++++ src/conf/virsavecookie.h | 62 ++++++++++++++++++++ src/libvirt_private.syms | 7 +++ 5 files changed, 215 insertions(+) create mode 100644 src/conf/virsavecookie.c create mode 100644 src/conf/virsavecookie.h diff --git a/po/POTFILES.in b/po/POTFILES.in index 923d64727..275df1f29 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -47,6 +47,7 @@ src/conf/virdomainobjlist.c src/conf/virnetworkobj.c src/conf/virnodedeviceobj.c src/conf/virnwfilterobj.c +src/conf/virsavecookie.c src/conf/virsecretobj.c src/conf/virstorageobj.c src/cpu/cpu.c diff --git a/src/Makefile.am b/src/Makefile.am index 0b7cfc89a..eae32dc58 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -402,6 +402,7 @@ DOMAIN_CONF_SOURCES =3D \ conf/domain_conf.c conf/domain_conf.h \ conf/domain_audit.c conf/domain_audit.h \ conf/domain_nwfilter.c conf/domain_nwfilter.h \ + conf/virsavecookie.c conf/virsavecookie.h \ conf/snapshot_conf.c conf/snapshot_conf.h \ conf/numa_conf.c conf/numa_conf.h \ conf/virdomainobjlist.c conf/virdomainobjlist.h diff --git a/src/conf/virsavecookie.c b/src/conf/virsavecookie.c new file mode 100644 index 000000000..502c04d0f --- /dev/null +++ b/src/conf/virsavecookie.c @@ -0,0 +1,144 @@ +/** + * virsavecookie.c: Save cookie handling + * + * Copyright (C) 2017 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * . + */ + +#include + +#include "virerror.h" +#include "virlog.h" +#include "virobject.h" +#include "virbuffer.h" +#include "virxml.h" +#include "virsavecookie.h" + +#define VIR_FROM_THIS VIR_FROM_CONF + +VIR_LOG_INIT("conf.savecookie"); + + +static int +virSaveCookieParseNode(xmlXPathContextPtr ctxt, + virObjectPtr *obj, + virSaveCookieCallbacksPtr saveCookie) +{ + *obj =3D NULL; + + if (!xmlStrEqual(ctxt->node->name, BAD_CAST "cookie")) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("XML does not contain expected 'cookie' element")= ); + return -1; + } + + if (!saveCookie || !saveCookie->parse) + return 0; + + return saveCookie->parse(ctxt, obj); +} + + +int +virSaveCookieParse(xmlXPathContextPtr ctxt, + virObjectPtr *obj, + virSaveCookieCallbacksPtr saveCookie) +{ + xmlNodePtr node =3D ctxt->node; + int ret =3D -1; + + *obj =3D NULL; + + if (!(ctxt->node =3D virXPathNode("./cookie", ctxt))) { + ret =3D 0; + goto cleanup; + } + + ret =3D virSaveCookieParseNode(ctxt, obj, saveCookie); + + cleanup: + ctxt->node =3D node; + return ret; +} + + +int +virSaveCookieParseString(const char *xml, + virObjectPtr *obj, + virSaveCookieCallbacksPtr saveCookie) +{ + xmlDocPtr doc =3D NULL; + xmlXPathContextPtr ctxt =3D NULL; + int ret =3D -1; + + *obj =3D NULL; + + if (!xml) { + ret =3D 0; + goto cleanup; + } + + if (!(doc =3D virXMLParseStringCtxt(xml, _("(save cookie)"), &ctxt))) + goto cleanup; + + ret =3D virSaveCookieParseNode(ctxt, obj, saveCookie); + + cleanup: + xmlXPathFreeContext(ctxt); + xmlFreeDoc(doc); + return ret; +} + + +int +virSaveCookieFormatBuf(virBufferPtr buf, + virObjectPtr obj, + virSaveCookieCallbacksPtr saveCookie) +{ + if (!obj || !saveCookie || !saveCookie->format) + return 0; + + virBufferAddLit(buf, "\n"); + virBufferAdjustIndent(buf, 2); + + if (saveCookie->format(buf, obj) < 0) + return -1; + + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "\n"); + + return 0; +} + + +char * +virSaveCookieFormat(virObjectPtr obj, + virSaveCookieCallbacksPtr saveCookie) +{ + virBuffer buf =3D VIR_BUFFER_INITIALIZER; + + if (virSaveCookieFormatBuf(&buf, obj, saveCookie) < 0) + goto error; + + if (virBufferCheckError(&buf) < 0) + goto error; + + return virBufferContentAndReset(&buf); + + error: + virBufferFreeAndReset(&buf); + return NULL; +} diff --git a/src/conf/virsavecookie.h b/src/conf/virsavecookie.h new file mode 100644 index 000000000..4aed18466 --- /dev/null +++ b/src/conf/virsavecookie.h @@ -0,0 +1,62 @@ +/** + * virsavecookie.h: Save cookie handling + * + * Copyright (C) 2017 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * . + */ +#ifndef __VIR_SAVE_COOKIE_H__ +# define __VIR_SAVE_COOKIE_H__ + +# include + +# include "internal.h" +# include "virobject.h" +# include "virbuffer.h" + + +typedef int (*virSaveCookieParseFunc)(xmlXPathContextPtr ctxt, + virObjectPtr *obj); +typedef int (*virSaveCookieFormatFunc)(virBufferPtr buf, + virObjectPtr obj); + +typedef struct _virSaveCookieCallbacks virSaveCookieCallbacks; +typedef virSaveCookieCallbacks *virSaveCookieCallbacksPtr; +struct _virSaveCookieCallbacks { + virSaveCookieParseFunc parse; + virSaveCookieFormatFunc format; +}; + + +int +virSaveCookieParse(xmlXPathContextPtr ctxt, + virObjectPtr *obj, + virSaveCookieCallbacksPtr saveCookie); + +int +virSaveCookieParseString(const char *xml, + virObjectPtr *obj, + virSaveCookieCallbacksPtr saveCookie); + +int +virSaveCookieFormatBuf(virBufferPtr buf, + virObjectPtr obj, + virSaveCookieCallbacksPtr saveCookie); + +char * +virSaveCookieFormat(virObjectPtr obj, + virSaveCookieCallbacksPtr saveCookie); + +#endif /*__VIR_SAVE_COOKIE_H__ */ diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index bde01a3fa..ba4cecee1 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -990,6 +990,13 @@ virNWFilterObjUnlock; virNWFilterObjWantRemoved; =20 =20 +# conf/virsavecookie.h +virSaveCookieFormat; +virSaveCookieFormatBuf; +virSaveCookieParse; +virSaveCookieParseString; + + # conf/virsecretobj.h virSecretLoadAllConfigs; virSecretObjDeleteConfig; --=20 2.13.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Mon Apr 29 18:08:23 2024 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 14968247298722.626112167073984; Wed, 7 Jun 2017 01:38:49 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 60E1C734; Wed, 7 Jun 2017 08:38:47 +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 307FB7A507; Wed, 7 Jun 2017 08:38:47 +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 682554A499; Wed, 7 Jun 2017 08:38:22 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v578brRt004889 for ; Wed, 7 Jun 2017 04:37:53 -0400 Received: by smtp.corp.redhat.com (Postfix) id 5CA728278A; Wed, 7 Jun 2017 08:37:53 +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 D766882791 for ; Wed, 7 Jun 2017 08:37:51 +0000 (UTC) Received: by virval.usersys.redhat.com (Postfix, from userid 500) id 82C5F101937; Wed, 7 Jun 2017 10:37:46 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 60E1C734 Authentication-Results: ext-mx05.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx05.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 60E1C734 From: Jiri Denemark To: libvir-list@redhat.com Date: Wed, 7 Jun 2017 10:37:37 +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.12 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v2 12/20] conf: Add save cookie callbacks to xmlopt 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.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Wed, 07 Jun 2017 08:38:48 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" virDomainXMLOption gains driver specific callbacks for parsing and formatting save cookies. Signed-off-by: Jiri Denemark Reviewed-by: Pavel Hrdina --- Notes: Version 2: - no change src/bhyve/bhyve_domain.c | 2 +- src/conf/domain_conf.c | 16 +++++++++++++++- src/conf/domain_conf.h | 7 ++++++- src/conf/snapshot_conf.c | 11 ++++++++++- src/conf/snapshot_conf.h | 2 ++ src/libvirt_private.syms | 1 + src/libxl/libxl_conf.c | 2 +- src/lxc/lxc_conf.c | 2 +- src/openvz/openvz_driver.c | 2 +- src/phyp/phyp_driver.c | 2 +- src/qemu/qemu_capabilities.c | 2 +- src/qemu/qemu_conf.c | 3 ++- src/security/virt-aa-helper.c | 2 +- src/test/test_driver.c | 2 +- src/uml/uml_driver.c | 2 +- src/vbox/vbox_common.c | 2 +- src/vmware/vmware_driver.c | 3 ++- src/vmx/vmx.c | 2 +- src/vz/vz_driver.c | 2 +- src/xen/xen_driver.c | 2 +- src/xenapi/xenapi_driver.c | 2 +- tests/bhyveargv2xmltest.c | 2 +- tests/testutils.c | 2 +- 23 files changed, 54 insertions(+), 21 deletions(-) diff --git a/src/bhyve/bhyve_domain.c b/src/bhyve/bhyve_domain.c index 0a99550af..20c82937b 100644 --- a/src/bhyve/bhyve_domain.c +++ b/src/bhyve/bhyve_domain.c @@ -144,7 +144,7 @@ virBhyveDriverCreateXMLConf(bhyveConnPtr driver) virBhyveDriverDomainDefParserConfig.priv =3D driver; return virDomainXMLOptionNew(&virBhyveDriverDomainDefParserConfig, &virBhyveDriverPrivateDataCallbacks, - NULL, NULL); + NULL, NULL, NULL); } =20 virDomainDefParserConfig virBhyveDriverDomainDefParserConfig =3D { diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 53c145f16..2e2e7334a 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -79,6 +79,9 @@ struct _virDomainXMLOption { =20 /* ABI stability callbacks */ virDomainABIStability abi; + + /* Private data for save image stored in snapshot XML */ + virSaveCookieCallbacks saveCookie; }; =20 #define VIR_DOMAIN_DEF_FORMAT_COMMON_FLAGS \ @@ -1054,7 +1057,8 @@ virDomainXMLOptionPtr virDomainXMLOptionNew(virDomainDefParserConfigPtr config, virDomainXMLPrivateDataCallbacksPtr priv, virDomainXMLNamespacePtr xmlns, - virDomainABIStabilityPtr abi) + virDomainABIStabilityPtr abi, + virSaveCookieCallbacksPtr saveCookie) { virDomainXMLOptionPtr xmlopt; =20 @@ -1076,6 +1080,9 @@ virDomainXMLOptionNew(virDomainDefParserConfigPtr con= fig, if (abi) xmlopt->abi =3D *abi; =20 + if (saveCookie) + xmlopt->saveCookie =3D *saveCookie; + /* Technically this forbids to use one of Xerox's MAC address prefixes= in * our hypervisor drivers. This shouldn't ever be a problem. * @@ -1106,6 +1113,13 @@ virDomainXMLOptionGetNamespace(virDomainXMLOptionPtr= xmlopt) } =20 =20 +virSaveCookieCallbacksPtr +virDomainXMLOptionGetSaveCookie(virDomainXMLOptionPtr xmlopt) +{ + return &xmlopt->saveCookie; +} + + void virBlkioDeviceArrayClear(virBlkioDevicePtr devices, int ndevices) diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 446b117b7..1231aeac6 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -55,6 +55,7 @@ # include "virgic.h" # include "virperf.h" # include "virtypedparam.h" +# include "virsavecookie.h" =20 /* forward declarations of all device types, required by * virDomainDeviceDef @@ -2549,7 +2550,11 @@ struct _virDomainABIStability { virDomainXMLOptionPtr virDomainXMLOptionNew(virDomainDefParserConfigPtr co= nfig, virDomainXMLPrivateDataCallbac= ksPtr priv, virDomainXMLNamespacePtr xmlns, - virDomainABIStabilityPtr abi); + virDomainABIStabilityPtr abi, + virSaveCookieCallbacksPtr save= Cookie); + +virSaveCookieCallbacksPtr +virDomainXMLOptionGetSaveCookie(virDomainXMLOptionPtr xmlopt); =20 void virDomainNetGenerateMAC(virDomainXMLOptionPtr xmlopt, virMacAddrPtr m= ac); =20 diff --git a/src/conf/snapshot_conf.c b/src/conf/snapshot_conf.c index e3bba985d..6330f7d1f 100644 --- a/src/conf/snapshot_conf.c +++ b/src/conf/snapshot_conf.c @@ -102,6 +102,7 @@ void virDomainSnapshotDefFree(virDomainSnapshotDefPtr d= ef) virDomainSnapshotDiskDefClear(&def->disks[i]); VIR_FREE(def->disks); virDomainDefFree(def->dom); + virObjectUnref(def->cookie); VIR_FREE(def); } =20 @@ -214,6 +215,7 @@ virDomainSnapshotDefParse(xmlXPathContextPtr ctxt, char *memorySnapshot =3D NULL; char *memoryFile =3D NULL; bool offline =3D !!(flags & VIR_DOMAIN_SNAPSHOT_PARSE_OFFLINE); + virSaveCookieCallbacksPtr saveCookie =3D virDomainXMLOptionGetSaveCook= ie(xmlopt); =20 if (VIR_ALLOC(def) < 0) goto cleanup; @@ -365,6 +367,9 @@ virDomainSnapshotDefParse(xmlXPathContextPtr ctxt, def->current =3D active !=3D 0; } =20 + if (!offline && virSaveCookieParse(ctxt, &def->cookie, saveCookie) < 0) + goto cleanup; + ret =3D def; =20 cleanup: @@ -691,7 +696,7 @@ char * virDomainSnapshotDefFormat(const char *domain_uuid, virDomainSnapshotDefPtr def, virCapsPtr caps, - virDomainXMLOptionPtr xmlopt ATTRIBUTE_UNUSED, + virDomainXMLOptionPtr xmlopt, unsigned int flags, int internal) { @@ -751,6 +756,10 @@ virDomainSnapshotDefFormat(const char *domain_uuid, virBufferAddLit(&buf, "\n"); } =20 + if (virSaveCookieFormatBuf(&buf, def->cookie, + virDomainXMLOptionGetSaveCookie(xmlopt)) < = 0) + goto error; + if (internal) virBufferAsprintf(&buf, "%d\n", def->current); =20 diff --git a/src/conf/snapshot_conf.h b/src/conf/snapshot_conf.h index 2ce526fa6..1d663c77b 100644 --- a/src/conf/snapshot_conf.h +++ b/src/conf/snapshot_conf.h @@ -76,6 +76,8 @@ struct _virDomainSnapshotDef { =20 virDomainDefPtr dom; =20 + virObjectPtr cookie; + /* Internal use. */ bool current; /* At most one snapshot in the list should have this set= */ }; diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index ba4cecee1..003db6b65 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -535,6 +535,7 @@ virDomainWatchdogActionTypeToString; virDomainWatchdogModelTypeFromString; virDomainWatchdogModelTypeToString; virDomainXMLOptionGetNamespace; +virDomainXMLOptionGetSaveCookie; virDomainXMLOptionNew; =20 =20 diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index 886dc629f..04d9dd1bd 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -2255,5 +2255,5 @@ libxlCreateXMLConf(void) { return virDomainXMLOptionNew(&libxlDomainDefParserConfig, &libxlDomainXMLPrivateDataCallbacks, - NULL, NULL); + NULL, NULL, NULL); } diff --git a/src/lxc/lxc_conf.c b/src/lxc/lxc_conf.c index ff975decc..92a82a476 100644 --- a/src/lxc/lxc_conf.c +++ b/src/lxc/lxc_conf.c @@ -216,7 +216,7 @@ lxcDomainXMLConfInit(void) return virDomainXMLOptionNew(&virLXCDriverDomainDefParserConfig, &virLXCDriverPrivateDataCallbacks, &virLXCDriverDomainXMLNamespace, - NULL); + NULL, NULL); } =20 =20 diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c index 8e305a85c..a1485fc88 100644 --- a/src/openvz/openvz_driver.c +++ b/src/openvz/openvz_driver.c @@ -1483,7 +1483,7 @@ static virDrvOpenStatus openvzConnectOpen(virConnectP= tr conn, goto cleanup; =20 if (!(driver->xmlopt =3D virDomainXMLOptionNew(&openvzDomainDefParserC= onfig, - NULL, NULL, NULL))) + NULL, NULL, NULL, NULL))) goto cleanup; =20 if (openvzLoadDomains(driver) < 0) diff --git a/src/phyp/phyp_driver.c b/src/phyp/phyp_driver.c index 4465ac862..9121581fe 100644 --- a/src/phyp/phyp_driver.c +++ b/src/phyp/phyp_driver.c @@ -1202,7 +1202,7 @@ phypConnectOpen(virConnectPtr conn, goto failure; =20 if (!(phyp_driver->xmlopt =3D virDomainXMLOptionNew(&virPhypDriverDoma= inDefParserConfig, - NULL, NULL, NULL))) + NULL, NULL, NULL, NU= LL))) goto failure; =20 conn->privateData =3D phyp_driver; diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 03c55853f..7f2249259 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -5026,7 +5026,7 @@ virQEMUCapsInitQMPCommandRun(virQEMUCapsInitQMPComman= dPtr cmd, goto ignore; } =20 - if (!(xmlopt =3D virDomainXMLOptionNew(NULL, NULL, NULL, NULL)) || + if (!(xmlopt =3D virDomainXMLOptionNew(NULL, NULL, NULL, NULL, NULL)) = || !(cmd->vm =3D virDomainObjNew(xmlopt))) goto cleanup; =20 diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index d8b88386d..d02e776b0 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -910,7 +910,8 @@ virQEMUDriverCreateXMLConf(virQEMUDriverPtr driver) return virDomainXMLOptionNew(&virQEMUDriverDomainDefParserConfig, &virQEMUDriverPrivateDataCallbacks, &virQEMUDriverDomainXMLNamespace, - &virQEMUDriverDomainABIStability); + &virQEMUDriverDomainABIStability, + NULL); } =20 =20 diff --git a/src/security/virt-aa-helper.c b/src/security/virt-aa-helper.c index 48201d5b8..97436e5dc 100644 --- a/src/security/virt-aa-helper.c +++ b/src/security/virt-aa-helper.c @@ -667,7 +667,7 @@ get_definition(vahControl * ctl, const char *xmlStr) goto exit; } =20 - if (!(ctl->xmlopt =3D virDomainXMLOptionNew(NULL, NULL, NULL, NULL))) { + if (!(ctl->xmlopt =3D virDomainXMLOptionNew(NULL, NULL, NULL, NULL, NU= LL))) { vah_error(ctl, 0, _("Failed to create XML config object")); goto exit; } diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 8cecc6add..11e7fd880 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -414,7 +414,7 @@ testDriverNew(void) goto error; } =20 - if (!(ret->xmlopt =3D virDomainXMLOptionNew(NULL, NULL, &ns, NULL)) || + if (!(ret->xmlopt =3D virDomainXMLOptionNew(NULL, NULL, &ns, NULL, NUL= L)) || !(ret->eventState =3D virObjectEventStateNew()) || !(ret->ifaces =3D virInterfaceObjListNew()) || !(ret->domains =3D virDomainObjListNew()) || diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c index 58ab033c8..080fea47d 100644 --- a/src/uml/uml_driver.c +++ b/src/uml/uml_driver.c @@ -533,7 +533,7 @@ umlStateInitialize(bool privileged, goto out_of_memory; =20 if (!(uml_driver->xmlopt =3D virDomainXMLOptionNew(¨DriverDomainDef= ParserConfig, - &privcb, NULL, NULL))) + &privcb, NULL, NULL, = NULL))) goto error; =20 if ((uml_driver->inotifyFD =3D inotify_init()) < 0) { diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c index 1a90d00aa..c46e71bcf 100644 --- a/src/vbox/vbox_common.c +++ b/src/vbox/vbox_common.c @@ -142,7 +142,7 @@ vboxDriverObjNew(void) =20 if (!(driver->caps =3D vboxCapsInit()) || !(driver->xmlopt =3D virDomainXMLOptionNew(&vboxDomainDefParserCon= fig, - NULL, NULL, NULL))) + NULL, NULL, NULL, NULL))) goto cleanup; =20 return driver; diff --git a/src/vmware/vmware_driver.c b/src/vmware/vmware_driver.c index 9e369e67b..0ee1c5bb9 100644 --- a/src/vmware/vmware_driver.c +++ b/src/vmware/vmware_driver.c @@ -114,7 +114,8 @@ vmwareDomainXMLConfigInit(void) virDomainXMLPrivateDataCallbacks priv =3D { .alloc =3D vmwareDataAlloc= Func, .free =3D vmwareDataFreeFunc= }; =20 - return virDomainXMLOptionNew(&vmwareDomainDefParserConfig, &priv, NULL= , NULL); + return virDomainXMLOptionNew(&vmwareDomainDefParserConfig, &priv, + NULL, NULL, NULL); } =20 static virDrvOpenStatus diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c index 3289a2002..96507f10f 100644 --- a/src/vmx/vmx.c +++ b/src/vmx/vmx.c @@ -591,7 +591,7 @@ virDomainXMLOptionPtr virVMXDomainXMLConfInit(void) { return virDomainXMLOptionNew(&virVMXDomainDefParserConfig, NULL, - &virVMXDomainXMLNamespace, NULL); + &virVMXDomainXMLNamespace, NULL, NULL); } =20 char * diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index e6bb20182..7aa0c4c48 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -328,7 +328,7 @@ vzDriverObjNew(void) if (!(driver->caps =3D vzBuildCapabilities()) || !(driver->xmlopt =3D virDomainXMLOptionNew(&vzDomainDefParserConfi= g, &vzDomainXMLPrivateDataCa= llbacksPtr, - NULL, NULL)) || + NULL, NULL, NULL)) || !(driver->domains =3D virDomainObjListNew()) || !(driver->domainEventState =3D virObjectEventStateNew()) || (vzInitVersion(driver) < 0) || diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c index f81ee20ad..8e7bc350c 100644 --- a/src/xen/xen_driver.c +++ b/src/xen/xen_driver.c @@ -401,7 +401,7 @@ virDomainXMLOptionPtr xenDomainXMLConfInit(void) { return virDomainXMLOptionNew(&xenDomainDefParserConfig, - NULL, NULL, NULL); + NULL, NULL, NULL, NULL); } =20 =20 diff --git a/src/xenapi/xenapi_driver.c b/src/xenapi/xenapi_driver.c index 380c3a1de..fb462cd3a 100644 --- a/src/xenapi/xenapi_driver.c +++ b/src/xenapi/xenapi_driver.c @@ -200,7 +200,7 @@ xenapiConnectOpen(virConnectPtr conn, virConnectAuthPtr= auth, } =20 if (!(privP->xmlopt =3D virDomainXMLOptionNew(&xenapiDomainDefParserCo= nfig, - NULL, NULL, NULL))) { + NULL, NULL, NULL, NULL))) { xenapiSessionErrorHandler(conn, VIR_ERR_INTERNAL_ERROR, _("Failed to create XML conf object")); goto error; diff --git a/tests/bhyveargv2xmltest.c b/tests/bhyveargv2xmltest.c index 9db3750ac..6a5685115 100644 --- a/tests/bhyveargv2xmltest.c +++ b/tests/bhyveargv2xmltest.c @@ -131,7 +131,7 @@ mymain(void) return EXIT_FAILURE; =20 if ((driver.xmlopt =3D virDomainXMLOptionNew(NULL, NULL, - NULL, NULL)) =3D=3D NULL) + NULL, NULL, NULL)) =3D=3D N= ULL) return EXIT_FAILURE; =20 # define DO_TEST_FULL(name, flags) \ diff --git a/tests/testutils.c b/tests/testutils.c index 4b8cf79ef..f45596997 100644 --- a/tests/testutils.c +++ b/tests/testutils.c @@ -1136,7 +1136,7 @@ virDomainXMLOptionPtr virTestGenericDomainXMLConfInit= (void) { return virDomainXMLOptionNew(&virTestGenericDomainDefParserConfig, &virTestGenericPrivateDataCallbacks, - NULL, NULL); + NULL, NULL, NULL); } =20 =20 --=20 2.13.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Mon Apr 29 18:08:23 2024 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 1496824699708732.0795941866373; Wed, 7 Jun 2017 01:38:19 -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 383CB61976; Wed, 7 Jun 2017 08:38:17 +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 14785176B2; Wed, 7 Jun 2017 08:38:17 +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 BDA09183269A; Wed, 7 Jun 2017 08:38:16 +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 v578bpK7004829 for ; Wed, 7 Jun 2017 04:37:51 -0400 Received: by smtp.corp.redhat.com (Postfix) id 8844F7A451; 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 37B35757D9 for ; Wed, 7 Jun 2017 08:37:51 +0000 (UTC) Received: by virval.usersys.redhat.com (Postfix, from userid 500) id 84B7F101938; Wed, 7 Jun 2017 10:37:46 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 383CB61976 Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx09.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 383CB61976 From: Jiri Denemark To: libvir-list@redhat.com Date: Wed, 7 Jun 2017 10:37:38 +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.14 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v2 13/20] qemu: Implement virSaveCookie object and callbacks 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.38]); Wed, 07 Jun 2017 08:38:18 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" This patch implements a new save cookie object and callbacks for qemu driver. The actual useful content will be added in the object later. Signed-off-by: Jiri Denemark Reviewed-by: Pavel Hrdina --- Notes: Version 2: - no change src/qemu/qemu_conf.c | 2 +- src/qemu/qemu_domain.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++= ++-- src/qemu/qemu_domain.h | 9 ++++++ 3 files changed, 86 insertions(+), 4 deletions(-) diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index d02e776b0..73c33d678 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -911,7 +911,7 @@ virQEMUDriverCreateXMLConf(virQEMUDriverPtr driver) &virQEMUDriverPrivateDataCallbacks, &virQEMUDriverDomainXMLNamespace, &virQEMUDriverDomainABIStability, - NULL); + &virQEMUDriverDomainSaveCookie); } =20 =20 diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 814232164..80e9fea98 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -122,11 +122,13 @@ struct _qemuDomainLogContext { }; =20 static virClassPtr qemuDomainLogContextClass; +static virClassPtr qemuDomainSaveCookieClass; =20 static void qemuDomainLogContextDispose(void *obj); +static void qemuDomainSaveCookieDispose(void *obj); =20 static int -qemuDomainLogContextOnceInit(void) +qemuDomainOnceInit(void) { if (!(qemuDomainLogContextClass =3D virClassNew(virClassForObject(), "qemuDomainLogContext", @@ -134,10 +136,16 @@ qemuDomainLogContextOnceInit(void) qemuDomainLogContextDispo= se))) return -1; =20 + if (!(qemuDomainSaveCookieClass =3D virClassNew(virClassForObject(), + "qemuDomainSaveCookie", + sizeof(qemuDomainSaveCoo= kie), + qemuDomainSaveCookieDisp= ose))) + return -1; + return 0; } =20 -VIR_ONCE_GLOBAL_INIT(qemuDomainLogContext) +VIR_ONCE_GLOBAL_INIT(qemuDomain) =20 static void qemuDomainLogContextDispose(void *obj) @@ -4554,7 +4562,7 @@ qemuDomainLogContextPtr qemuDomainLogContextNew(virQE= MUDriverPtr driver, virQEMUDriverConfigPtr cfg =3D virQEMUDriverGetConfig(driver); qemuDomainLogContextPtr ctxt =3D NULL; =20 - if (qemuDomainLogContextInitialize() < 0) + if (qemuDomainInitialize() < 0) goto cleanup; =20 if (!(ctxt =3D virObjectNew(qemuDomainLogContextClass))) @@ -9105,3 +9113,68 @@ qemuDomainGetStorageSourceByDevstr(const char *devst= r, VIR_FREE(target); return src; } + + +static void +qemuDomainSaveCookieDispose(void *obj) +{ + qemuDomainSaveCookiePtr cookie =3D obj; + + VIR_DEBUG("cookie=3D%p", cookie); +} + + +qemuDomainSaveCookiePtr +qemuDomainSaveCookieNew(virDomainObjPtr vm ATTRIBUTE_UNUSED) +{ + qemuDomainSaveCookiePtr cookie =3D NULL; + + if (qemuDomainInitialize() < 0) + goto error; + + if (!(cookie =3D virObjectNew(qemuDomainSaveCookieClass))) + goto error; + + VIR_DEBUG("Save cookie %p", cookie); + + return cookie; + + error: + virObjectUnref(cookie); + return NULL; +} + + +static int +qemuDomainSaveCookieParse(xmlXPathContextPtr ctxt ATTRIBUTE_UNUSED, + virObjectPtr *obj) +{ + qemuDomainSaveCookiePtr cookie =3D NULL; + + if (qemuDomainInitialize() < 0) + goto error; + + if (!(cookie =3D virObjectNew(qemuDomainSaveCookieClass))) + goto error; + + *obj =3D (virObjectPtr) cookie; + return 0; + + error: + virObjectUnref(cookie); + return -1; +} + + +static int +qemuDomainSaveCookieFormat(virBufferPtr buf ATTRIBUTE_UNUSED, + virObjectPtr obj ATTRIBUTE_UNUSED) +{ + return 0; +} + + +virSaveCookieCallbacks virQEMUDriverDomainSaveCookie =3D { + .parse =3D qemuDomainSaveCookieParse, + .format =3D qemuDomainSaveCookieFormat, +}; diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index d0e2e0628..cc2e21bdf 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -416,6 +416,14 @@ struct qemuProcessEvent { typedef struct _qemuDomainLogContext qemuDomainLogContext; typedef qemuDomainLogContext *qemuDomainLogContextPtr; =20 +typedef struct _qemuDomainSaveCookie qemuDomainSaveCookie; +typedef qemuDomainSaveCookie *qemuDomainSaveCookiePtr; +struct _qemuDomainSaveCookie { + virObject parent; +}; + +qemuDomainSaveCookiePtr qemuDomainSaveCookieNew(virDomainObjPtr vm); + const char *qemuDomainAsyncJobPhaseToString(qemuDomainAsyncJob job, int phase); int qemuDomainAsyncJobPhaseFromString(qemuDomainAsyncJob job, @@ -638,6 +646,7 @@ extern virDomainXMLPrivateDataCallbacks virQEMUDriverPr= ivateDataCallbacks; extern virDomainXMLNamespace virQEMUDriverDomainXMLNamespace; extern virDomainDefParserConfig virQEMUDriverDomainDefParserConfig; extern virDomainABIStability virQEMUDriverDomainABIStability; +extern virSaveCookieCallbacks virQEMUDriverDomainSaveCookie; =20 int qemuDomainUpdateDeviceList(virQEMUDriverPtr driver, virDomainObjPtr vm, int asyncJob); --=20 2.13.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Mon Apr 29 18:08:23 2024 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 1496824750617928.7089221279568; Wed, 7 Jun 2017 01:39:10 -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 1FDDA61976; Wed, 7 Jun 2017 08:39:09 +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 CB56917A85; Wed, 7 Jun 2017 08:39:08 +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 A5B014EBD7; Wed, 7 Jun 2017 08:38:40 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v578br0a004903 for ; Wed, 7 Jun 2017 04:37:53 -0400 Received: by smtp.corp.redhat.com (Postfix) id 711D617A73; Wed, 7 Jun 2017 08:37:53 +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 1F0F61797E for ; Wed, 7 Jun 2017 08:37:51 +0000 (UTC) Received: by virval.usersys.redhat.com (Postfix, from userid 500) id 86991101939; Wed, 7 Jun 2017 10:37:46 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 1FDDA61976 Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx09.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 1FDDA61976 From: Jiri Denemark To: libvir-list@redhat.com Date: Wed, 7 Jun 2017 10:37:39 +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.13 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v2 14/20] qemu: Store save cookie in save images and snapshots 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.38]); Wed, 07 Jun 2017 08:39:09 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" The following patches will add an actual content in the cookie and use the data when restoring a domain. Signed-off-by: Jiri Denemark --- Notes: Version 2: - renamed virQEMUSaveHeader.cookie as cookieOffset - renamed virQEMUSaveDataNew's cookie parameter as cookieObj - store zeros at the end of header data rather than between domain XML and cookie docs/formatsnapshot.html.in | 6 +++ docs/schemas/domainsnapshot.rng | 7 +++ src/qemu/qemu_driver.c | 96 ++++++++++++++++++++++++++++++++++++-= ---- 3 files changed, 99 insertions(+), 10 deletions(-) diff --git a/docs/formatsnapshot.html.in b/docs/formatsnapshot.html.in index c3ab516fa..5e8e21c8a 100644 --- a/docs/formatsnapshot.html.in +++ b/docs/formatsnapshot.html.in @@ -235,6 +235,12 @@ at the time of the snapshot (since 0.9.5). Readonly. +
cookie
+
Save image cookie containing additional data libvirt may need to + properly restore a domain from an active snapshot when such data + cannot be stored directly in the domain to maintain + compatibility with older libvirt or hypervisor. Readonly. +
=20

Examples

diff --git a/docs/schemas/domainsnapshot.rng b/docs/schemas/domainsnapshot.= rng index 4ab1b828f..268088709 100644 --- a/docs/schemas/domainsnapshot.rng +++ b/docs/schemas/domainsnapshot.rng @@ -90,6 +90,13 @@ + + + + + + + diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index dba0d4025..5de9513aa 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -2808,7 +2808,8 @@ struct _virQEMUSaveHeader { uint32_t data_len; uint32_t was_running; uint32_t compressed; - uint32_t unused[15]; + uint32_t cookieOffset; + uint32_t unused[14]; }; =20 typedef struct _virQEMUSaveData virQEMUSaveData; @@ -2816,6 +2817,7 @@ typedef virQEMUSaveData *virQEMUSaveDataPtr; struct _virQEMUSaveData { virQEMUSaveHeader header; char *xml; + char *cookie; }; =20 =20 @@ -2826,6 +2828,7 @@ bswap_header(virQEMUSaveHeaderPtr hdr) hdr->data_len =3D bswap_32(hdr->data_len); hdr->was_running =3D bswap_32(hdr->was_running); hdr->compressed =3D bswap_32(hdr->compressed); + hdr->cookieOffset =3D bswap_32(hdr->cookieOffset); } =20 =20 @@ -2836,6 +2839,7 @@ virQEMUSaveDataFree(virQEMUSaveDataPtr data) return; =20 VIR_FREE(data->xml); + VIR_FREE(data->cookie); VIR_FREE(data); } =20 @@ -2845,8 +2849,10 @@ virQEMUSaveDataFree(virQEMUSaveDataPtr data) */ static virQEMUSaveDataPtr virQEMUSaveDataNew(char *domXML, + qemuDomainSaveCookiePtr cookieObj, bool running, - int compressed) + int compressed, + virDomainXMLOptionPtr xmlopt) { virQEMUSaveDataPtr data =3D NULL; virQEMUSaveHeaderPtr header; @@ -2856,6 +2862,11 @@ virQEMUSaveDataNew(char *domXML, =20 VIR_STEAL_PTR(data->xml, domXML); =20 + if (cookieObj && + !(data->cookie =3D virSaveCookieFormat((virObjectPtr) cookieObj, + virDomainXMLOptionGetSaveCook= ie(xmlopt)))) + goto error; + header =3D &data->header; memcpy(header->magic, QEMU_SAVE_PARTIAL, sizeof(header->magic)); header->version =3D QEMU_SAVE_VERSION; @@ -2863,6 +2874,10 @@ virQEMUSaveDataNew(char *domXML, header->compressed =3D compressed; =20 return data; + + error: + virQEMUSaveDataFree(data); + return NULL; } =20 =20 @@ -2882,11 +2897,17 @@ virQEMUSaveDataWrite(virQEMUSaveDataPtr data, { virQEMUSaveHeaderPtr header =3D &data->header; size_t len; + size_t xml_len; + size_t cookie_len =3D 0; int ret =3D -1; size_t zerosLen =3D 0; char *zeros =3D NULL; =20 - len =3D strlen(data->xml) + 1; + xml_len =3D strlen(data->xml) + 1; + if (data->cookie) + cookie_len =3D strlen(data->cookie) + 1; + + len =3D xml_len + cookie_len; =20 if (header->data_len > 0) { if (len > header->data_len) { @@ -2902,6 +2923,9 @@ virQEMUSaveDataWrite(virQEMUSaveDataPtr data, header->data_len =3D len; } =20 + if (data->cookie) + header->cookieOffset =3D xml_len; + if (safewrite(fd, header, sizeof(*header)) !=3D sizeof(*header)) { virReportSystemError(errno, _("failed to write header to domain save file= '%s'"), @@ -2909,14 +2933,28 @@ virQEMUSaveDataWrite(virQEMUSaveDataPtr data, goto cleanup; } =20 - if (safewrite(fd, data->xml, header->data_len) !=3D header->data_len || - safewrite(fd, zeros, zerosLen) !=3D zerosLen) { + if (safewrite(fd, data->xml, xml_len) !=3D xml_len) { virReportSystemError(errno, _("failed to write domain xml to '%s'"), path); goto cleanup; } =20 + if (data->cookie && + safewrite(fd, data->cookie, cookie_len) !=3D cookie_len) { + virReportSystemError(errno, + _("failed to write cookie to '%s'"), + path); + goto cleanup; + } + + if (safewrite(fd, zeros, zerosLen) !=3D zerosLen) { + virReportSystemError(errno, + _("failed to write padding to '%s'"), + path); + goto cleanup; + } + ret =3D 0; =20 cleanup: @@ -3250,6 +3288,7 @@ qemuDomainSaveInternal(virQEMUDriverPtr driver, virDo= mainPtr dom, qemuDomainObjPrivatePtr priv =3D vm->privateData; virCapsPtr caps; virQEMUSaveDataPtr data =3D NULL; + qemuDomainSaveCookiePtr cookie =3D NULL; =20 if (!(caps =3D virQEMUDriverGetCapabilities(driver, false))) goto cleanup; @@ -3315,7 +3354,11 @@ qemuDomainSaveInternal(virQEMUDriverPtr driver, virD= omainPtr dom, goto endjob; } =20 - if (!(data =3D virQEMUSaveDataNew(xml, was_running, compressed))) + if (!(cookie =3D qemuDomainSaveCookieNew(vm))) + goto endjob; + + if (!(data =3D virQEMUSaveDataNew(xml, cookie, was_running, compressed, + driver->xmlopt))) goto endjob; xml =3D NULL; =20 @@ -3352,6 +3395,7 @@ qemuDomainSaveInternal(virQEMUDriverPtr driver, virDo= mainPtr dom, qemuDomainRemoveInactive(driver, vm); =20 cleanup: + virObjectUnref(cookie); VIR_FREE(xml); virQEMUSaveDataFree(data); qemuDomainEventQueue(driver, event); @@ -6288,6 +6332,8 @@ qemuDomainSaveImageOpen(virQEMUDriverPtr driver, virDomainDefPtr def =3D NULL; int oflags =3D open_write ? O_RDWR : O_RDONLY; virCapsPtr caps =3D NULL; + size_t xml_len; + size_t cookie_len; =20 if (bypass_cache) { int directFlag =3D virFileDirectFdFlag(); @@ -6368,15 +6414,33 @@ qemuDomainSaveImageOpen(virQEMUDriverPtr driver, goto error; } =20 - if (VIR_ALLOC_N(data->xml, header->data_len) < 0) + if (header->cookieOffset) + xml_len =3D header->cookieOffset; + else + xml_len =3D header->data_len; + + cookie_len =3D header->data_len - xml_len; + + if (VIR_ALLOC_N(data->xml, xml_len) < 0) goto error; =20 - if (saferead(fd, data->xml, header->data_len) !=3D header->data_len) { + if (saferead(fd, data->xml, xml_len) !=3D xml_len) { virReportError(VIR_ERR_OPERATION_FAILED, "%s", _("failed to read domain XML")); goto error; } =20 + if (cookie_len > 0) { + if (VIR_ALLOC_N(data->cookie, cookie_len) < 0) + goto error; + + if (saferead(fd, data->cookie, cookie_len) !=3D cookie_len) { + virReportError(VIR_ERR_OPERATION_FAILED, "%s", + _("failed to read cookie")); + goto error; + } + } + /* Create a domain from this XML */ if (!(def =3D virDomainDefParseString(data->xml, caps, driver->xmlopt,= NULL, VIR_DOMAIN_DEF_PARSE_INACTIVE | @@ -6417,6 +6481,11 @@ qemuDomainSaveImageStartVM(virConnectPtr conn, char *errbuf =3D NULL; virQEMUDriverConfigPtr cfg =3D virQEMUDriverGetConfig(driver); virQEMUSaveHeaderPtr header =3D &data->header; + qemuDomainSaveCookiePtr cookie =3D NULL; + + if (virSaveCookieParseString(data->cookie, (virObjectPtr *) &cookie, + virDomainXMLOptionGetSaveCookie(driver->x= mlopt)) < 0) + goto cleanup; =20 if ((header->version =3D=3D 2) && (header->compressed !=3D QEMU_SAVE_FORMAT_RAW)) { @@ -6507,6 +6576,7 @@ qemuDomainSaveImageStartVM(virConnectPtr conn, ret =3D 0; =20 cleanup: + virObjectUnref(cookie); virCommandFree(cmd); VIR_FREE(errbuf); if (qemuSecurityRestoreSavedStateLabel(driver->securityManager, @@ -13559,6 +13629,9 @@ qemuDomainSnapshotCreateActiveInternal(virConnectPt= r conn, if (ret < 0) goto cleanup; =20 + if (!(snap->def->cookie =3D (virObjectPtr) qemuDomainSaveCookieNew(vm)= )) + goto cleanup; + if (flags & VIR_DOMAIN_SNAPSHOT_CREATE_HALT) { event =3D virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_S= TOPPED, VIR_DOMAIN_EVENT_STOPPED_FROM_SNA= PSHOT); @@ -14438,10 +14511,13 @@ qemuDomainSnapshotCreateActiveExternal(virConnect= Ptr conn, "snapshot", false)) < = 0) goto cleanup; =20 - if (!(xml =3D qemuDomainDefFormatLive(driver, vm->def, true, true)= )) + if (!(xml =3D qemuDomainDefFormatLive(driver, vm->def, true, true)= ) || + !(snap->def->cookie =3D (virObjectPtr) qemuDomainSaveCookieNew= (vm))) goto cleanup; =20 - if (!(data =3D virQEMUSaveDataNew(xml, resume, compressed))) + if (!(data =3D virQEMUSaveDataNew(xml, + (qemuDomainSaveCookiePtr) snap->de= f->cookie, + resume, compressed, driver->xmlopt= ))) goto cleanup; xml =3D NULL; =20 --=20 2.13.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Mon Apr 29 18:08:23 2024 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 1496824702232870.9873668536685; Wed, 7 Jun 2017 01:38:22 -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 AB19561D16; Wed, 7 Jun 2017 08:38:20 +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 6861117A85; Wed, 7 Jun 2017 08:38:20 +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 1D3434A496; Wed, 7 Jun 2017 08:38:20 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v578brtK004877 for ; Wed, 7 Jun 2017 04:37:53 -0400 Received: by smtp.corp.redhat.com (Postfix) id 3050118364; Wed, 7 Jun 2017 08:37:53 +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 042BD183A9 for ; Wed, 7 Jun 2017 08:37:52 +0000 (UTC) Received: by virval.usersys.redhat.com (Postfix, from userid 500) id 8B1BB10193A; Wed, 7 Jun 2017 10:37:46 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com AB19561D16 Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx10.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 AB19561D16 From: Jiri Denemark To: libvir-list@redhat.com Date: Wed, 7 Jun 2017 10:37:40 +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.15 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v2 15/20] qemu: Remember CPU def from domain start 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.39]); Wed, 07 Jun 2017 08:38:21 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" When starting a domain we update the guest CPU definition to match what QEMU actually provided (since it is allowed to add or removed some features unless check=3D'full' is specified). Let's store the original CPU in domain private data so that we can use it to provide a backward compatible domain XML. Signed-off-by: Jiri Denemark Reviewed-by: Pavel Hrdina --- Notes: Version 2: - no change src/libvirt_private.syms | 2 ++ src/qemu/qemu_domain.c | 7 +++++++ src/qemu/qemu_domain.h | 4 ++++ src/qemu/qemu_process.c | 13 +++++++++++-- 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 003db6b65..b6c828fc2 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -77,9 +77,11 @@ virCPUDefCopyModelFilter; virCPUDefCopyWithoutModel; virCPUDefFormat; virCPUDefFormatBuf; +virCPUDefFormatBufFull; virCPUDefFree; virCPUDefFreeFeatures; virCPUDefFreeModel; +virCPUDefIsEqual; virCPUDefParseXML; virCPUDefStealModel; virCPUDefUpdateFeature; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 80e9fea98..ba8079ba0 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -1726,6 +1726,8 @@ qemuDomainObjPrivateFree(void *data) VIR_FREE(priv->migTLSAlias); qemuDomainMasterKeyFree(priv); =20 + virCPUDefFree(priv->origCPU); + VIR_FREE(priv); } =20 @@ -1881,6 +1883,8 @@ qemuDomainObjPrivateXMLFormat(virBufferPtr buf, virBufferEscapeString(buf, "\n", priv->channelTargetDir); =20 + virCPUDefFormatBufFull(buf, priv->origCPU, NULL, false); + return 0; } =20 @@ -2149,6 +2153,9 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt, if (qemuDomainSetPrivatePathsOld(driver, vm) < 0) goto error; =20 + if (virCPUDefParseXML(ctxt, "./cpu", VIR_CPU_TYPE_GUEST, &priv->origCP= U) < 0) + goto error; + return 0; =20 error: diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index cc2e21bdf..f6dad4378 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -293,6 +293,10 @@ struct _qemuDomainObjPrivate { /* Used when fetching/storing the current 'tls-creds' migration settin= g */ /* (not to be saved in our private XML). */ char *migTLSAlias; + + /* CPU def used to start the domain when it differs from the one actua= lly + * provided by QEMU. */ + virCPUDefPtr origCPU; }; =20 # define QEMU_DOMAIN_PRIVATE(vm) \ diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 32ba8e373..c06349474 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -3915,6 +3915,7 @@ qemuProcessUpdateLiveGuestCPU(virQEMUDriverPtr driver, qemuDomainObjPrivatePtr priv =3D vm->privateData; int rc; int ret =3D -1; + virCPUDefPtr orig =3D NULL; =20 if (ARCH_IS_X86(def->os.arch)) { if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0) @@ -3945,10 +3946,17 @@ qemuProcessUpdateLiveGuestCPU(virQEMUDriverPtr driv= er, if (qemuProcessVerifyCPUFeatures(def, cpu) < 0) goto cleanup; =20 - if ((rc =3D virCPUUpdateLive(def->os.arch, def->cpu, cpu, disabled= )) < 0) + if (!(orig =3D virCPUDefCopy(def->cpu))) goto cleanup; - else if (rc =3D=3D 0) + + if ((rc =3D virCPUUpdateLive(def->os.arch, def->cpu, cpu, disabled= )) < 0) { + goto cleanup; + } else if (rc =3D=3D 0) { + if (!virCPUDefIsEqual(def->cpu, orig, false)) + VIR_STEAL_PTR(priv->origCPU, orig); + def->cpu->check =3D VIR_CPU_CHECK_FULL; + } } =20 ret =3D 0; @@ -3956,6 +3964,7 @@ qemuProcessUpdateLiveGuestCPU(virQEMUDriverPtr driver, cleanup: virCPUDataFree(cpu); virCPUDataFree(disabled); + virCPUDefFree(orig); return ret; } =20 --=20 2.13.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Mon Apr 29 18:08:23 2024 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 1496824719738667.5924791692798; Wed, 7 Jun 2017 01:38:39 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 89F32C034E7B; Wed, 7 Jun 2017 08:38:37 +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 4D8CD7D500; Wed, 7 Jun 2017 08:38:37 +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 10864183269A; Wed, 7 Jun 2017 08:38:22 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v578bqRn004856 for ; Wed, 7 Jun 2017 04:37:52 -0400 Received: by smtp.corp.redhat.com (Postfix) id B80AE1724E; Wed, 7 Jun 2017 08:37:52 +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 6320E5C88E for ; Wed, 7 Jun 2017 08:37:52 +0000 (UTC) Received: by virval.usersys.redhat.com (Postfix, from userid 500) id 8FB1D10193B; Wed, 7 Jun 2017 10:37:46 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 89F32C034E7B Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx07.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 89F32C034E7B From: Jiri Denemark To: libvir-list@redhat.com Date: Wed, 7 Jun 2017 10:37:41 +0200 Message-Id: <1ba16ed55cfda99b2e1b06c9774aed86e2519214.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.16 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v2 16/20] qemu: Report the original CPU in migratable xml 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.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Wed, 07 Jun 2017 08:38:38 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" The destination host may not be able to start a domain using the live updated CPU definition because either libvirt or QEMU may not be new enough. Thus we need to send the original guest CPU definition. Signed-off-by: Jiri Denemark Reviewed-by: Pavel Hrdina --- Notes: Version 2: - no change src/qemu/qemu_domain.c | 61 ++++++++++++++++++++++++++++++++++++++-----= ---- src/qemu/qemu_domain.h | 1 + src/qemu/qemu_driver.c | 13 ++++++---- src/qemu/qemu_migration.c | 5 ++-- 4 files changed, 63 insertions(+), 17 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index ba8079ba0..0da44f066 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -4216,11 +4216,13 @@ qemuDomainDefCopy(virQEMUDriverPtr driver, return ret; } =20 -int -qemuDomainDefFormatBuf(virQEMUDriverPtr driver, - virDomainDefPtr def, - unsigned int flags, - virBuffer *buf) + +static int +qemuDomainDefFormatBufInternal(virQEMUDriverPtr driver, + virDomainDefPtr def, + virCPUDefPtr origCPU, + unsigned int flags, + virBuffer *buf) { int ret =3D -1; virDomainDefPtr copy =3D NULL; @@ -4341,6 +4343,16 @@ qemuDomainDefFormatBuf(virQEMUDriverPtr driver, if (qemuDomainChrDefDropDefaultPath(def->channels[i], driver) = < 0) goto cleanup; } + + /* Replace the CPU definition updated according to QEMU with the o= ne + * used for starting the domain. The updated def will be sent + * separately for backward compatibility. + */ + if (origCPU) { + virCPUDefFree(def->cpu); + if (!(def->cpu =3D virCPUDefCopy(origCPU))) + goto cleanup; + } } =20 format: @@ -4354,13 +4366,26 @@ qemuDomainDefFormatBuf(virQEMUDriverPtr driver, return ret; } =20 -char *qemuDomainDefFormatXML(virQEMUDriverPtr driver, - virDomainDefPtr def, - unsigned int flags) + +int +qemuDomainDefFormatBuf(virQEMUDriverPtr driver, + virDomainDefPtr def, + unsigned int flags, + virBufferPtr buf) +{ + return qemuDomainDefFormatBufInternal(driver, def, NULL, flags, buf); +} + + +static char * +qemuDomainDefFormatXMLInternal(virQEMUDriverPtr driver, + virDomainDefPtr def, + virCPUDefPtr origCPU, + unsigned int flags) { virBuffer buf =3D VIR_BUFFER_INITIALIZER; =20 - if (qemuDomainDefFormatBuf(driver, def, flags, &buf) < 0) { + if (qemuDomainDefFormatBufInternal(driver, def, origCPU, flags, &buf) = < 0) { virBufferFreeAndReset(&buf); return NULL; } @@ -4374,26 +4399,40 @@ char *qemuDomainDefFormatXML(virQEMUDriverPtr drive= r, return virBufferContentAndReset(&buf); } =20 + +char * +qemuDomainDefFormatXML(virQEMUDriverPtr driver, + virDomainDefPtr def, + unsigned int flags) +{ + return qemuDomainDefFormatXMLInternal(driver, def, NULL, flags); +} + + char *qemuDomainFormatXML(virQEMUDriverPtr driver, virDomainObjPtr vm, unsigned int flags) { virDomainDefPtr def; + qemuDomainObjPrivatePtr priv =3D vm->privateData; + virCPUDefPtr origCPU =3D NULL; =20 if ((flags & VIR_DOMAIN_XML_INACTIVE) && vm->newDef) { def =3D vm->newDef; } else { def =3D vm->def; + origCPU =3D priv->origCPU; if (virDomainObjIsActive(vm)) flags &=3D ~VIR_DOMAIN_XML_UPDATE_CPU; } =20 - return qemuDomainDefFormatXML(driver, def, flags); + return qemuDomainDefFormatXMLInternal(driver, def, origCPU, flags); } =20 char * qemuDomainDefFormatLive(virQEMUDriverPtr driver, virDomainDefPtr def, + virCPUDefPtr origCPU, bool inactive, bool compatible) { @@ -4404,7 +4443,7 @@ qemuDomainDefFormatLive(virQEMUDriverPtr driver, if (compatible) flags |=3D VIR_DOMAIN_XML_MIGRATABLE; =20 - return qemuDomainDefFormatXML(driver, def, flags); + return qemuDomainDefFormatXMLInternal(driver, def, origCPU, flags); } =20 =20 diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index f6dad4378..08c0b32f1 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -515,6 +515,7 @@ char *qemuDomainFormatXML(virQEMUDriverPtr driver, =20 char *qemuDomainDefFormatLive(virQEMUDriverPtr driver, virDomainDefPtr def, + virCPUDefPtr origCPU, bool inactive, bool compatible); =20 diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 5de9513aa..5766ece80 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -3344,9 +3344,9 @@ qemuDomainSaveInternal(virQEMUDriverPtr driver, virDo= mainPtr dom, virDomainDefFree(def); goto endjob; } - xml =3D qemuDomainDefFormatLive(driver, def, true, true); + xml =3D qemuDomainDefFormatLive(driver, def, NULL, true, true); } else { - xml =3D qemuDomainDefFormatLive(driver, vm->def, true, true); + xml =3D qemuDomainDefFormatLive(driver, vm->def, priv->origCPU, tr= ue, true); } if (!xml) { virReportError(VIR_ERR_OPERATION_FAILED, @@ -14511,7 +14511,8 @@ qemuDomainSnapshotCreateActiveExternal(virConnectPt= r conn, "snapshot", false)) < = 0) goto cleanup; =20 - if (!(xml =3D qemuDomainDefFormatLive(driver, vm->def, true, true)= ) || + if (!(xml =3D qemuDomainDefFormatLive(driver, vm->def, priv->origC= PU, + true, true)) || !(snap->def->cookie =3D (virObjectPtr) qemuDomainSaveCookieNew= (vm))) goto cleanup; =20 @@ -14622,6 +14623,7 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, bool align_match =3D true; virQEMUDriverConfigPtr cfg =3D NULL; virCapsPtr caps =3D NULL; + qemuDomainObjPrivatePtr priv; =20 virCheckFlags(VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE | VIR_DOMAIN_SNAPSHOT_CREATE_CURRENT | @@ -14739,6 +14741,8 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, =20 qemuDomainObjSetAsyncJobMask(vm, QEMU_JOB_NONE); =20 + priv =3D vm->privateData; + if (redefine) { if (virDomainSnapshotRedefinePrep(domain, vm, &def, &snap, driver->xmlopt, @@ -14747,7 +14751,8 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, } else { /* Easiest way to clone inactive portion of vm->def is via * conversion in and back out of xml. */ - if (!(xml =3D qemuDomainDefFormatLive(driver, vm->def, true, true)= ) || + if (!(xml =3D qemuDomainDefFormatLive(driver, vm->def, priv->origC= PU, + true, true)) || !(def->dom =3D virDomainDefParseString(xml, caps, driver->xmlo= pt, NULL, VIR_DOMAIN_DEF_PARSE_INAC= TIVE | VIR_DOMAIN_DEF_PARSE_SKIP= _VALIDATE))) diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 3c0d7e957..2cd862875 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -2059,9 +2059,10 @@ qemuMigrationBeginPhase(virQEMUDriverPtr driver, if (!qemuDomainDefCheckABIStability(driver, vm->def, def)) goto cleanup; =20 - rv =3D qemuDomainDefFormatLive(driver, def, false, true); + rv =3D qemuDomainDefFormatLive(driver, def, NULL, false, true); } else { - rv =3D qemuDomainDefFormatLive(driver, vm->def, false, true); + rv =3D qemuDomainDefFormatLive(driver, vm->def, priv->origCPU, + false, true); } =20 cleanup: --=20 2.13.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Mon Apr 29 18:08:23 2024 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 1496824755839852.8626660351512; Wed, 7 Jun 2017 01:39:15 -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 5DDF0C0587EB; Wed, 7 Jun 2017 08:39:14 +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 2D4D918364; Wed, 7 Jun 2017 08:39:14 +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 4E6011869FEF; Wed, 7 Jun 2017 08:38:33 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v578brJT004882 for ; Wed, 7 Jun 2017 04:37:53 -0400 Received: by smtp.corp.redhat.com (Postfix) id 4B0C317A61; Wed, 7 Jun 2017 08:37:53 +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 1F18F17997 for ; Wed, 7 Jun 2017 08:37:52 +0000 (UTC) Received: by virval.usersys.redhat.com (Postfix, from userid 500) id 942F810193C; Wed, 7 Jun 2017 10:37:46 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 5DDF0C0587EB 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 5DDF0C0587EB From: Jiri Denemark To: libvir-list@redhat.com Date: Wed, 7 Jun 2017 10:37:42 +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.13 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v2 17/20] qemu: Always send persistent XML during migration 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.32]); Wed, 07 Jun 2017 08:39:15 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" When persistent migration of a transient domain is requested but no custom XML is passed to the migration API we would just let the destination daemon make a persistent definition from the live definition itself. This is not a problem now, but once the destination daemon starts replacing the original CPU definition with the one from migration cookie before starting a domain, it would need to add more ugly hacks to reverse the operation. Let's just always send the persistent definition in the cookie to make things a bit cleaner. Signed-off-by: Jiri Denemark --- Notes: Version 2: - new patch (separated from the original 13/15) src/qemu/qemu_migration.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 2cd862875..40564ac63 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -3644,8 +3644,9 @@ qemuMigrationRun(virQEMUDriverPtr driver, if (!(persistDef =3D qemuMigrationPrepareDef(driver, persist_x= ml, NULL, NULL))) goto cleanup; - } else if (vm->newDef) { - if (!(persistDef =3D qemuDomainDefCopy(driver, vm->newDef, + } else { + virDomainDefPtr def =3D vm->newDef ? vm->newDef : vm->def; + if (!(persistDef =3D qemuDomainDefCopy(driver, def, VIR_DOMAIN_XML_SECURE | VIR_DOMAIN_XML_MIGRATABLE= ))) goto cleanup; --=20 2.13.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Mon Apr 29 18:08:23 2024 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 1496824698488703.0095534337232; Wed, 7 Jun 2017 01:38:18 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 0F71E3345B3; Wed, 7 Jun 2017 08:38:16 +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 E0CF77C76B; Wed, 7 Jun 2017 08:38:15 +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 91A9918325E4; Wed, 7 Jun 2017 08:38:15 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v578bqim004855 for ; Wed, 7 Jun 2017 04:37:52 -0400 Received: by smtp.corp.redhat.com (Postfix) id B846417251; Wed, 7 Jun 2017 08:37:52 +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 6409E58823 for ; Wed, 7 Jun 2017 08:37:52 +0000 (UTC) Received: by virval.usersys.redhat.com (Postfix, from userid 500) id 98AF110193D; Wed, 7 Jun 2017 10:37:46 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 0F71E3345B3 Authentication-Results: ext-mx05.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx05.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 0F71E3345B3 From: Jiri Denemark To: libvir-list@redhat.com Date: Wed, 7 Jun 2017 10:37:43 +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.16 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v2 18/20] qemu: Send updated CPU in migration cookie 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.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Wed, 07 Jun 2017 08:38:16 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Since the domain XML send during migration uses the original guest CPU definition but we still want the destination to enforce ABI if it is new enough, we send the live updated CPU definition in a migration cookie. Signed-off-by: Jiri Denemark Reviewed-by: Pavel Hrdina --- Notes: Version 2: - persistent def related hunk moved to a separate patch src/qemu/qemu_migration.c | 6 +++++- src/qemu/qemu_migration_cookie.c | 31 ++++++++++++++++++++++++++++++- src/qemu/qemu_migration_cookie.h | 5 +++++ 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 40564ac63..134c76c5e 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -2020,6 +2020,9 @@ qemuMigrationBeginPhase(virQEMUDriverPtr driver, vm->newDef && !qemuDomainVcpuHotplugIsInOrder(vm->newDef))) cookieFlags |=3D QEMU_MIGRATION_COOKIE_CPU_HOTPLUG; =20 + if (priv->origCPU) + cookieFlags |=3D QEMU_MIGRATION_COOKIE_CPU; + if (!(mig =3D qemuMigrationEatCookie(driver, vm, NULL, 0, 0))) goto cleanup; =20 @@ -2644,7 +2647,8 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver, QEMU_MIGRATION_COOKIE_LOCKSTATE | QEMU_MIGRATION_COOKIE_NBD | QEMU_MIGRATION_COOKIE_MEMORY_HOTPLU= G | - QEMU_MIGRATION_COOKIE_CPU_HOTPLUG))) + QEMU_MIGRATION_COOKIE_CPU_HOTPLUG | + QEMU_MIGRATION_COOKIE_CPU))) goto cleanup; =20 if (STREQ_NULLABLE(protocol, "rdma") && diff --git a/src/qemu/qemu_migration_cookie.c b/src/qemu/qemu_migration_coo= kie.c index 559b1f0c1..af0ac0341 100644 --- a/src/qemu/qemu_migration_cookie.c +++ b/src/qemu/qemu_migration_cookie.c @@ -48,7 +48,8 @@ VIR_ENUM_IMPL(qemuMigrationCookieFlag, "nbd", "statistics", "memory-hotplug", - "cpu-hotplug"); + "cpu-hotplug", + "cpu"); =20 =20 static void @@ -109,6 +110,7 @@ qemuMigrationCookieFree(qemuMigrationCookiePtr mig) VIR_FREE(mig->lockState); VIR_FREE(mig->lockDriver); VIR_FREE(mig->jobInfo); + virCPUDefFree(mig->cpu); VIR_FREE(mig); } =20 @@ -519,6 +521,22 @@ qemuMigrationCookieAddStatistics(qemuMigrationCookiePt= r mig, } =20 =20 +static int +qemuMigrationCookieAddCPU(qemuMigrationCookiePtr mig, + virDomainObjPtr vm) +{ + if (mig->cpu) + return 0; + + if (!(mig->cpu =3D virCPUDefCopy(vm->def->cpu))) + return -1; + + mig->flags |=3D QEMU_MIGRATION_COOKIE_CPU; + + return 0; +} + + static void qemuMigrationCookieGraphicsXMLFormat(virBufferPtr buf, qemuMigrationCookieGraphicsPtr grap) @@ -755,6 +773,9 @@ qemuMigrationCookieXMLFormat(virQEMUDriverPtr driver, if (mig->flags & QEMU_MIGRATION_COOKIE_STATS && mig->jobInfo) qemuMigrationCookieStatisticsXMLFormat(buf, mig->jobInfo); =20 + if (mig->flags & QEMU_MIGRATION_COOKIE_CPU && mig->cpu) + virCPUDefFormatBufFull(buf, mig->cpu, NULL, false); + virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "\n"); return 0; @@ -1198,6 +1219,10 @@ qemuMigrationCookieXMLParse(qemuMigrationCookiePtr m= ig, (!(mig->jobInfo =3D qemuMigrationCookieStatisticsXMLParse(ctxt)))) goto error; =20 + if (flags & QEMU_MIGRATION_COOKIE_CPU && + virCPUDefParseXML(ctxt, "./cpu[1]", VIR_CPU_TYPE_GUEST, &mig->cpu)= < 0) + goto error; + virObjectUnref(caps); return 0; =20 @@ -1274,6 +1299,10 @@ qemuMigrationBakeCookie(qemuMigrationCookiePtr mig, if (flags & QEMU_MIGRATION_COOKIE_CPU_HOTPLUG) mig->flagsMandatory |=3D QEMU_MIGRATION_COOKIE_CPU_HOTPLUG; =20 + if (flags & QEMU_MIGRATION_COOKIE_CPU && + qemuMigrationCookieAddCPU(mig, dom) < 0) + return -1; + if (!(*cookieout =3D qemuMigrationCookieXMLFormatStr(driver, mig))) return -1; =20 diff --git a/src/qemu/qemu_migration_cookie.h b/src/qemu/qemu_migration_coo= kie.h index b009d5bf5..e5f3d75a9 100644 --- a/src/qemu/qemu_migration_cookie.h +++ b/src/qemu/qemu_migration_cookie.h @@ -28,6 +28,7 @@ typedef enum { QEMU_MIGRATION_COOKIE_FLAG_STATS, QEMU_MIGRATION_COOKIE_FLAG_MEMORY_HOTPLUG, QEMU_MIGRATION_COOKIE_FLAG_CPU_HOTPLUG, + QEMU_MIGRATION_COOKIE_FLAG_CPU, =20 QEMU_MIGRATION_COOKIE_FLAG_LAST } qemuMigrationCookieFlags; @@ -43,6 +44,7 @@ typedef enum { QEMU_MIGRATION_COOKIE_STATS =3D (1 << QEMU_MIGRATION_COOKIE_FLAG_STATS= ), QEMU_MIGRATION_COOKIE_MEMORY_HOTPLUG =3D (1 << QEMU_MIGRATION_COOKIE_F= LAG_MEMORY_HOTPLUG), QEMU_MIGRATION_COOKIE_CPU_HOTPLUG =3D (1 << QEMU_MIGRATION_COOKIE_FLAG= _CPU_HOTPLUG), + QEMU_MIGRATION_COOKIE_CPU =3D (1 << QEMU_MIGRATION_COOKIE_FLAG_CPU), } qemuMigrationCookieFeatures; =20 typedef struct _qemuMigrationCookieGraphics qemuMigrationCookieGraphics; @@ -122,6 +124,9 @@ struct _qemuMigrationCookie { =20 /* If (flags & QEMU_MIGRATION_COOKIE_STATS) */ qemuDomainJobInfoPtr jobInfo; + + /* If flags & QEMU_MIGRATION_COOKIE_CPU */ + virCPUDefPtr cpu; }; =20 =20 --=20 2.13.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Mon Apr 29 18:08:23 2024 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 149682475299634.07421878638365; Wed, 7 Jun 2017 01:39:12 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9AC12DC8EF; Wed, 7 Jun 2017 08:39:11 +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 6F8E57D971; Wed, 7 Jun 2017 08:39:11 +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 E22EB5EC69; Wed, 7 Jun 2017 08:38:43 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v578brKn004902 for ; Wed, 7 Jun 2017 04:37:53 -0400 Received: by smtp.corp.redhat.com (Postfix) id 6F62A60E3F; Wed, 7 Jun 2017 08:37:53 +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 4228C82788 for ; Wed, 7 Jun 2017 08:37:52 +0000 (UTC) Received: by virval.usersys.redhat.com (Postfix, from userid 500) id 9D86910193E; Wed, 7 Jun 2017 10:37:46 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 9AC12DC8EF Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx09.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 9AC12DC8EF From: Jiri Denemark To: libvir-list@redhat.com Date: Wed, 7 Jun 2017 10:37:44 +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.12 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v2 19/20] qemu: Store updated CPU in save cookie 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.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Wed, 07 Jun 2017 08:39:12 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Since the domain XML saved in a snapshot or saved image uses the original guest CPU definition but we still want to enforce ABI when restoring the domain if libvirt and QEMU are new enough, we save the live updated CPU definition in a save cookie. Signed-off-by: Jiri Denemark Reviewed-by: Pavel Hrdina --- Notes: Version 2: - no change src/qemu/qemu_domain.c | 22 +++++++++++++++++++--- src/qemu/qemu_domain.h | 2 ++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 0da44f066..ec43d06d7 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -9167,12 +9167,15 @@ qemuDomainSaveCookieDispose(void *obj) qemuDomainSaveCookiePtr cookie =3D obj; =20 VIR_DEBUG("cookie=3D%p", cookie); + + virCPUDefFree(cookie->cpu); } =20 =20 qemuDomainSaveCookiePtr qemuDomainSaveCookieNew(virDomainObjPtr vm ATTRIBUTE_UNUSED) { + qemuDomainObjPrivatePtr priv =3D vm->privateData; qemuDomainSaveCookiePtr cookie =3D NULL; =20 if (qemuDomainInitialize() < 0) @@ -9181,7 +9184,10 @@ qemuDomainSaveCookieNew(virDomainObjPtr vm ATTRIBUTE= _UNUSED) if (!(cookie =3D virObjectNew(qemuDomainSaveCookieClass))) goto error; =20 - VIR_DEBUG("Save cookie %p", cookie); + if (priv->origCPU && !(cookie->cpu =3D virCPUDefCopy(vm->def->cpu))) + goto error; + + VIR_DEBUG("Save cookie %p, cpu=3D%p", cookie, cookie->cpu); =20 return cookie; =20 @@ -9203,6 +9209,10 @@ qemuDomainSaveCookieParse(xmlXPathContextPtr ctxt AT= TRIBUTE_UNUSED, if (!(cookie =3D virObjectNew(qemuDomainSaveCookieClass))) goto error; =20 + if (virCPUDefParseXML(ctxt, "./cpu[1]", VIR_CPU_TYPE_GUEST, + &cookie->cpu) < 0) + goto error; + *obj =3D (virObjectPtr) cookie; return 0; =20 @@ -9213,9 +9223,15 @@ qemuDomainSaveCookieParse(xmlXPathContextPtr ctxt AT= TRIBUTE_UNUSED, =20 =20 static int -qemuDomainSaveCookieFormat(virBufferPtr buf ATTRIBUTE_UNUSED, - virObjectPtr obj ATTRIBUTE_UNUSED) +qemuDomainSaveCookieFormat(virBufferPtr buf, + virObjectPtr obj) { + qemuDomainSaveCookiePtr cookie =3D (qemuDomainSaveCookiePtr) obj; + + if (cookie->cpu && + virCPUDefFormatBufFull(buf, cookie->cpu, NULL, false) < 0) + return -1; + return 0; } =20 diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index 08c0b32f1..44c466cb7 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -424,6 +424,8 @@ typedef struct _qemuDomainSaveCookie qemuDomainSaveCook= ie; typedef qemuDomainSaveCookie *qemuDomainSaveCookiePtr; struct _qemuDomainSaveCookie { virObject parent; + + virCPUDefPtr cpu; }; =20 qemuDomainSaveCookiePtr qemuDomainSaveCookieNew(virDomainObjPtr vm); --=20 2.13.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Mon Apr 29 18:08:23 2024 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 149682474227487.68968405949954; Wed, 7 Jun 2017 01:39:02 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id C2889804F2; Wed, 7 Jun 2017 08:39:00 +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 A0D6A7E64D; Wed, 7 Jun 2017 08:39:00 +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 3FD661869FE6; Wed, 7 Jun 2017 08:38:29 +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 v578brQR004872 for ; Wed, 7 Jun 2017 04:37:53 -0400 Received: by smtp.corp.redhat.com (Postfix) id 22B087D517; Wed, 7 Jun 2017 08:37:53 +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 C652960467 for ; Wed, 7 Jun 2017 08:37:52 +0000 (UTC) Received: by virval.usersys.redhat.com (Postfix, from userid 500) id A224710193F; Wed, 7 Jun 2017 10:37:46 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com C2889804F2 Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx03.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 C2889804F2 From: Jiri Denemark To: libvir-list@redhat.com Date: Wed, 7 Jun 2017 10:37:45 +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 20/20] qemu: Use updated CPU when starting QEMU if possible 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.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Wed, 07 Jun 2017 08:39:01 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" If QEMU is new enough and we have the live updated CPU definition in either save or migration cookie, we can use it to enforce ABI. The original guest CPU from domain XML will be stored in private data. Signed-off-by: Jiri Denemark Reviewed-by: Pavel Hrdina --- Notes: Version 2: - no change src/qemu/qemu_domain.c | 40 ++++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_domain.h | 5 +++++ src/qemu/qemu_driver.c | 30 ++++++++++++++++++++++++------ src/qemu/qemu_migration.c | 2 +- src/qemu/qemu_process.c | 24 ++++++++++++++++++++++-- src/qemu/qemu_process.h | 2 ++ 6 files changed, 94 insertions(+), 9 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index ec43d06d7..2aa3aaa47 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -9240,3 +9240,43 @@ virSaveCookieCallbacks virQEMUDriverDomainSaveCookie= =3D { .parse =3D qemuDomainSaveCookieParse, .format =3D qemuDomainSaveCookieFormat, }; + + +/** + * qemuDomainUpdateCPU: + * @vm: domain which is being started + * @cpu: CPU updated when the domain was running previously (before migrat= ion, + * snapshot, or save) + * @origCPU: where to store the original CPU from vm->def in case @cpu was + * used instead + * + * Replace the CPU definition with the updated one when QEMU is new enough= to + * allow us to check extra features it is about to enable or disable when + * starting a domain. The original CPU is stored in @origCPU. + * + * Returns 0 on success, -1 on error. + */ +int +qemuDomainUpdateCPU(virDomainObjPtr vm, + virCPUDefPtr cpu, + virCPUDefPtr *origCPU) +{ + qemuDomainObjPrivatePtr priv =3D vm->privateData; + + *origCPU =3D NULL; + + if (!cpu || !vm->def->cpu || + !virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_QUERY_CPU_MODEL_EXPANSIO= N) || + virCPUDefIsEqual(vm->def->cpu, cpu, false)) + return 0; + + if (!(cpu =3D virCPUDefCopy(cpu))) + return -1; + + VIR_DEBUG("Replacing CPU def with the updated one"); + + *origCPU =3D vm->def->cpu; + vm->def->cpu =3D cpu; + + return 0; +} diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index 44c466cb7..ef3a33076 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -919,4 +919,9 @@ char *qemuDomainDiskBackingStoreGetName(virDomainDiskDe= fPtr disk, virStorageSourcePtr qemuDomainGetStorageSourceByDevstr(const char *devstr, virDomainDefPtr def= ); =20 +int +qemuDomainUpdateCPU(virDomainObjPtr vm, + virCPUDefPtr cpu, + virCPUDefPtr *origCPU); + #endif /* __QEMU_DOMAIN_H__ */ diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 5766ece80..12bafd636 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -1779,7 +1779,7 @@ static virDomainPtr qemuDomainCreateXML(virConnectPtr= conn, goto cleanup; } =20 - if (qemuProcessStart(conn, driver, vm, QEMU_ASYNC_JOB_START, + if (qemuProcessStart(conn, driver, vm, NULL, QEMU_ASYNC_JOB_START, NULL, -1, NULL, NULL, VIR_NETDEV_VPORT_PROFILE_OP_CREATE, start_flags) < 0) { @@ -6506,8 +6506,8 @@ qemuDomainSaveImageStartVM(virConnectPtr conn, } } =20 - if (qemuProcessStart(conn, driver, vm, asyncJob, - "stdio", *fd, path, NULL, + if (qemuProcessStart(conn, driver, vm, cookie ? cookie->cpu : NULL, + asyncJob, "stdio", *fd, path, NULL, VIR_NETDEV_VPORT_PROFILE_OP_RESTORE, VIR_QEMU_PROCESS_START_PAUSED) =3D=3D 0) restored =3D true; @@ -7124,7 +7124,7 @@ qemuDomainObjStart(virConnectPtr conn, } } =20 - ret =3D qemuProcessStart(conn, driver, vm, asyncJob, + ret =3D qemuProcessStart(conn, driver, vm, NULL, asyncJob, NULL, -1, NULL, NULL, VIR_NETDEV_VPORT_PROFILE_OP_CREATE, start_flags= ); virDomainAuditStart(vm, "booted", ret >=3D 0); @@ -15294,6 +15294,8 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr sna= pshot, virCapsPtr caps =3D NULL; bool was_running =3D false; bool was_stopped =3D false; + qemuDomainSaveCookiePtr cookie; + virCPUDefPtr origCPU =3D NULL; =20 virCheckFlags(VIR_DOMAIN_SNAPSHOT_REVERT_RUNNING | VIR_DOMAIN_SNAPSHOT_REVERT_PAUSED | @@ -15399,6 +15401,8 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr sna= pshot, goto endjob; } =20 + cookie =3D (qemuDomainSaveCookiePtr) snap->def->cookie; + switch ((virDomainState) snap->def->state) { case VIR_DOMAIN_RUNNING: case VIR_DOMAIN_PAUSED: @@ -15410,6 +15414,15 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr sn= apshot, * to have finer control. */ if (virDomainObjIsActive(vm)) { /* Transitions 5, 6, 8, 9 */ + /* Replace the CPU in config and put the original one in priv + * once we're done. + */ + if (cookie && cookie->cpu && config->cpu) { + origCPU =3D config->cpu; + if (!(config->cpu =3D virCPUDefCopy(cookie->cpu))) + goto endjob; + } + /* Check for ABI compatibility. We need to do this check again= st * the migratable XML or it will always fail otherwise */ if (config && @@ -15469,8 +15482,11 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr sn= apshot, * failed loadvm attempt? */ goto endjob; } - if (config) + if (config) { virDomainObjAssignDef(vm, config, false, NULL); + virCPUDefFree(priv->origCPU); + VIR_STEAL_PTR(priv->origCPU, origCPU); + } } else { /* Transitions 2, 3 */ load: @@ -15479,6 +15495,7 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr sna= pshot, virDomainObjAssignDef(vm, config, false, NULL); =20 rc =3D qemuProcessStart(snapshot->domain->conn, driver, vm, + cookie ? cookie->cpu : NULL, QEMU_ASYNC_JOB_START, NULL, -1, NULL, sn= ap, VIR_NETDEV_VPORT_PROFILE_OP_CREATE, VIR_QEMU_PROCESS_START_PAUSED); @@ -15572,7 +15589,7 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr sna= pshot, start_flags |=3D paused ? VIR_QEMU_PROCESS_START_PAUSED : 0; =20 qemuDomainEventQueue(driver, event); - rc =3D qemuProcessStart(snapshot->domain->conn, driver, vm, + rc =3D qemuProcessStart(snapshot->domain->conn, driver, vm, NU= LL, QEMU_ASYNC_JOB_START, NULL, -1, NULL, NU= LL, VIR_NETDEV_VPORT_PROFILE_OP_CREATE, start_flags); @@ -15644,6 +15661,7 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr sna= pshot, virObjectUnref(caps); virObjectUnref(cfg); virNWFilterUnlockFilterUpdates(); + virCPUDefFree(origCPU); =20 return ret; } diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 134c76c5e..505e61e5f 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -2681,7 +2681,7 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver, goto stopjob; } =20 - if (qemuProcessInit(driver, vm, QEMU_ASYNC_JOB_MIGRATION_IN, + if (qemuProcessInit(driver, vm, mig->cpu, QEMU_ASYNC_JOB_MIGRATION_IN, true, VIR_QEMU_PROCESS_START_AUTODESTROY) < 0) goto stopjob; stopProcess =3D true; diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index c06349474..4a66f0d5d 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -3946,6 +3946,13 @@ qemuProcessUpdateLiveGuestCPU(virQEMUDriverPtr drive= r, if (qemuProcessVerifyCPUFeatures(def, cpu) < 0) goto cleanup; =20 + /* Don't update the CPU if we already did so when starting a domain + * during migration, restore or snapshot revert. */ + if (priv->origCPU) { + ret =3D 0; + goto cleanup; + } + if (!(orig =3D virCPUDefCopy(def->cpu))) goto cleanup; =20 @@ -4864,6 +4871,7 @@ qemuProcessStartValidate(virQEMUDriverPtr driver, int qemuProcessInit(virQEMUDriverPtr driver, virDomainObjPtr vm, + virCPUDefPtr updatedCPU, qemuDomainAsyncJob asyncJob, bool migration, unsigned int flags) @@ -4872,6 +4880,7 @@ qemuProcessInit(virQEMUDriverPtr driver, virCapsPtr caps =3D NULL; qemuDomainObjPrivatePtr priv =3D vm->privateData; int stopFlags; + virCPUDefPtr origCPU =3D NULL; int ret =3D -1; =20 VIR_DEBUG("vm=3D%p name=3D%s id=3D%d migration=3D%d", @@ -4896,6 +4905,9 @@ qemuProcessInit(virQEMUDriverPtr driver, vm->def->os.machine)= )) goto cleanup; =20 + if (qemuDomainUpdateCPU(vm, updatedCPU, &origCPU) < 0) + goto cleanup; + if (qemuProcessStartValidate(driver, vm, priv->qemuCaps, caps, flags) = < 0) goto cleanup; =20 @@ -4928,11 +4940,14 @@ qemuProcessInit(virQEMUDriverPtr driver, =20 if (qemuDomainSetPrivatePaths(driver, vm) < 0) goto stop; + + VIR_STEAL_PTR(priv->origCPU, origCPU); } =20 ret =3D 0; =20 cleanup: + virCPUDefFree(origCPU); virObjectUnref(cfg); virObjectUnref(caps); return ret; @@ -5963,6 +5978,7 @@ int qemuProcessStart(virConnectPtr conn, virQEMUDriverPtr driver, virDomainObjPtr vm, + virCPUDefPtr updatedCPU, qemuDomainAsyncJob asyncJob, const char *migrateFrom, int migrateFd, @@ -5993,7 +6009,8 @@ qemuProcessStart(virConnectPtr conn, if (!migrateFrom && !snapshot) flags |=3D VIR_QEMU_PROCESS_START_NEW; =20 - if (qemuProcessInit(driver, vm, asyncJob, !!migrateFrom, flags) < 0) + if (qemuProcessInit(driver, vm, updatedCPU, + asyncJob, !!migrateFrom, flags) < 0) goto cleanup; =20 if (migrateFrom) { @@ -6072,7 +6089,8 @@ qemuProcessCreatePretendCmd(virConnectPtr conn, flags |=3D VIR_QEMU_PROCESS_START_PRETEND; flags |=3D VIR_QEMU_PROCESS_START_NEW; =20 - if (qemuProcessInit(driver, vm, QEMU_ASYNC_JOB_NONE, !!migrateURI, fla= gs) < 0) + if (qemuProcessInit(driver, vm, NULL, QEMU_ASYNC_JOB_NONE, + !!migrateURI, flags) < 0) goto cleanup; =20 if (qemuProcessPrepareDomain(conn, driver, vm, flags) < 0) @@ -6476,6 +6494,8 @@ void qemuProcessStop(virQEMUDriverPtr driver, =20 /* clean up migration data */ VIR_FREE(priv->migTLSAlias); + virCPUDefFree(priv->origCPU); + priv->origCPU =3D NULL; =20 /* clear previously used namespaces */ virBitmapFree(priv->namespaces); diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h index 830d8cef8..c38310b47 100644 --- a/src/qemu/qemu_process.h +++ b/src/qemu/qemu_process.h @@ -75,6 +75,7 @@ typedef enum { int qemuProcessStart(virConnectPtr conn, virQEMUDriverPtr driver, virDomainObjPtr vm, + virCPUDefPtr updatedCPU, qemuDomainAsyncJob asyncJob, const char *migrateFrom, int stdin_fd, @@ -93,6 +94,7 @@ virCommandPtr qemuProcessCreatePretendCmd(virConnectPtr c= onn, =20 int qemuProcessInit(virQEMUDriverPtr driver, virDomainObjPtr vm, + virCPUDefPtr updatedCPU, qemuDomainAsyncJob asyncJob, bool migration, unsigned int flags); --=20 2.13.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list