One simple demo: * Edit the disk conf like: <source startupPolicy='optional'/> The output will be like: startupPolicy='optional'/> --- src/conf/domain_conf.c | 36 +++++++++++++++++++++--------------- 1 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 9f61c57..7b08b69 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -12249,11 +12249,14 @@ virDomainDiskSourceDefFormat(virBufferPtr buf, def->startupPolicy) { switch (def->type) { case VIR_DOMAIN_DISK_TYPE_FILE: + if (def->src || def->startupPolicy || def->nseclabels) + virBufferAddLit(buf, " <source"); + if (def->src) - virBufferEscapeString(buf, " <source file='%s'", def->src); + virBufferEscapeString(buf, " file='%s'", def->src); if (def->startupPolicy) - virBufferEscapeString(buf, " startupPolicy='%s'", - startupPolicy); + virBufferEscapeString(buf, " startupPolicy='%s'", startupPolicy); + if (def->nseclabels) { virBufferAddLit(buf, ">\n"); virBufferAdjustIndent(buf, 8); @@ -12261,13 +12264,16 @@ virDomainDiskSourceDefFormat(virBufferPtr buf, virSecurityDeviceLabelDefFormat(buf, def->seclabels[n]); virBufferAdjustIndent(buf, -8); virBufferAddLit(buf, " </source>\n"); - } else { + } else if (def->src || def->startupPolicy) { virBufferAddLit(buf, "/>\n"); } break; case VIR_DOMAIN_DISK_TYPE_BLOCK: - virBufferEscapeString(buf, " <source dev='%s'", - def->src); + if (def->src || def->nseclabels) + virBufferAddLit(buf, " <source"); + + virBufferEscapeString(buf, " dev='%s'", def->src); + if (def->nseclabels) { virBufferAddLit(buf, ">\n"); virBufferAdjustIndent(buf, 8); @@ -12275,13 +12281,12 @@ virDomainDiskSourceDefFormat(virBufferPtr buf, virSecurityDeviceLabelDefFormat(buf, def->seclabels[n]); virBufferAdjustIndent(buf, -8); virBufferAddLit(buf, " </source>\n"); - } else { + } else if (def->src) { virBufferAddLit(buf, "/>\n"); } break; case VIR_DOMAIN_DISK_TYPE_DIR: - virBufferEscapeString(buf, " <source dir='%s'/>\n", - def->src); + virBufferEscapeString(buf, " <source dir='%s'/>\n", def->src); break; case VIR_DOMAIN_DISK_TYPE_NETWORK: virBufferAsprintf(buf, " <source protocol='%s'", @@ -12317,15 +12322,16 @@ virDomainDiskSourceDefFormat(virBufferPtr buf, } break; case VIR_DOMAIN_DISK_TYPE_VOLUME: - /* Parsing guarantees the def->srcpool->volume cannot be NULL - * if def->srcpool->pool is not NULL. - */ + if (def->srcpool || def->startupPolicy) + virBufferAddLit(buf, " <source"); + if (def->srcpool) - virBufferAsprintf(buf, " <source pool='%s' volume='%s'", + virBufferAsprintf(buf, " pool='%s' volume='%s'", def->srcpool->pool, def->srcpool->volume); if (def->startupPolicy) - virBufferEscapeString(buf, " startupPolicy='%s'/>\n", startupPolicy); - else + virBufferEscapeString(buf, " startupPolicy='%s'", startupPolicy); + + if (def->srcpool || def->startupPolicy) virBufferAddLit(buf, "/>\n"); break; default: -- 1.7.7.6 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list