[libvirt] [PATCH] storage: expose volume meta-type in XML

I got annoyed at having to use both 'virsh vol-list $pool --details' AND 'virsh vol-dumpxml $vol $pool' to learn if I had populated the volume correctly. Since two-thirds of the data present in virStorageVolGetInfo() already appears in virStorageVolGetXMLDesc(), this just adds the remaining piece of information. * docs/formatstorage.html.in: Document new <target type=...>. * docs/schemas/storagevol.rng (target, backingStore): Add it to RelaxNG. * src/conf/storage_conf.h (virStorageVolTypeToString): Declare. * src/conf/storage_conf.c (virStorageVolTargetDefFormat): Output the metatype. * tests/storagevolxml2xmlout/vol-*.xml: Update tests to match. Signed-off-by: Eric Blake <eblake@redhat.com> --- Depends on: https://www.redhat.com/archives/libvir-list/2013-November/msg00948.html docs/formatstorage.html.in | 5 +++++ docs/schemas/storagevol.rng | 15 +++++++++++++++ src/conf/storage_conf.c | 18 ++++++++++++++++++ src/conf/storage_conf.h | 1 + tests/storagevolxml2xmlin/vol-logical-backing.xml | 1 + tests/storagevolxml2xmlin/vol-logical.xml | 1 + tests/storagevolxml2xmlin/vol-partition.xml | 1 + tests/storagevolxml2xmlin/vol-sheepdog.xml | 1 + tests/storagevolxml2xmlout/vol-file-backing.xml | 1 + tests/storagevolxml2xmlout/vol-file-naming.xml | 1 + tests/storagevolxml2xmlout/vol-file.xml | 1 + tests/storagevolxml2xmlout/vol-logical-backing.xml | 1 + tests/storagevolxml2xmlout/vol-logical.xml | 1 + tests/storagevolxml2xmlout/vol-partition.xml | 1 + tests/storagevolxml2xmlout/vol-qcow2-0.10-lazy.xml | 1 + tests/storagevolxml2xmlout/vol-qcow2-1.1.xml | 1 + tests/storagevolxml2xmlout/vol-qcow2-lazy.xml | 1 + tests/storagevolxml2xmlout/vol-qcow2-nobacking.xml | 1 + tests/storagevolxml2xmlout/vol-qcow2.xml | 1 + tests/storagevolxml2xmlout/vol-sheepdog.xml | 1 + 20 files changed, 55 insertions(+) diff --git a/docs/formatstorage.html.in b/docs/formatstorage.html.in index 90eeaa3..5f277b4 100644 --- a/docs/formatstorage.html.in +++ b/docs/formatstorage.html.in @@ -293,6 +293,7 @@ <volume> <name>sparse.img</name> <key>/var/lib/xen/images/sparse.img</key> + <type>file</type> <allocation>0</allocation> <capacity unit="T">1</capacity> ...</pre> @@ -305,6 +306,10 @@ <dd>Providing an identifier for the volume which is globally unique. This cannot be set when creating a volume: it is always generated. <span class="since">Since 0.4.1</span></dd> + <dt><code>type</code></dt> + <dd>Output-only; provides the volume type that is also available + from <code>virStorageVolGetInfo()</code>. <span class="since">Since + 1.1.5</span></dd> <dt><code>allocation</code></dt> <dd>Providing the total storage allocation for the volume. This may be smaller than the logical capacity if the volume is sparsely diff --git a/docs/schemas/storagevol.rng b/docs/schemas/storagevol.rng index e79bc35..96572c5 100644 --- a/docs/schemas/storagevol.rng +++ b/docs/schemas/storagevol.rng @@ -25,6 +25,9 @@ <optional> <ref name='source'/> </optional> + <optional> + <ref name='voltype'/> + </optional> <ref name='sizing'/> <ref name='target'/> <optional> @@ -34,6 +37,18 @@ </element> </define> + <define name='voltype'> + <element name='type'> + <choice> + <value>file</value> + <value>block</value> + <value>dir</value> + <value>network</value> + <value>network-dir</value> + </choice> + </element> + </define> + <define name='sizing'> <interleave> <optional> diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c index 8b378c2..0d2932b 100644 --- a/src/conf/storage_conf.c +++ b/src/conf/storage_conf.c @@ -51,6 +51,10 @@ #define DEFAULT_POOL_PERM_MODE 0755 #define DEFAULT_VOL_PERM_MODE 0600 +VIR_ENUM_IMPL(virStorageVol, + VIR_STORAGE_VOL_LAST, + "file", "block", "dir", "network") + VIR_ENUM_IMPL(virStoragePool, VIR_STORAGE_POOL_LAST, "dir", "fs", "netfs", @@ -1253,6 +1257,7 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool, { virStorageVolDefPtr ret; virStorageVolOptionsPtr options; + char *type = NULL; char *allocation = NULL; char *capacity = NULL; char *unit = NULL; @@ -1278,6 +1283,16 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool, /* Normally generated by pool refresh, but useful for unit tests */ ret->key = virXPathString("string(./key)", ctxt); + /* Technically overridden by pool refresh, but useful for unit tests */ + type = virXPathString("string(./type)", ctxt); + if (type) { + if ((ret->type = virStorageVolTypeFromString(type)) < 0) { + virReportError(VIR_ERR_XML_ERROR, + _("unknown volume type '%s'"), type); + goto error; + } + } + capacity = virXPathString("string(./capacity)", ctxt); unit = virXPathString("string(./capacity/@unit)", ctxt); if (capacity == NULL) { @@ -1394,6 +1409,7 @@ cleanup: VIR_FREE(allocation); VIR_FREE(capacity); VIR_FREE(unit); + VIR_FREE(type); return ret; error: @@ -1592,6 +1608,8 @@ virStorageVolDefFormat(virStoragePoolDefPtr pool, } virBufferAddLit(&buf, " </source>\n"); + virBufferAsprintf(&buf, " <type>%s</type>\n", + virStorageVolTypeToString(def->type)); virBufferAsprintf(&buf, " <capacity unit='bytes'>%llu</capacity>\n", def->capacity); virBufferAsprintf(&buf, " <allocation unit='bytes'>%llu</allocation>\n", diff --git a/src/conf/storage_conf.h b/src/conf/storage_conf.h index f062bd8..c4dd403 100644 --- a/src/conf/storage_conf.h +++ b/src/conf/storage_conf.h @@ -116,6 +116,7 @@ struct _virStorageVolDefList { virStorageVolDefPtr *objs; }; +VIR_ENUM_DECL(virStorageVol) enum virStoragePoolType { VIR_STORAGE_POOL_DIR, /* Local directory */ diff --git a/tests/storagevolxml2xmlin/vol-logical-backing.xml b/tests/storagevolxml2xmlin/vol-logical-backing.xml index b4141a5..d1a7b61 100644 --- a/tests/storagevolxml2xmlin/vol-logical-backing.xml +++ b/tests/storagevolxml2xmlin/vol-logical-backing.xml @@ -6,6 +6,7 @@ <extent start='31440502784' end='33520877568'/> </device> </source> + <type>block</type> <capacity>2080374784</capacity> <allocation>2080374784</allocation> <target> diff --git a/tests/storagevolxml2xmlin/vol-logical.xml b/tests/storagevolxml2xmlin/vol-logical.xml index cd4d3f7..f98ff76 100644 --- a/tests/storagevolxml2xmlin/vol-logical.xml +++ b/tests/storagevolxml2xmlin/vol-logical.xml @@ -6,6 +6,7 @@ <extent start='31440502784' end='33520877568'/> </device> </source> + <type>block</type> <capacity>2080374784</capacity> <allocation>2080374784</allocation> <target> diff --git a/tests/storagevolxml2xmlin/vol-partition.xml b/tests/storagevolxml2xmlin/vol-partition.xml index 6990bb5..d699635 100644 --- a/tests/storagevolxml2xmlin/vol-partition.xml +++ b/tests/storagevolxml2xmlin/vol-partition.xml @@ -6,6 +6,7 @@ <extent start='32256' end='106928640'/> </device> </source> + <type>block</type> <capacity>106896384</capacity> <allocation>106896384</allocation> <target> diff --git a/tests/storagevolxml2xmlin/vol-sheepdog.xml b/tests/storagevolxml2xmlin/vol-sheepdog.xml index 49e221c..64884b2 100644 --- a/tests/storagevolxml2xmlin/vol-sheepdog.xml +++ b/tests/storagevolxml2xmlin/vol-sheepdog.xml @@ -2,6 +2,7 @@ <name>test2</name> <source> </source> + <type>network</type> <capacity unit='bytes'>1024</capacity> <allocation unit='bytes'>0</allocation> <target> diff --git a/tests/storagevolxml2xmlout/vol-file-backing.xml b/tests/storagevolxml2xmlout/vol-file-backing.xml index 8d2fb57..ca0598d 100644 --- a/tests/storagevolxml2xmlout/vol-file-backing.xml +++ b/tests/storagevolxml2xmlout/vol-file-backing.xml @@ -3,6 +3,7 @@ <key>/var/lib/libvirt/images/sparse.img</key> <source> </source> + <type>file</type> <capacity unit='bytes'>10000000000</capacity> <allocation unit='bytes'>0</allocation> <target> diff --git a/tests/storagevolxml2xmlout/vol-file-naming.xml b/tests/storagevolxml2xmlout/vol-file-naming.xml index 7022b02..4ca40ba 100644 --- a/tests/storagevolxml2xmlout/vol-file-naming.xml +++ b/tests/storagevolxml2xmlout/vol-file-naming.xml @@ -2,6 +2,7 @@ <name><sparse>.img</name> <source> </source> + <type>file</type> <capacity unit='bytes'>1099511627776</capacity> <allocation unit='bytes'>0</allocation> <target> diff --git a/tests/storagevolxml2xmlout/vol-file.xml b/tests/storagevolxml2xmlout/vol-file.xml index b97dd50..05ffa49 100644 --- a/tests/storagevolxml2xmlout/vol-file.xml +++ b/tests/storagevolxml2xmlout/vol-file.xml @@ -2,6 +2,7 @@ <name>sparse.img</name> <source> </source> + <type>file</type> <capacity unit='bytes'>1099511627776</capacity> <allocation unit='bytes'>0</allocation> <target> diff --git a/tests/storagevolxml2xmlout/vol-logical-backing.xml b/tests/storagevolxml2xmlout/vol-logical-backing.xml index bf34b08..5f52ee6 100644 --- a/tests/storagevolxml2xmlout/vol-logical-backing.xml +++ b/tests/storagevolxml2xmlout/vol-logical-backing.xml @@ -3,6 +3,7 @@ <key>r4xkCv-MQhr-WKIT-R66x-Epn2-e8hG-1Z5gY0</key> <source> </source> + <type>block</type> <capacity unit='bytes'>2080374784</capacity> <allocation unit='bytes'>2080374784</allocation> <target> diff --git a/tests/storagevolxml2xmlout/vol-logical.xml b/tests/storagevolxml2xmlout/vol-logical.xml index e9b4e4b..f8ed510 100644 --- a/tests/storagevolxml2xmlout/vol-logical.xml +++ b/tests/storagevolxml2xmlout/vol-logical.xml @@ -3,6 +3,7 @@ <key>r4xkCv-MQhr-WKIT-R66x-Epn2-e8hG-1Z5gY0</key> <source> </source> + <type>block</type> <capacity unit='bytes'>2080374784</capacity> <allocation unit='bytes'>2080374784</allocation> <target> diff --git a/tests/storagevolxml2xmlout/vol-partition.xml b/tests/storagevolxml2xmlout/vol-partition.xml index 9be1cf1..712b7b0 100644 --- a/tests/storagevolxml2xmlout/vol-partition.xml +++ b/tests/storagevolxml2xmlout/vol-partition.xml @@ -3,6 +3,7 @@ <key>/dev/sda1</key> <source> </source> + <type>block</type> <capacity unit='bytes'>106896384</capacity> <allocation unit='bytes'>106896384</allocation> <target> diff --git a/tests/storagevolxml2xmlout/vol-qcow2-0.10-lazy.xml b/tests/storagevolxml2xmlout/vol-qcow2-0.10-lazy.xml index fd3d606..3447689 100644 --- a/tests/storagevolxml2xmlout/vol-qcow2-0.10-lazy.xml +++ b/tests/storagevolxml2xmlout/vol-qcow2-0.10-lazy.xml @@ -3,6 +3,7 @@ <key>/var/lib/libvirt/images/OtherDemo.img</key> <source> </source> + <type>file</type> <capacity unit='bytes'>5368709120</capacity> <allocation unit='bytes'>294912</allocation> <target> diff --git a/tests/storagevolxml2xmlout/vol-qcow2-1.1.xml b/tests/storagevolxml2xmlout/vol-qcow2-1.1.xml index 99fb5ac..4157628 100644 --- a/tests/storagevolxml2xmlout/vol-qcow2-1.1.xml +++ b/tests/storagevolxml2xmlout/vol-qcow2-1.1.xml @@ -3,6 +3,7 @@ <key>/var/lib/libvirt/images/OtherDemo.img</key> <source> </source> + <type>file</type> <capacity unit='bytes'>5368709120</capacity> <allocation unit='bytes'>294912</allocation> <target> diff --git a/tests/storagevolxml2xmlout/vol-qcow2-lazy.xml b/tests/storagevolxml2xmlout/vol-qcow2-lazy.xml index 3708ea7..7b29c02 100644 --- a/tests/storagevolxml2xmlout/vol-qcow2-lazy.xml +++ b/tests/storagevolxml2xmlout/vol-qcow2-lazy.xml @@ -3,6 +3,7 @@ <key>/var/lib/libvirt/images/OtherDemo.img</key> <source> </source> + <type>file</type> <capacity unit='bytes'>5368709120</capacity> <allocation unit='bytes'>294912</allocation> <target> diff --git a/tests/storagevolxml2xmlout/vol-qcow2-nobacking.xml b/tests/storagevolxml2xmlout/vol-qcow2-nobacking.xml index f6a2e21..ebf79ed 100644 --- a/tests/storagevolxml2xmlout/vol-qcow2-nobacking.xml +++ b/tests/storagevolxml2xmlout/vol-qcow2-nobacking.xml @@ -3,6 +3,7 @@ <key>/var/lib/libvirt/images/OtherDemo.img</key> <source> </source> + <type>file</type> <capacity unit='bytes'>5368709120</capacity> <allocation unit='bytes'>294912</allocation> <target> diff --git a/tests/storagevolxml2xmlout/vol-qcow2.xml b/tests/storagevolxml2xmlout/vol-qcow2.xml index b9adcb4..75f0dcf 100644 --- a/tests/storagevolxml2xmlout/vol-qcow2.xml +++ b/tests/storagevolxml2xmlout/vol-qcow2.xml @@ -3,6 +3,7 @@ <key>/var/lib/libvirt/images/OtherDemo.img</key> <source> </source> + <type>file</type> <capacity unit='bytes'>5368709120</capacity> <allocation unit='bytes'>294912</allocation> <target> diff --git a/tests/storagevolxml2xmlout/vol-sheepdog.xml b/tests/storagevolxml2xmlout/vol-sheepdog.xml index bd5d6d8..182c841 100644 --- a/tests/storagevolxml2xmlout/vol-sheepdog.xml +++ b/tests/storagevolxml2xmlout/vol-sheepdog.xml @@ -2,6 +2,7 @@ <name>test2</name> <source> </source> + <type>network</type> <capacity unit='bytes'>1024</capacity> <allocation unit='bytes'>0</allocation> <target> -- 1.8.3.1

On 23/11/13 06:26, Eric Blake wrote:
I got annoyed at having to use both 'virsh vol-list $pool --details' AND 'virsh vol-dumpxml $vol $pool' to learn if I had populated the volume correctly. Since two-thirds of the data present in virStorageVolGetInfo() already appears in virStorageVolGetXMLDesc(), this just adds the remaining piece of information.
* docs/formatstorage.html.in: Document new <target type=...>.
I didn't see it relates with "target".
* docs/schemas/storagevol.rng (target, backingStore): Add it to RelaxNG.
I thought "(target, backingStore)" means add "type" to both of them. Finally see it means "between" :-)
* src/conf/storage_conf.h (virStorageVolTypeToString): Declare. * src/conf/storage_conf.c (virStorageVolTargetDefFormat): Output the metatype. * tests/storagevolxml2xmlout/vol-*.xml: Update tests to match.
Signed-off-by: Eric Blake <eblake@redhat.com> ---
Depends on: https://www.redhat.com/archives/libvir-list/2013-November/msg00948.html
docs/formatstorage.html.in | 5 +++++ docs/schemas/storagevol.rng | 15 +++++++++++++++ src/conf/storage_conf.c | 18 ++++++++++++++++++ src/conf/storage_conf.h | 1 + tests/storagevolxml2xmlin/vol-logical-backing.xml | 1 + tests/storagevolxml2xmlin/vol-logical.xml | 1 + tests/storagevolxml2xmlin/vol-partition.xml | 1 + tests/storagevolxml2xmlin/vol-sheepdog.xml | 1 + tests/storagevolxml2xmlout/vol-file-backing.xml | 1 + tests/storagevolxml2xmlout/vol-file-naming.xml | 1 + tests/storagevolxml2xmlout/vol-file.xml | 1 + tests/storagevolxml2xmlout/vol-logical-backing.xml | 1 + tests/storagevolxml2xmlout/vol-logical.xml | 1 + tests/storagevolxml2xmlout/vol-partition.xml | 1 + tests/storagevolxml2xmlout/vol-qcow2-0.10-lazy.xml | 1 + tests/storagevolxml2xmlout/vol-qcow2-1.1.xml | 1 + tests/storagevolxml2xmlout/vol-qcow2-lazy.xml | 1 + tests/storagevolxml2xmlout/vol-qcow2-nobacking.xml | 1 + tests/storagevolxml2xmlout/vol-qcow2.xml | 1 + tests/storagevolxml2xmlout/vol-sheepdog.xml | 1 + 20 files changed, 55 insertions(+)
diff --git a/docs/formatstorage.html.in b/docs/formatstorage.html.in index 90eeaa3..5f277b4 100644 --- a/docs/formatstorage.html.in +++ b/docs/formatstorage.html.in @@ -293,6 +293,7 @@ <volume> <name>sparse.img</name> <key>/var/lib/xen/images/sparse.img</key> + <type>file</type> <allocation>0</allocation> <capacity unit="T">1</capacity> ...</pre> @@ -305,6 +306,10 @@ <dd>Providing an identifier for the volume which is globally unique. This cannot be set when creating a volume: it is always generated. <span class="since">Since 0.4.1</span></dd> + <dt><code>type</code></dt> + <dd>Output-only; provides the volume type that is also available + from <code>virStorageVolGetInfo()</code>. <span class="since">Since
I think it's better to mention "virsh vol-list $pool --details" instead of the API name here, as we did across the documents. I'm fine if you keep it though.
+ 1.1.5</span></dd> <dt><code>allocation</code></dt> <dd>Providing the total storage allocation for the volume. This may be smaller than the logical capacity if the volume is sparsely diff --git a/docs/schemas/storagevol.rng b/docs/schemas/storagevol.rng index e79bc35..96572c5 100644 --- a/docs/schemas/storagevol.rng +++ b/docs/schemas/storagevol.rng @@ -25,6 +25,9 @@ <optional> <ref name='source'/> </optional> + <optional> + <ref name='voltype'/> + </optional> <ref name='sizing'/> <ref name='target'/> <optional> @@ -34,6 +37,18 @@ </element> </define>
+ <define name='voltype'> + <element name='type'> + <choice> + <value>file</value> + <value>block</value> + <value>dir</value> + <value>network</value> + <value>network-dir</value>
What's "network-dir" type? the type you will introduce in the glusterfs series? It's not in the git head yet. So either you will need to remove it, or push this patch after the glusterfs series.
+ </choice> + </element> + </define> + <define name='sizing'> <interleave> <optional> diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c index 8b378c2..0d2932b 100644 --- a/src/conf/storage_conf.c +++ b/src/conf/storage_conf.c @@ -51,6 +51,10 @@ #define DEFAULT_POOL_PERM_MODE 0755 #define DEFAULT_VOL_PERM_MODE 0600
+VIR_ENUM_IMPL(virStorageVol, + VIR_STORAGE_VOL_LAST, + "file", "block", "dir", "network")
Here the "network-dir" type is not included though. So I guess you want to push this patch before the glusterfs series. ACK if the "network-dir" is removed.

On 11/24/2013 09:57 PM, Osier Yang wrote:
On 23/11/13 06:26, Eric Blake wrote:
I got annoyed at having to use both 'virsh vol-list $pool --details' AND 'virsh vol-dumpxml $vol $pool' to learn if I had populated the volume correctly. Since two-thirds of the data present in virStorageVolGetInfo() already appears in virStorageVolGetXMLDesc(), this just adds the remaining piece of information.
* docs/formatstorage.html.in: Document new <target type=...>.
I didn't see it relates with "target".
* docs/schemas/storagevol.rng (target, backingStore): Add it to RelaxNG.
I thought "(target, backingStore)" means add "type" to both of them. Finally see it means "between" :-)
Blah; stale commit comments. I'll fix them as part of addressing Dan's comment.
+ <dt><code>type</code></dt> + <dd>Output-only; provides the volume type that is also available + from <code>virStorageVolGetInfo()</code>. <span class="since">Since
I think it's better to mention "virsh vol-list $pool --details" instead of the API name here, as we did across the documents. I'm fine if you keep it though.
The API name is more useful to anyone using bindings and not virsh. I'll keep it with the API name.
+VIR_ENUM_IMPL(virStorageVol, + VIR_STORAGE_VOL_LAST, + "file", "block", "dir", "network")
Here the "network-dir" type is not included though. So I guess you want to push this patch before the glusterfs series.
ACK if the "network-dir" is removed.
Indeed, I messed up in my rebasing. network-dir is not supposed to be present in this patch. v2 coming up. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

On Fri, Nov 22, 2013 at 03:26:11PM -0700, Eric Blake wrote:
I got annoyed at having to use both 'virsh vol-list $pool --details' AND 'virsh vol-dumpxml $vol $pool' to learn if I had populated the volume correctly. Since two-thirds of the data present in virStorageVolGetInfo() already appears in virStorageVolGetXMLDesc(), this just adds the remaining piece of information.
* docs/formatstorage.html.in: Document new <target type=...>. * docs/schemas/storagevol.rng (target, backingStore): Add it to RelaxNG. * src/conf/storage_conf.h (virStorageVolTypeToString): Declare. * src/conf/storage_conf.c (virStorageVolTargetDefFormat): Output the metatype. * tests/storagevolxml2xmlout/vol-*.xml: Update tests to match.
Signed-off-by: Eric Blake <eblake@redhat.com> ---
diff --git a/tests/storagevolxml2xmlin/vol-logical-backing.xml b/tests/storagevolxml2xmlin/vol-logical-backing.xml index b4141a5..d1a7b61 100644 --- a/tests/storagevolxml2xmlin/vol-logical-backing.xml +++ b/tests/storagevolxml2xmlin/vol-logical-backing.xml @@ -6,6 +6,7 @@ <extent start='31440502784' end='33520877568'/> </device> </source> + <type>block</type> <capacity>2080374784</capacity> <allocation>2080374784</allocation> <target>
I think I'd be more inclined to have a top level attribute eg <volume type=block> ... <volume> Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

On 11/25/2013 03:41 AM, Daniel P. Berrange wrote:
On Fri, Nov 22, 2013 at 03:26:11PM -0700, Eric Blake wrote:
I got annoyed at having to use both 'virsh vol-list $pool --details' AND 'virsh vol-dumpxml $vol $pool' to learn if I had populated the volume correctly. Since two-thirds of the data present in virStorageVolGetInfo() already appears in virStorageVolGetXMLDesc(), this just adds the remaining piece of information.
* docs/formatstorage.html.in: Document new <target type=...>. * docs/schemas/storagevol.rng (target, backingStore): Add it to RelaxNG. * src/conf/storage_conf.h (virStorageVolTypeToString): Declare. * src/conf/storage_conf.c (virStorageVolTargetDefFormat): Output the metatype. * tests/storagevolxml2xmlout/vol-*.xml: Update tests to match.
Signed-off-by: Eric Blake <eblake@redhat.com> ---
I think I'd be more inclined to have a top level attribute eg
<volume type=block>
I debated about that, but your answer swayed me. Consider it done, v2 coming up. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org
participants (3)
-
Daniel P. Berrange
-
Eric Blake
-
Osier Yang