From 933e0aeebdbdc2932a1b11ce338c67bb163268f5 Mon Sep 17 00:00:00 2001 Message-Id: <933e0aeebdbdc2932a1b11ce338c67bb163268f5.1377873637.git.jdenemar@redhat.com> From: Guannan Ren Date: Thu, 8 Aug 2013 16:07:29 +0800 Subject: [PATCH] conf: add startupPolicy attribute for harddisk Resovles: https://bugzilla.redhat.com/show_bug.cgi?id=910171 (cherry picked from commit 93319da42cd1a23245577dda244998f1ff725703) Add startupPolicy attribute for harddisk with type "file", "block" and "dir". 'requisite' is not supported currently for harddisk. --- docs/formatdomain.html.in | 8 ++++++-- docs/schemas/domaincommon.rng | 6 ++++++ src/conf/domain_conf.c | 31 +++++++++++++++++++++++-------- 3 files changed, 35 insertions(+), 10 deletions(-) diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 562d991..fb7d671 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -1620,7 +1620,8 @@ policy what to do with the disk if the source file is not accessible. (NB, startupPolicy is not valid for "volume" disk unless the specified storage volume is of "file" type). This is done by the - startupPolicy attribute, accepting these values: + startupPolicy attribute (Since 0.9.7), + accepting these values: @@ -1636,7 +1637,10 @@
mandatory drop if missing at any start attempt
- Since 0.9.7 + Since 1.1.2 the startupPolicy is extended + to support hard disks besides cdrom and floppy. On guest cold bootup, if a certain disk + is not accessible or its disk chain is broken, with startupPolicy 'optional' the guest + will drop this disk. This feature doesn't support migration currently.
mirror
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 173359c..ac807e6 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -1124,6 +1124,9 @@ + + + @@ -1141,6 +1144,9 @@ + + + diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index f46b17e..01f9bd0 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -4796,7 +4796,6 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt, switch (def->type) { case VIR_DOMAIN_DISK_TYPE_FILE: source = virXMLPropString(cur, "file"); - startupPolicy = virXMLPropString(cur, "startupPolicy"); break; case VIR_DOMAIN_DISK_TYPE_BLOCK: source = virXMLPropString(cur, "dev"); @@ -4883,7 +4882,6 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt, case VIR_DOMAIN_DISK_TYPE_VOLUME: if (virDomainDiskSourcePoolDefParse(cur, def) < 0) goto error; - startupPolicy = virXMLPropString(cur, "startupPolicy"); break; default: virReportError(VIR_ERR_INTERNAL_ERROR, @@ -4892,6 +4890,8 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt, goto error; } + startupPolicy = virXMLPropString(cur, "startupPolicy"); + /* People sometimes pass a bogus '' source path when they mean to omit the source element completely (e.g. CDROM without media). This is @@ -5464,14 +5464,22 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt, goto error; } - if (def->device != VIR_DOMAIN_DISK_DEVICE_CDROM && - def->device != VIR_DOMAIN_DISK_DEVICE_FLOPPY) { - virReportError(VIR_ERR_INVALID_ARG, - _("Setting disk %s is allowed only for " - "cdrom or floppy"), + if (def->type == VIR_DOMAIN_DISK_TYPE_NETWORK) { + virReportError(VIR_ERR_XML_ERROR, + _("Setting disk %s is not allowed for " + "disk of network type"), startupPolicy); goto error; } + + if (def->device != VIR_DOMAIN_DISK_DEVICE_CDROM && + def->device != VIR_DOMAIN_DISK_DEVICE_FLOPPY && + val == VIR_DOMAIN_STARTUP_POLICY_REQUISITE) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("Setting disk 'requisite' is allowed only for " + "cdrom or floppy")); + goto error; + } def->startupPolicy = val; } @@ -14121,6 +14129,9 @@ virDomainDiskSourceDefFormat(virBufferPtr buf, case VIR_DOMAIN_DISK_TYPE_BLOCK: virBufferEscapeString(buf, " src); + if (def->startupPolicy) + virBufferEscapeString(buf, " startupPolicy='%s'", + startupPolicy); if (def->nseclabels) { virBufferAddLit(buf, ">\n"); virBufferAdjustIndent(buf, 8); @@ -14133,8 +14144,12 @@ virDomainDiskSourceDefFormat(virBufferPtr buf, } break; case VIR_DOMAIN_DISK_TYPE_DIR: - virBufferEscapeString(buf, " \n", + virBufferEscapeString(buf, " src); + if (def->startupPolicy) + virBufferEscapeString(buf, " startupPolicy='%s'", + startupPolicy); + virBufferAddLit(buf, "/>\n"); break; case VIR_DOMAIN_DISK_TYPE_NETWORK: virBufferAsprintf(buf, "