conf: Introduce 'shareBacking' for <transient> disks

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 <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
This commit is contained in:
Peter Krempa 2021-05-18 11:11:02 +02:00
parent aa6e33edcc
commit be63e8703c
4 changed files with 26 additions and 3 deletions

View File

@ -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 ``<transient/>`` 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 ``<serial>WD-WMAP9A966149</serial>``. Not supported for

View File

@ -1429,6 +1429,11 @@
</optional>
<optional>
<element name="transient">
<optional>
<attribute name="shareBacking">
<ref name='virYesNo'/>
</attribute>
</optional>
<empty/>
</element>
</optional>

View File

@ -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, "<readonly/>\n");
if (def->src->shared)
virBufferAddLit(buf, "<shareable/>\n");
if (def->transient)
virBufferAddLit(buf, "<transient/>\n");
if (def->transient) {
virBufferAddLit(buf, "<transient");
if (def->transientShareBacking == VIR_TRISTATE_BOOL_YES)
virBufferAddLit(buf, " shareBacking='yes'");
virBufferAddLit(buf, "/>\n");
}
virBufferEscapeString(buf, "<serial>%s</serial>\n", def->serial);
virBufferEscapeString(buf, "<wwn>%s</wwn>\n", def->wwn);
virBufferEscapeString(buf, "<vendor>%s</vendor>\n", def->vendor);

View File

@ -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;