]> xenbits.xensource.com Git - people/dariof/libvirt.git/commitdiff
conf: add startupPolicy attribute for harddisk
authorGuannan Ren <gren@redhat.com>
Wed, 31 Jul 2013 07:51:44 +0000 (15:51 +0800)
committerGuannan Ren <gren@redhat.com>
Wed, 7 Aug 2013 06:31:34 +0000 (14:31 +0800)
Add startupPolicy attribute for harddisk with type "file",
"block" and "dir". 'requisite' is not supported currently for
harddisk.

docs/formatdomain.html.in
docs/schemas/domaincommon.rng
src/conf/domain_conf.c

index 9d95b7743bf55b4084dc8704b7031666f940e285..dd22b6d0c62926f94d5dbed5930e3817afd59673 100644 (file)
         policy what to do with the disk if the source file is not accessible.
         (NB, <code>startupPolicy</code> is not valid for "volume" disk unless
          the specified storage volume is of "file" type). This is done by the
-        <code>startupPolicy</code> attribute, accepting these values:
+        <code>startupPolicy</code> attribute (<span class="since">Since 0.9.7</span>),
+        accepting these values:
         <table class="top_table">
           <tr>
             <td> mandatory </td>
             <td> drop if missing at any start attempt </td>
           </tr>
         </table>
-        <span class="since">Since 0.9.7</span>
+        <span class="since">Since 1.1.2</span> the <code>startupPolicy</code> 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.
         </dd>
       <dt><code>mirror</code></dt>
       <dd>
index 173359cf89ad1dbd9bb4c8c57c54f8f40554982e..ac807e6caf0f3ea67ef990937d9d048dd386e6c3 100644 (file)
                 <attribute name="dev">
                   <ref name="absFilePath"/>
                 </attribute>
+                <optional>
+                  <ref name="startupPolicy"/>
+                </optional>
                 <optional>
                   <ref name='devSeclabel'/>
                 </optional>
                 <attribute name="dir">
                   <ref name="absFilePath"/>
                 </attribute>
+                <optional>
+                  <ref name="startupPolicy"/>
+                </optional>
                 <empty/>
               </element>
             </optional>
index d17008fc961b20b1ba4a4d9ac153c34494c7c27e..73098776d872d853aa4c40c5955e806e8c291509 100644 (file)
@@ -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, "      <source dev='%s'",
                                   def->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, "      <source dir='%s'/>\n",
+            virBufferEscapeString(buf, "      <source dir='%s'",
                                   def->src);
+            if (def->startupPolicy)
+                virBufferEscapeString(buf, " startupPolicy='%s'",
+                                      startupPolicy);
+            virBufferAddLit(buf, "/>\n");
             break;
         case VIR_DOMAIN_DISK_TYPE_NETWORK:
             virBufferAsprintf(buf, "      <source protocol='%s'",