File libvirt-storage-fix-broken-backing-chain.patch of Package libvirt

From cc93398508255427c2171a9a5373d3b11b036f34 Mon Sep 17 00:00:00 2001
Message-Id: <cc93398508255427c2171a9a5373d3b11b036f34.1353330051.git.jdenemar@redhat.com>
From: Philipp Hahn <hahn@univention.de>
Date: Mon, 12 Nov 2012 16:13:14 -0700
Subject: [PATCH] storage: fix broken backing chain

https://bugzilla.redhat.com/show_bug.cgi?id=874860

82507838 refactored the code to keep both the raw and canonicalized form
of the backingStore, which breaks badly when the storage pool contains a
storage volume, which is missing its backing store file:
 # ./daemon/libvirtd -l
 2012-11-07 12:43:33.279+0000: 22175: info : libvirt version: 1.0.0
 2012-11-07 12:43:33.279+0000: 22175: error : absolutePathFromBaseFile:542 : Can't canonicalize path '/var/lib/libvirt/images/base.qcow2': No such file or directory
 2012-11-07 12:43:33.280+0000: 22175: error : storageDriverAutostart:115 : Failed to autostart storage pool 'default': Can't canonicalize path '/var/lib/libvirt/images/base.qcow2': No such file or directory

This is because virStorageFileGetMetadataFromBuf() aborts with -1 if the
filename of the backingStore can not be canonicalized:
 #0  absolutePathFromBaseFile () at util/storage_file.c:541
 #1  virStorageFileGetMetadataFromBuf () at util/storage_file.c:728
 #2  virStorageFileGetMetadataFromFD () at util/storage_file.c:932
 #3  virStorageBackendProbeTarget () at storage/storage_backend_fs.c:94
 #4  virStorageBackendFileSystemRefresh () at storage/storage_backend_fs.c:849
 #5  storagePoolStart () at storage/storage_driver.c:700
 #6  virStoragePoolCreate () at libvirt.c:12471
 ...

Treat files which miss their backing file as standalone files.

Signed-off-by: Philipp Hahn <hahn@univention.de>
(cherry picked from commit e0c469e58b93f852a72265919703cb6abd3779f8)
---
 src/util/storage_file.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/src/util/storage_file.c b/src/util/storage_file.c
index a0399ab..54b9ea0 100644
--- a/src/util/storage_file.c
+++ b/src/util/storage_file.c
@@ -727,8 +727,9 @@ virStorageFileGetMetadataFromBuf(int format,
                 meta->backingStoreRaw = meta->backingStore;
                 meta->backingStore = absolutePathFromBaseFile(path, backing);
                 if (meta->backingStore == NULL) {
-                    VIR_FREE(backing);
-                    return -1;
+                    /* the backing file is (currently) unavailable, treat this
+                     * file as standalone */
+                    backingFormat = VIR_STORAGE_FILE_NONE;
                 }
             }
             VIR_FREE(backing);
-- 
1.8.0

openSUSE Build Service is sponsored by