From nobody Mon Feb 9 03:14:07 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 63.128.21.124 as permitted sender) client-ip=63.128.21.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 63.128.21.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1618587543; cv=none; d=zohomail.com; s=zohoarc; b=nWksZqw0t/TGx4Xt6lzhp9Q+XbzZ6Ctu60Yq/qYn1vLbDGDPal7Ag7gvUaSV2ay57zya9UkCIqwYfj5xQAWFaC8ZPr0KJeQZYuKrKmZVyWBOvy6A4PvgYio7fzSZ3TQyP5a4MgE5AJAig+tKkePMUbK0VF6J+ytej5I28uqPMmw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1618587543; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=9dsqE68QqI6+hFP6002yMmH+5XTEMHsrwQULrrMLwEI=; b=i2Z8IqfhFGXibf2gtQqP9tiDIQXUHpgqS/QEeXOR5Lg4am1m0xaR25GUzBRrugo6eR2tYCeU37Zd7pCEM0PXpUVTXoqwc74z8bblhSfEVdxxD9RxV0jCwrNSRCresVAf2U/Cj34R7F7YIMoWd2APs1S4MoeccJ+AYt3zTmrIvEg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 63.128.21.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by mx.zohomail.com with SMTPS id 1618587543546834.5858289347264; Fri, 16 Apr 2021 08:39:03 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-544-gRttLi2cOPygakfdNLpklQ-1; Fri, 16 Apr 2021 11:39:00 -0400 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 mimecast-mx01.redhat.com (Postfix) with ESMTPS id 70890107ACC7; Fri, 16 Apr 2021 15:38: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 4C6DE5C257; Fri, 16 Apr 2021 15:38:54 +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 0F2A344A60; Fri, 16 Apr 2021 15:38:54 +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 13GFZNMB009493 for ; Fri, 16 Apr 2021 11:35:23 -0400 Received: by smtp.corp.redhat.com (Postfix) id 8E1EF5C260; Fri, 16 Apr 2021 15:35:23 +0000 (UTC) Received: from speedmetal.lan (unknown [10.40.208.33]) by smtp.corp.redhat.com (Postfix) with ESMTP id D1DA95C257 for ; Fri, 16 Apr 2021 15:35:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1618587542; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=9dsqE68QqI6+hFP6002yMmH+5XTEMHsrwQULrrMLwEI=; b=LZWTfNtiH73BByJEpCnyYIWal61xQ7W7gDLG9G4TsM4HCeaxXQH/JBFpAPS9hzldhiZ86H UfSPj3wzN7fMuX/vnE7zlRLuOHH55yuWFBRSq3aX7ItzY/ZAh4kYU5AzJ1H5enfqwp+Nbz nCwS1V8ArbjR1ouda9y1f+U/3ju7e7E= X-MC-Unique: gRttLi2cOPygakfdNLpklQ-1 From: Peter Krempa To: libvir-list@redhat.com Subject: [PATCH 25/25] conf: domain: Refactor virDomainDiskDefParseXML Date: Fri, 16 Apr 2021 17:34:43 +0200 Message-Id: <7c6b57c6a2b512b382f64baf892c87a7577428eb.1618587222.git.pkrempa@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-loop: libvir-list@redhat.com 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: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" Use the new virXMLProp helpers and XPath queries to get rid of the old style of iteration through element children. Note that in case of def->blockio.logical_block_size, def->blockio.physical_block_size and def->rotation_rate the wraparound behaviour of 'virStrToLong_ui' was _not_ forward ported to the new code as it makes no sense with the attributes. Signed-off-by: Peter Krempa --- src/conf/domain_conf.c | 196 +++++++++++++++++------------------------ 1 file changed, 80 insertions(+), 116 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 242839d60f..a36d0a2713 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -9316,18 +9316,13 @@ virDomainDiskDefParseXML(virDomainXMLOption *xmlopt, unsigned int flags) { g_autoptr(virDomainDiskDef) def =3D NULL; - xmlNodePtr cur; VIR_XPATH_NODE_AUTORESTORE(ctxt) - bool source =3D false; - g_autofree char *target =3D NULL; - g_autofree char *serial =3D NULL; - g_autofree char *logical_block_size =3D NULL; - g_autofree char *physical_block_size =3D NULL; - g_autofree char *wwn =3D NULL; - g_autofree char *vendor =3D NULL; - g_autofree char *product =3D NULL; - g_autofree char *domain_name =3D NULL; - g_autofree char *rotation_rate =3D NULL; + xmlNodePtr sourceNode; + xmlNodePtr targetNode; + xmlNodePtr geometryNode; + xmlNodePtr blockioNode; + xmlNodePtr driverNode; + xmlNodePtr mirrorNode; g_autoptr(virStorageSource) src =3D NULL; if (!(src =3D virDomainDiskDefParseSourceXML(xmlopt, node, ctxt, flags= ))) @@ -9360,132 +9355,101 @@ virDomainDiskDefParseXML(virDomainXMLOption *xmlo= pt, VIR_XML_PROP_OPTIONAL | VIR_XML_PROP_NONZERO, &def-= >sgio) < 0) return NULL; - for (cur =3D node->children; cur !=3D NULL; cur =3D cur->next) { - if (cur->type !=3D XML_ELEMENT_NODE) - continue; + if ((sourceNode =3D virXPathNode("./source", ctxt))) { + if (virXMLPropEnum(sourceNode, "startupPolicy", + virDomainStartupPolicyTypeFromString, + VIR_XML_PROP_OPTIONAL | VIR_XML_PROP_NONZERO, + &def->startupPolicy) < 0) + return NULL; + } - if (!source && virXMLNodeNameEqual(cur, "source")) { - source =3D true; + if ((targetNode =3D virXPathNode("./target", ctxt))) { + def->dst =3D virXMLPropString(targetNode, "dev"); - if (virXMLPropEnum(cur, "startupPolicy", - virDomainStartupPolicyTypeFromString, - VIR_XML_PROP_OPTIONAL | VIR_XML_PROP_NONZER= O, - &def->startupPolicy) < 0) - return NULL; + if (virXMLPropEnum(targetNode, "bus", + virDomainDiskBusTypeFromString, + VIR_XML_PROP_OPTIONAL | VIR_XML_PROP_NONZERO, + &def->bus) < 0) + return NULL; - } else if (!target && - virXMLNodeNameEqual(cur, "target")) { - target =3D virXMLPropString(cur, "dev"); - if (virXMLPropEnum(cur, "bus", - virDomainDiskBusTypeFromString, - VIR_XML_PROP_OPTIONAL | VIR_XML_PROP_NONZER= O, - &def->bus) < 0) - return NULL; - if (virXMLPropEnum(cur, "tray", virDomainDiskTrayTypeFromStrin= g, - VIR_XML_PROP_OPTIONAL, &def->tray_status) <= 0) - return NULL; + if (virXMLPropEnum(targetNode, "tray", virDomainDiskTrayTypeFromSt= ring, + VIR_XML_PROP_OPTIONAL, &def->tray_status) < 0) + return NULL; - if (virXMLPropTristateSwitch(cur, "removable", VIR_XML_PROP_OP= TIONAL, - &def->removable) < 0) - return NULL; + if (virXMLPropTristateSwitch(targetNode, "removable", VIR_XML_PROP= _OPTIONAL, + &def->removable) < 0) + return NULL; - rotation_rate =3D virXMLPropString(cur, "rotation_rate"); - } else if (!domain_name && - virXMLNodeNameEqual(cur, "backenddomain")) { - domain_name =3D virXMLPropString(cur, "name"); - } else if (virXMLNodeNameEqual(cur, "geometry")) { - if (virDomainDiskDefGeometryParse(def, cur) < 0) - return NULL; - } else if (virXMLNodeNameEqual(cur, "blockio")) { - logical_block_size =3D - virXMLPropString(cur, "logical_block_size"); - if (logical_block_size && - virStrToLong_ui(logical_block_size, NULL, 0, - &def->blockio.logical_block_size) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("invalid logical block size '%s'"), - logical_block_size); - return NULL; - } - physical_block_size =3D - virXMLPropString(cur, "physical_block_size"); - if (physical_block_size && - virStrToLong_ui(physical_block_size, NULL, 0, - &def->blockio.physical_block_size) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("invalid physical block size '%s'"), - physical_block_size); - return NULL; - } - } else if (!virDomainDiskGetDriver(def) && - virXMLNodeNameEqual(cur, "driver")) { - if (virDomainVirtioOptionsParseXML(cur, &def->virtio) < 0) - return NULL; + if (virXMLPropUInt(targetNode, "rotation_rate", 10, VIR_XML_PROP_O= PTIONAL, + &def->rotation_rate) < 0) + return NULL; + } - if (virDomainDiskDefDriverParseXML(def, cur, ctxt) < 0) - return NULL; - } else if (!def->mirror && - virXMLNodeNameEqual(cur, "mirror") && - !(flags & VIR_DOMAIN_DEF_PARSE_INACTIVE)) { - if (virDomainDiskDefMirrorParse(def, cur, ctxt, flags, xmlopt)= < 0) - return NULL; - } else if (virXMLNodeNameEqual(cur, "auth")) { - def->diskElementAuth =3D true; - } else if (virXMLNodeNameEqual(cur, "iotune")) { - if (virDomainDiskDefIotuneParse(def, ctxt) < 0) - return NULL; - } else if (virXMLNodeNameEqual(cur, "transient")) { - def->transient =3D true; - } else if (virXMLNodeNameEqual(cur, "encryption")) { - def->diskElementEnc =3D true; - } else if (!serial && - virXMLNodeNameEqual(cur, "serial")) { - if (!(serial =3D virXMLNodeContentString(cur))) - return NULL; - } else if (!wwn && - virXMLNodeNameEqual(cur, "wwn")) { - if (!(wwn =3D virXMLNodeContentString(cur))) - return NULL; + if ((geometryNode =3D virXPathNode("./geometry", ctxt))) { + if (virDomainDiskDefGeometryParse(def, geometryNode) < 0) + return NULL; + } - } else if (!vendor && - virXMLNodeNameEqual(cur, "vendor")) { - if (!(vendor =3D virXMLNodeContentString(cur))) - return NULL; - } else if (!product && - virXMLNodeNameEqual(cur, "product")) { - if (!(product =3D virXMLNodeContentString(cur))) + if ((blockioNode =3D virXPathNode("./blockio", ctxt))) { + if (virXMLPropUInt(blockioNode, "logical_block_size", 10, VIR_XML_= PROP_OPTIONAL, + &def->blockio.logical_block_size) < 0) + return NULL; + + if (virXMLPropUInt(blockioNode, "physical_block_size", 10, VIR_XML= _PROP_OPTIONAL, + &def->blockio.physical_block_size) < 0) + return NULL; + } + + if ((driverNode =3D virXPathNode("./driver", ctxt))) { + if (virDomainVirtioOptionsParseXML(driverNode, &def->virtio) < 0) + return NULL; + + if (virDomainDiskDefDriverParseXML(def, driverNode, ctxt) < 0) + return NULL; + } + + if ((mirrorNode =3D virXPathNode("./mirror", ctxt))) { + if (!(flags & VIR_DOMAIN_DEF_PARSE_INACTIVE)) { + if (virDomainDiskDefMirrorParse(def, mirrorNode, ctxt, flags, = xmlopt) < 0) return NULL; - } else if (virXMLNodeNameEqual(cur, "boot")) { - /* boot is parsed as part of virDomainDeviceInfoParseXML */ - } else if ((flags & VIR_DOMAIN_DEF_PARSE_STATUS) && - virXMLNodeNameEqual(cur, "diskSecretsPlacement")) { - g_autofree char *secretAuth =3D virXMLPropString(cur, "auth"); - g_autofree char *secretEnc =3D virXMLPropString(cur, "enc"); + } + } + + if (virXPathNode("./auth", ctxt)) + def->diskElementAuth =3D true; + + if (virXPathNode("./encryption", ctxt)) + def->diskElementEnc =3D true; + + if (flags & VIR_DOMAIN_DEF_PARSE_STATUS) { + xmlNodePtr diskSecretsPlacementNode; + + if ((diskSecretsPlacementNode =3D virXPathNode("./diskSecretsPlace= ment", ctxt))) { + g_autofree char *secretAuth =3D virXMLPropString(diskSecretsPl= acementNode, "auth"); + g_autofree char *secretEnc =3D virXMLPropString(diskSecretsPla= cementNode, "enc"); def->diskElementAuth =3D !!secretAuth; def->diskElementEnc =3D !!secretEnc; } } - if (rotation_rate && - virStrToLong_ui(rotation_rate, NULL, 10, &def->rotation_rate) < 0)= { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("Cannot parse rotation rate '%s'"), rotation_rate= ); + if (virXPathNode("./transient", ctxt)) + def->transient =3D true; + + if (virDomainDiskDefIotuneParse(def, ctxt) < 0) return NULL; - } + + def->domain_name =3D virXPathString("string(./backenddomain/@name)", c= txt); + def->serial =3D virXPathString("string(./serial)", ctxt); + def->wwn =3D virXPathString("string(./wwn)", ctxt); + def->vendor =3D virXPathString("string(./vendor)", ctxt); + def->product =3D virXPathString("string(./product)", ctxt); if (virDomainDeviceInfoParseXML(xmlopt, node, ctxt, &def->info, flags | VIR_DOMAIN_DEF_PARSE_ALLOW_BOO= T) < 0) { return NULL; } - def->dst =3D g_steal_pointer(&target); - def->domain_name =3D g_steal_pointer(&domain_name); - def->serial =3D g_steal_pointer(&serial); - def->wwn =3D g_steal_pointer(&wwn); - def->vendor =3D g_steal_pointer(&vendor); - def->product =3D g_steal_pointer(&product); - if (flags & VIR_DOMAIN_DEF_PARSE_STATUS && virDomainDiskDefParsePrivateData(ctxt, def, xmlopt) < 0) return NULL; --=20 2.30.2