From be63e8703c7354bdf0c767a771223b33ab2ad4f2 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Tue, 18 May 2021 11:11:02 +0200 Subject: [PATCH] conf: Introduce 'shareBacking' for disks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In case the user wants to share the disk image between multiple VMs the qemu driver needs to hotplug such disks to instantiate the backends. Since that doesn't work for all disk configs add a switch to force this behaviour. Signed-off-by: Peter Krempa Reviewed-by: Ján Tomko Reviewed-by: Pavel Hrdina --- docs/formatdomain.rst | 6 ++++++ docs/schemas/domaincommon.rng | 5 +++++ src/conf/domain_conf.c | 17 ++++++++++++++--- src/conf/domain_conf.h | 1 + 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index e115165ad2..aa7bb8da14 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -3135,6 +3135,12 @@ paravirtualized driver is specified via the ``disk`` element. disk transient prevents the domain from participating in migration, snapshots, or blockjobs. Only supported in vmx hypervisor (:since:`Since 0.9.5`) and ``qemu`` hypervisor (:since:`Since 6.9.0`). + + In cases where the source image of the ```` disk is supposed to + be shared between multiple concurrently running VMs the optional + ``shareBacking`` attribute should be set to ``yes``. Note that hypervisor + drivers may need to hotplug such disk and thus it works only with + configurations supporting hotplug. :since:`Since 7.4.0` ``serial`` If present, this specify serial number of virtual hard drive. For example, it may look like ``WD-WMAP9A966149``. Not supported for diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 66a581c514..38f9d3f599 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -1429,6 +1429,11 @@ + + + + + diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index e27154f22d..4f78b7b43d 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -9047,6 +9047,7 @@ virDomainDiskDefParseXML(virDomainXMLOption *xmlopt, xmlNodePtr blockioNode; xmlNodePtr driverNode; xmlNodePtr mirrorNode; + xmlNodePtr transientNode; g_autoptr(virStorageSource) src = NULL; if (!(src = virDomainDiskDefParseSourceXML(xmlopt, node, ctxt, flags))) @@ -9155,9 +9156,15 @@ virDomainDiskDefParseXML(virDomainXMLOption *xmlopt, } } - if (virXPathNode("./transient", ctxt)) + if ((transientNode = virXPathNode("./transient", ctxt))) { def->transient = true; + if (virXMLPropTristateBool(transientNode, "shareBacking", + VIR_XML_PROP_NONE, + &def->transientShareBacking) < 0) + return NULL; + } + if (virDomainDiskDefIotuneParse(def, ctxt) < 0) return NULL; @@ -23551,8 +23558,12 @@ virDomainDiskDefFormat(virBuffer *buf, virBufferAddLit(buf, "\n"); if (def->src->shared) virBufferAddLit(buf, "\n"); - if (def->transient) - virBufferAddLit(buf, "\n"); + if (def->transient) { + virBufferAddLit(buf, "transientShareBacking == VIR_TRISTATE_BOOL_YES) + virBufferAddLit(buf, " shareBacking='yes'"); + virBufferAddLit(buf, "/>\n"); + } virBufferEscapeString(buf, "%s\n", def->serial); virBufferEscapeString(buf, "%s\n", def->wwn); virBufferEscapeString(buf, "%s\n", def->vendor); diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index f38ab21a3b..bf1249571d 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -575,6 +575,7 @@ struct _virDomainDiskDef { unsigned int snapshot; /* virDomainSnapshotLocation, snapshot_conf.h */ virDomainStartupPolicy startupPolicy; bool transient; + virTristateBool transientShareBacking; virDomainDeviceInfo info; virTristateBool rawio; virDomainDeviceSGIO sgio;