From: Peter Krempa Date: Tue, 15 Jul 2014 12:33:23 +0000 (+0200) Subject: storage: fs: Properly parse backing store info X-Git-Tag: v1.2.7-rc1~114 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dc2943579ff6ba167206b43667b32ecc419da0ac;p=thirdparty%2Flibvirt.git storage: fs: Properly parse backing store info 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. --- diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c index ed4917deaa..32471a76aa 100644 --- a/src/storage/storage_backend_fs.c +++ b/src/storage/storage_backend_fs.c @@ -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