]> xenbits.xensource.com Git - libvirt.git/commitdiff
Parse backingStore before capacity in volume XML
authorJán Tomko <jtomko@redhat.com>
Tue, 10 Feb 2015 14:10:05 +0000 (15:10 +0100)
committerJán Tomko <jtomko@redhat.com>
Mon, 2 Mar 2015 07:07:11 +0000 (08:07 +0100)
So we can allow omitting the capacity element if backing store is
present.

src/conf/storage_conf.c

index 30908861c91da22bd5b53b5a23deb7abbc628baa..b522a4d5e40d95b5589a8f04f96e08773db6392f 100644 (file)
@@ -1289,6 +1289,37 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool,
         }
     }
 
+    if ((backingStore = virXPathString("string(./backingStore/path)", ctxt))) {
+        if (VIR_ALLOC(ret->target.backingStore) < 0)
+            goto error;
+
+        ret->target.backingStore->path = backingStore;
+        backingStore = NULL;
+
+        if (options->formatFromString) {
+            char *format = virXPathString("string(./backingStore/format/@type)", ctxt);
+            if (format == NULL)
+                ret->target.backingStore->format = options->defaultFormat;
+            else
+                ret->target.backingStore->format = (options->formatFromString)(format);
+
+            if (ret->target.backingStore->format < 0) {
+                virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                               _("unknown volume format type %s"), format);
+                VIR_FREE(format);
+                goto error;
+            }
+            VIR_FREE(format);
+        }
+
+        if (VIR_ALLOC(ret->target.backingStore->perms) < 0)
+            goto error;
+        if (virStorageDefParsePerms(ctxt, ret->target.backingStore->perms,
+                                    "./backingStore/permissions",
+                                    DEFAULT_VOL_PERM_MODE) < 0)
+            goto error;
+    }
+
     capacity = virXPathString("string(./capacity)", ctxt);
     unit = virXPathString("string(./capacity/@unit)", ctxt);
     if (capacity == NULL) {
@@ -1341,37 +1372,6 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool,
             goto error;
     }
 
-    if ((backingStore = virXPathString("string(./backingStore/path)", ctxt))) {
-        if (VIR_ALLOC(ret->target.backingStore) < 0)
-            goto error;
-
-        ret->target.backingStore->path = backingStore;
-        backingStore = NULL;
-
-        if (options->formatFromString) {
-            char *format = virXPathString("string(./backingStore/format/@type)", ctxt);
-            if (format == NULL)
-                ret->target.backingStore->format = options->defaultFormat;
-            else
-                ret->target.backingStore->format = (options->formatFromString)(format);
-
-            if (ret->target.backingStore->format < 0) {
-                virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-                               _("unknown volume format type %s"), format);
-                VIR_FREE(format);
-                goto error;
-            }
-            VIR_FREE(format);
-        }
-
-        if (VIR_ALLOC(ret->target.backingStore->perms) < 0)
-            goto error;
-        if (virStorageDefParsePerms(ctxt, ret->target.backingStore->perms,
-                                    "./backingStore/permissions",
-                                    DEFAULT_VOL_PERM_MODE) < 0)
-            goto error;
-    }
-
     ret->target.compat = virXPathString("string(./target/compat)", ctxt);
     if (ret->target.compat) {
         char **version = virStringSplit(ret->target.compat, ".", 2);