From nobody Mon Feb 9 01:21:52 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) client-ip=170.10.129.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 170.10.129.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=1697122578; cv=none; d=zohomail.com; s=zohoarc; b=Lwbg9LT8EXCgj+sSdRgALEq444BqQObOsfgJIzPVSGAkJM4i1FxHJ9sMneirlSfKDiqkXQ3Fmaikr8QFEcpVAyHYDylacK4j9z4qh7LYO7X9khpaX2hk3gBTseiwA4kYuvhQRd1LrAWJ8DCbTv4xnJ0XPYSXkI6x67EarnG9eI4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1697122578; h=Content-Type:Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To:Cc; bh=pYVpRWuKaFQv9R31OLmAYdnQLdYCVCP86tE1Tc7lLz0=; b=FOIkylc2GaZl5dwa5rx7W7qRgv63iWHJ/HRlNlnTZxv2uqn18Ulv+NdV2OW5YKJgrSV0eIzhk1Cydk2/V8uZuI61O7cvFtYSMEDxEnkYtq9PH2Ryv+ySi1d2EU2X1L9jWWdmCEN30TKECu48MRwm9vvB2h/UdCev8SlxRw5PReg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by mx.zohomail.com with SMTPS id 1697122578031656.9365802679246; Thu, 12 Oct 2023 07:56:18 -0700 (PDT) Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-479-q3EkVJGyPQyyGvFeZbvXPA-1; Thu, 12 Oct 2023 10:56:14 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 274541029F55; Thu, 12 Oct 2023 14:56:10 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id 13FFF2017EA6; Thu, 12 Oct 2023 14:56:10 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 5228C19465BB; Thu, 12 Oct 2023 14:56:09 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 3456B1946586 for ; Thu, 12 Oct 2023 14:47:36 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id 24A35C1598A; Thu, 12 Oct 2023 14:47:36 +0000 (UTC) Received: from speedmetal.lan (unknown [10.45.242.22]) by smtp.corp.redhat.com (Postfix) with ESMTP id 9463CC15BBC for ; Thu, 12 Oct 2023 14:47:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1697122577; 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=pYVpRWuKaFQv9R31OLmAYdnQLdYCVCP86tE1Tc7lLz0=; b=OPZdiRMNAo7m7BNsxJyLrVDJxE9gRXJVllEQwCV/q3GpEhyh1mhUx6DjR5SIFzpvPEUacM YXdyaeHDb/74gY6DOcYPV40BXrUI6HitnL5lVkr0ZcgONrEjqJY+XQT7GqOgyLUfK1krIC SpMdSbqsISYDB3XSZp15F6R9YptD2kc= X-MC-Unique: q3EkVJGyPQyyGvFeZbvXPA-1 X-Original-To: libvir-list@listman.corp.redhat.com From: Peter Krempa To: libvir-list@redhat.com Subject: [PATCH 4/7] qemu: domain: Allow preserving translated disk type='volume' data into XML if needed Date: Thu, 12 Oct 2023 16:47:28 +0200 Message-ID: <046218dfb6a68015a3cac4d0694c8a9b88ed7db2.1697121886.git.pkrempa@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.8 X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libvir-list-bounces@redhat.com Sender: "libvir-list" X-Scanned-By: MIMEDefang 3.1 on 10.11.54.4 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1697122579469100001 Content-Type: text/plain; charset="utf-8" Re-translating a disk type=3D'volume' definition from a storage pool is not a good idea in cases when the volume might have changed or we might not have access to the storage driver. Specific cases are if a storage pool is not activated on daemon restart, then re-connecting to a VM fails, or if the virt-aa-helper program tries to setup labelling for apparmor. Add a new flag which will preserve the translated data in the definition. Signed-off-by: Peter Krempa Reviewed-by: J=C3=A1n Tomko --- src/conf/domain_conf.c | 69 ++++++++++++++++++++++++++++++------------ src/conf/domain_conf.h | 4 +++ 2 files changed, 53 insertions(+), 20 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index e128457b00..9b636215e9 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -7006,7 +7006,8 @@ virDomainLeaseDefParseXML(xmlNodePtr node, } static virStorageSourcePoolDef * -virDomainDiskSourcePoolDefParse(xmlNodePtr node) +virDomainDiskSourcePoolDefParse(xmlNodePtr node, + virDomainDefParseFlags flags) { g_autoptr(virStorageSourcePoolDef) source =3D g_new0(virStorageSourceP= oolDef, 1); @@ -7029,6 +7030,14 @@ virDomainDiskSourcePoolDefParse(xmlNodePtr node) &source->mode) < 0) return NULL; + if (flags & VIR_DOMAIN_DEF_PARSE_VOLUME_TRANSLATED) { + if (virXMLPropEnum(node, "actualType", + virStorageTypeFromString, + VIR_XML_PROP_NONZERO, + &source->actualtype) < 0) + return NULL; + } + return g_steal_pointer(&source); } @@ -7448,12 +7457,22 @@ virDomainStorageSourceParse(xmlNodePtr node, unsigned int flags, virDomainXMLOption *xmlopt) { + virStorageType actualType =3D src->type; VIR_XPATH_NODE_AUTORESTORE(ctxt) xmlNodePtr tmp; ctxt->node =3D node; - switch (src->type) { + if (src->type =3D=3D VIR_STORAGE_TYPE_VOLUME) { + if (!(src->srcpool =3D virDomainDiskSourcePoolDefParse(node, flags= ))) + return -1; + + /* If requested we need to also parse the translated volume runtim= e data */ + if (flags & VIR_DOMAIN_DEF_PARSE_VOLUME_TRANSLATED) + actualType =3D virStorageSourceGetActualType(src); + } + + switch (actualType) { case VIR_STORAGE_TYPE_FILE: src->path =3D virXMLPropString(node, "file"); src->fdgroup =3D virXMLPropString(node, "fdgroup"); @@ -7469,8 +7488,7 @@ virDomainStorageSourceParse(xmlNodePtr node, return -1; break; case VIR_STORAGE_TYPE_VOLUME: - if (!(src->srcpool =3D virDomainDiskSourcePoolDefParse(node))) - return -1; + /* parsed above */ break; case VIR_STORAGE_TYPE_NVME: if (virDomainDiskSourceNVMeParse(node, ctxt, src) < 0) @@ -7488,7 +7506,7 @@ virDomainStorageSourceParse(xmlNodePtr node, case VIR_STORAGE_TYPE_LAST: virReportError(VIR_ERR_INTERNAL_ERROR, _("unexpected disk type %1$s"), - virStorageTypeToString(src->type)); + virStorageTypeToString(actualType)); return -1; } @@ -8647,7 +8665,7 @@ virDomainFSDefParseXML(virDomainXMLOption *xmlopt, units =3D virXMLPropString(source_node, "units"); } else if (def->type =3D=3D VIR_DOMAIN_FS_TYPE_VOLUME) { def->src->type =3D VIR_STORAGE_TYPE_VOLUME; - if (!(def->src->srcpool =3D virDomainDiskSourcePoolDefParse(so= urce_node))) + if (!(def->src->srcpool =3D virDomainDiskSourcePoolDefParse(so= urce_node, flags))) goto error; } } @@ -22335,10 +22353,28 @@ virDomainDiskSourceFormat(virBuffer *buf, bool skipEnc, virDomainXMLOption *xmlopt) { + virStorageType actualType =3D src->type; g_auto(virBuffer) attrBuf =3D VIR_BUFFER_INITIALIZER; g_auto(virBuffer) childBuf =3D VIR_BUFFER_INIT_CHILD(buf); - switch (src->type) { + if (src->type =3D=3D VIR_STORAGE_TYPE_VOLUME) { + if (src->srcpool) { + virBufferEscapeString(&attrBuf, " pool=3D'%s'", src->srcpool->= pool); + virBufferEscapeString(&attrBuf, " volume=3D'%s'", src->srcpool= ->volume); + if (src->srcpool->mode) + virBufferAsprintf(&attrBuf, " mode=3D'%s'", + virStorageSourcePoolModeTypeToString(src= ->srcpool->mode)); + } + + if (flags & VIR_DOMAIN_DEF_FORMAT_VOLUME_TRANSLATED && + src->srcpool->actualtype !=3D VIR_STORAGE_TYPE_NONE) { + virBufferAsprintf(&attrBuf, " actualType=3D'%s'", + virStorageTypeToString(src->srcpool->actualt= ype)); + actualType =3D virStorageSourceGetActualType(src); + } + } + + switch (actualType) { case VIR_STORAGE_TYPE_FILE: virBufferEscapeString(&attrBuf, " file=3D'%s'", src->path); virBufferEscapeString(&attrBuf, " fdgroup=3D'%s'", src->fdgroup); @@ -22357,15 +22393,7 @@ virDomainDiskSourceFormat(virBuffer *buf, break; case VIR_STORAGE_TYPE_VOLUME: - if (src->srcpool) { - virBufferEscapeString(&attrBuf, " pool=3D'%s'", src->srcpool->= pool); - virBufferEscapeString(&attrBuf, " volume=3D'%s'", - src->srcpool->volume); - if (src->srcpool->mode) - virBufferAsprintf(&attrBuf, " mode=3D'%s'", - virStorageSourcePoolModeTypeToString(src= ->srcpool->mode)); - } - + /* formatted above */ break; case VIR_STORAGE_TYPE_NVME: @@ -22383,13 +22411,13 @@ virDomainDiskSourceFormat(virBuffer *buf, case VIR_STORAGE_TYPE_NONE: case VIR_STORAGE_TYPE_LAST: virReportError(VIR_ERR_INTERNAL_ERROR, - _("unexpected disk type %1$d"), src->type); + _("unexpected disk type %1$d"), actualType); return -1; } virDomainDiskSourceFormatSlices(&childBuf, src); - if (src->type !=3D VIR_STORAGE_TYPE_NETWORK) + if (actualType !=3D VIR_STORAGE_TYPE_NETWORK) virDomainSourceDefFormatSeclabel(&childBuf, src->nseclabels, src->seclabels, flags); @@ -22408,7 +22436,7 @@ virDomainDiskSourceFormat(virBuffer *buf, if (src->pr) virStoragePRDefFormat(&childBuf, src->pr, flags & VIR_DOMAIN_DEF_FORMAT_MIGRATABLE); - if (policy && src->type !=3D VIR_STORAGE_TYPE_NETWORK) + if (policy && actualType !=3D VIR_STORAGE_TYPE_NETWORK) virBufferEscapeString(&attrBuf, " startupPolicy=3D'%s'", virDomainStartupPolicyTypeToString(policy)); @@ -27512,7 +27540,8 @@ virDomainDefFormatInternalSetRootName(virDomainDef = *def, VIR_DOMAIN_DEF_FORMAT_STATUS | VIR_DOMAIN_DEF_FORMAT_ACTUAL_NET | VIR_DOMAIN_DEF_FORMAT_PCI_ORIG_STATES | - VIR_DOMAIN_DEF_FORMAT_CLOCK_ADJUST, + VIR_DOMAIN_DEF_FORMAT_CLOCK_ADJUST | + VIR_DOMAIN_DEF_FORMAT_VOLUME_TRANSLATED, -1); if (!(type =3D virDomainVirtTypeToString(def->virtType))) { diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 16289789c2..9e6dd930fa 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -3734,6 +3734,8 @@ typedef enum { * post parse callbacks before starting. Failure of the post parse cal= lback * is recorded as def->postParseFail */ VIR_DOMAIN_DEF_PARSE_ALLOW_POST_PARSE_FAIL =3D 1 << 11, + /* Parse the translated disk type=3D'volume' data if present */ + VIR_DOMAIN_DEF_PARSE_VOLUME_TRANSLATED =3D 1 << 12, } virDomainDefParseFlags; typedef enum { @@ -3749,6 +3751,8 @@ typedef enum { VIR_DOMAIN_DEF_FORMAT_ALLOW_ROM =3D 1 << 6, VIR_DOMAIN_DEF_FORMAT_ALLOW_BOOT =3D 1 << 7, VIR_DOMAIN_DEF_FORMAT_CLOCK_ADJUST =3D 1 << 8, + /* format disk type=3D'volume' translated data if present */ + VIR_DOMAIN_DEF_FORMAT_VOLUME_TRANSLATED =3D 1 << 9, } virDomainDefFormatFlags; /* Use these flags to skip specific domain ABI consistency checks done --=20 2.41.0