]> xenbits.xensource.com Git - libvirt.git/commitdiff
storage: fs: Properly parse backing store info
authorPeter Krempa <pkrempa@redhat.com>
Tue, 15 Jul 2014 12:33:23 +0000 (14:33 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Wed, 16 Jul 2014 09:42:51 +0000 (11:42 +0200)
Use the backing store parser to properly create the information about a
volume's backing store. Unfortunately as the storage driver isn't
prepared to allow volumes backed by networked filesystems add a
workaround that will avoid changing the XML output.

src/storage/storage_backend_fs.c

index ed4917deaa1c8a07b1e882aa5c291eef83d2a267..32471a76aacf06f9426ef2dff8e128a4a724e14e 100644 (file)
@@ -96,16 +96,28 @@ virStorageBackendProbeTarget(virStorageSourcePtr target,
         goto cleanup;
 
     if (meta->backingStoreRaw) {
-        if (VIR_ALLOC(target->backingStore) < 0)
+        if (!(target->backingStore = virStorageSourceNewFromBacking(meta)))
             goto cleanup;
 
-        target->backingStore->path = meta->backingStoreRaw;
-        meta->backingStoreRaw = NULL;
         target->backingStore->format = backingStoreFormat;
 
+        /* XXX: Remote storage doesn't play nicely with volumes backed by
+         * remote storage. To avoid trouble, just fake the backing store is RAW
+         * and put the string from the metadata as the path of the target. */
+        if (!virStorageSourceIsLocalStorage(target->backingStore)) {
+            virStorageSourceFree(target->backingStore);
+
+            if (VIR_ALLOC(target->backingStore) < 0)
+                goto cleanup;
+
+            target->backingStore->type = VIR_STORAGE_TYPE_NETWORK;
+            target->backingStore->path = meta->backingStoreRaw;
+            meta->backingStoreRaw = NULL;
+            target->backingStore->format = VIR_STORAGE_FILE_RAW;
+        }
+
         if (target->backingStore->format == VIR_STORAGE_FILE_AUTO) {
-            if (!virStorageIsFile(target->backingStore->path) ||
-                (rc = virStorageFileProbeFormat(target->backingStore->path,
+            if ((rc = virStorageFileProbeFormat(target->backingStore->path,
                                                 -1, -1)) < 0) {
                 /* If the backing file is currently unavailable or is
                  * accessed via remote protocol only log an error, fake the