]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu_blockjob: Remove secdriver metadata for whole backing chain on job completion
authorMichal Privoznik <mprivozn@redhat.com>
Mon, 16 Sep 2019 10:28:48 +0000 (12:28 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Wed, 25 Sep 2019 10:34:09 +0000 (12:34 +0200)
Turns out, block mirror is not the only job a disk can have. It
can also do commits of one layer into the other. Or possibly some
other tricks too. Problem is that while we set seclabels on given
layers of backing chain when the job is starting (via
qemuDomainStorageSourceAccessAllow()) we don't restore them when
job finishes. This leaves XATTRs set and corresponding images
unusable.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
ACKed-by: Peter Krempa <pkrempa@redhat.com>
src/qemu/qemu_blockjob.c

index 80d0269128d14e05d45eb96a8acaa1b714a17920..c118f2c298032a4d660a122538374349758d1c34 100644 (file)
@@ -664,9 +664,9 @@ qemuBlockJobEventProcessLegacyCompleted(virQEMUDriverPtr driver,
         virObjectUnref(disk->src);
         disk->src = disk->mirror;
     } else {
-        if (disk->mirror) {
-            virStorageSourcePtr n;
+        virStorageSourcePtr n;
 
+        if (disk->mirror) {
             virDomainLockImageDetach(driver->lockManager, vm, disk->mirror);
 
             /* Ideally, we would restore seclabels on the backing chain here
@@ -684,6 +684,16 @@ qemuBlockJobEventProcessLegacyCompleted(virQEMUDriverPtr driver,
 
             virObjectUnref(disk->mirror);
         }
+
+        for (n = disk->src; virStorageSourceIsBacking(n); n = n->backingStore) {
+            if (qemuSecurityMoveImageMetadata(driver, vm, n, NULL) < 0) {
+                VIR_WARN("Unable to remove disk metadata on "
+                         "vm %s from %s (disk target %s)",
+                         vm->def->name,
+                         NULLSTR(n->path),
+                         disk->dst);
+            }
+        }
     }
 
     /* Recompute the cached backing chain to match our