is only valid when the specified storage volume is of 'file' or
'block' type).
<p>
+ The <code>source</code> element may also have the <code>index</code>
+ attribute with same semantics the <a href='#elementsDiskBackingStoreIndex'>
+ <code>index</code></a> attribute of <code>backingStore</code>
+ </p>
+ <p>
The <code>source</code> element may contain the following sub elements:
</p>
by the backing store, see disk type attribute above for more
details and possible values.
</dd>
- <dt><code>index</code></dt>
+ <dt><code><a id="elementsDiskBackingStoreIndex">index</a></code></dt>
<dd>
This attribute is only valid in output (and ignored on input) and
it can be used to refer to a specific part of the disk chain when
</optional>
</define>
+ <define name="diskSourceCommon">
+ <optional>
+ <attribute name="index">
+ <ref name="positiveInteger"/>
+ </attribute>
+ </optional>
+ </define>
+
<define name="diskSource">
<choice>
<ref name="diskSourceFile"/>
<ref name="absFilePath"/>
</attribute>
</optional>
+ <ref name="diskSourceCommon"/>
<optional>
<ref name="storageStartupPolicy"/>
</optional>
<ref name="absFilePath"/>
</attribute>
</optional>
+ <ref name="diskSourceCommon"/>
<optional>
<ref name="storageStartupPolicy"/>
</optional>
<attribute name="dir">
<ref name="absFilePath"/>
</attribute>
+ <ref name="diskSourceCommon"/>
<optional>
<ref name="storageStartupPolicy"/>
</optional>
<attribute name="protocol">
<value>rbd</value>
</attribute>
+ <ref name="diskSourceCommon"/>
<optional>
<attribute name="name"/>
</optional>
<value>iscsi</value>
</attribute>
<attribute name="name"/>
+ <ref name="diskSourceCommon"/>
<ref name="diskSourceNetworkHost"/>
<optional>
<ref name="diskAuth"/>
</choice>
</attribute>
<attribute name="name"/>
+ <ref name="diskSourceCommon"/>
<ref name="diskSourceNetworkHost"/>
<optional>
<ref name="encryption"/>
</choice>
</attribute>
<attribute name="name"/>
+ <ref name="diskSourceCommon"/>
<ref name="diskSourceNetworkHost"/>
<optional>
<ref name="encryption"/>
<ref name="virYesNo"/>
</attribute>
</optional>
+ <ref name="diskSourceCommon"/>
<ref name="diskSourceNetworkHost"/>
<optional>
<ref name="encryption"/>
<value>gluster</value>
</attribute>
<attribute name="name"/>
+ <ref name="diskSourceCommon"/>
<oneOrMore>
<ref name="diskSourceNetworkHost"/>
</oneOrMore>
</choice>
</attribute>
<attribute name="name"/>
+ <ref name="diskSourceCommon"/>
<optional>
<attribute name="tls">
<ref name="virYesNo"/>
</choice>
</attribute>
</optional>
+ <ref name="diskSourceCommon"/>
<optional>
<ref name="storageStartupPolicy"/>
</optional>
startupPolicy = virXMLPropString(cur, "startupPolicy");
+ if (!(flags & VIR_DOMAIN_DEF_PARSE_INACTIVE) &&
+ (tmp = virXMLPropString(cur, "index")) &&
+ virStrToLong_uip(tmp, NULL, 10, &def->src->id) < 0) {
+ virReportError(VIR_ERR_XML_ERROR, _("invalid disk index '%s'"), tmp);
+ goto error;
+ }
+ VIR_FREE(tmp);
} else if (!target &&
virXMLNodeNameEqual(cur, "target")) {
target = virXMLPropString(cur, "dev");
int policy,
unsigned int flags,
bool skipSeclabels,
+ bool attrIndex,
virDomainXMLOptionPtr xmlopt)
{
virBuffer attrBuf = VIR_BUFFER_INITIALIZER;
virBufferEscapeString(&attrBuf, " startupPolicy='%s'",
virDomainStartupPolicyTypeToString(policy));
+ if (attrIndex && src->id != 0)
+ virBufferAsprintf(&attrBuf, " index='%u'", src->id);
+
if (virDomainDiskSourceFormatPrivateData(&childBuf, src, flags, xmlopt) < 0)
goto cleanup;
unsigned int flags,
virDomainXMLOptionPtr xmlopt)
{
- return virDomainDiskSourceFormatInternal(buf, src, policy, flags, false, xmlopt);
+ return virDomainDiskSourceFormatInternal(buf, src, policy, flags, false,
+ false, xmlopt);
}
virBufferAsprintf(buf, "<format type='%s'/>\n", format);
/* We currently don't output seclabels for backing chain element */
- if (virDomainDiskSourceFormatInternal(buf, backingStore, 0, flags, true, xmlopt) < 0 ||
+ if (virDomainDiskSourceFormatInternal(buf, backingStore, 0, flags, true,
+ false, xmlopt) < 0 ||
virDomainDiskBackingStoreFormat(buf, backingStore->backingStore,
xmlopt, flags) < 0)
return -1;
if (def->src->auth && !def->src->authInherited)
virStorageAuthDefFormat(buf, def->src->auth);
- if (virDomainDiskSourceFormat(buf, def->src, def->startupPolicy,
- flags, xmlopt) < 0)
+ if (virDomainDiskSourceFormatInternal(buf, def->src, def->startupPolicy,
+ flags, false, true, xmlopt) < 0)
return -1;
/* Don't format backingStore to inactive XMLs until the code for
<emulator>/usr/bin/qemu-system-i686</emulator>
<disk type='network' device='disk'>
<driver name='qemu' type='qcow2'/>
- <source protocol='gluster' name='Volume2/Image'>
+ <source protocol='gluster' name='Volume2/Image' index='2'>
<host transport='unix' socket='/path/to/sock'/>
</source>
<backingStore type='file' index='1'>
</disk>
<disk type='network' device='disk'>
<driver name='qemu' type='qcow2'/>
- <source protocol='nbd' name='bar'>
+ <source protocol='nbd' name='bar' index='9'>
<host transport='unix' socket='/var/run/nbdsock'/>
</source>
<backingStore type='block' index='8'>
<disk type='network' device='disk'>
<driver name='qemu' type='raw'/>
<backingStore/>
- <source protocol='gluster' name='Volume1/Image'>
+ <source protocol='gluster' name='Volume1/Image' index='10'>
<host name='example.org' port='6000'/>
</source>
<target dev='vdc' bus='virtio'/>
<auth username='myname'>
<secret type='ceph' usage='mycluster_myname'/>
</auth>
- <source protocol='rbd' name='pool/image'>
+ <source protocol='rbd' name='pool/image' index='12'>
<host name='mon1.example.org' port='6321'/>
<host name='mon2.example.org' port='6322'/>
<host name='mon3.example.org' port='6322'/>
</disk>
<disk type='block' device='disk'>
<driver name='qemu' type='qcow2'/>
- <source dev='/dev/HostVG/QEMUGuest11'/>
+ <source dev='/dev/HostVG/QEMUGuest11' index='13'/>
<target dev='vde' bus='virtio'/>
</disk>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
- <source file='/var/lib/libvirt/images/rhel7.1484071880'/>
+ <source file='/var/lib/libvirt/images/rhel7.1484071880' index='25'/>
<backingStore type='file' index='24'>
<format type='qcow2'/>
<source file='/var/lib/libvirt/images/rhel7.1484071877'/>
<emulator>/usr/bin/qemu-system-i686</emulator>
<disk type='network' device='disk'>
<driver name='qemu' type='qcow2'/>
- <source protocol='gluster' name='Volume2/Image'>
+ <source protocol='gluster' name='Volume2/Image' index='2'>
<host transport='unix' socket='/path/to/sock'/>
</source>
<backingStore type='file' index='1'>
</disk>
<disk type='network' device='disk'>
<driver name='qemu' type='qcow2'/>
- <source protocol='nbd' name='bar'>
+ <source protocol='nbd' name='bar' index='9'>
<host transport='unix' socket='/var/run/nbdsock'/>
</source>
<backingStore type='block' index='8'>
</disk>
<disk type='network' device='disk'>
<driver name='qemu' type='raw'/>
- <source protocol='gluster' name='Volume1/Image'>
+ <source protocol='gluster' name='Volume1/Image' index='10'>
<host name='example.org' port='6000'/>
</source>
<backingStore/>
<auth username='myname'>
<secret type='ceph' usage='mycluster_myname'/>
</auth>
- <source protocol='rbd' name='pool/image'>
+ <source protocol='rbd' name='pool/image' index='12'>
<host name='mon1.example.org' port='6321'/>
<host name='mon2.example.org' port='6322'/>
<host name='mon3.example.org' port='6322'/>
</disk>
<disk type='block' device='disk'>
<driver name='qemu' type='qcow2'/>
- <source dev='/dev/HostVG/QEMUGuest11'/>
+ <source dev='/dev/HostVG/QEMUGuest11' index='13'/>
<target dev='vde' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</disk>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
- <source file='/var/lib/libvirt/images/rhel7.1484071880'/>
+ <source file='/var/lib/libvirt/images/rhel7.1484071880' index='25'/>
<backingStore type='file' index='24'>
<format type='qcow2'/>
<source file='/var/lib/libvirt/images/rhel7.1484071877'/>