]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemuMigrationSrcIsSafe: Check local storage more thoroughly
authorMichal Privoznik <mprivozn@redhat.com>
Mon, 26 Feb 2018 08:35:25 +0000 (09:35 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Mon, 26 Feb 2018 10:32:05 +0000 (11:32 +0100)
https://bugzilla.redhat.com/show_bug.cgi?id=1494454

If a domain disk is stored on local filesystem (e.g. ext4) but is
not being migrated it is very likely that domain is not able to
run on destination. Regardless of share/cache mode.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
src/qemu/qemu_migration.c

index b22a327b53556f462b0242f6d46234ac06459302..e98b1e4ce56f2110fddd271ebaaf2101aa253f23 100644 (file)
@@ -1215,25 +1215,26 @@ qemuMigrationSrcIsSafe(virDomainDefPtr def,
         virDomainDiskDefPtr disk = def->disks[i];
         const char *src = virDomainDiskGetSource(disk);
 
-        /* Our code elsewhere guarantees shared disks are either readonly (in
-         * which case cache mode doesn't matter) or used with cache=none or used with cache=directsync */
+        /* Disks without any source (i.e. floppies and CD-ROMs)
+         * OR readonly are safe. */
         if (virStorageSourceIsEmpty(disk->src) ||
-            disk->src->readonly ||
-            disk->src->shared ||
-            disk->cachemode == VIR_DOMAIN_DISK_CACHE_DISABLE ||
-            disk->cachemode == VIR_DOMAIN_DISK_CACHE_DIRECTSYNC)
+            disk->src->readonly)
             continue;
 
-        /* disks which are migrated by qemu are safe too */
+        /* Disks which are migrated by qemu are safe too. */
         if (storagemigration &&
             qemuMigrationAnyCopyDisk(disk, nmigrate_disks, migrate_disks))
             continue;
 
+        /* However, disks on local FS (e.g. ext4) are not safe. */
         if (virDomainDiskGetType(disk) == VIR_STORAGE_TYPE_FILE) {
-            if ((rc = virFileIsSharedFS(src)) < 0)
+            if ((rc = virFileIsSharedFS(src)) < 0) {
                 return false;
-            else if (rc == 0)
-                continue;
+            } else if (rc == 0) {
+                virReportError(VIR_ERR_MIGRATE_UNSAFE, "%s",
+                               _("Migration without shared storage is unsafe"));
+                return false;
+            }
             if ((rc = virStorageFileIsClusterFS(src)) < 0)
                 return false;
             else if (rc == 1)
@@ -1243,6 +1244,13 @@ qemuMigrationSrcIsSafe(virDomainDefPtr def,
             continue;
         }
 
+        /* Our code elsewhere guarantees shared disks are either readonly (in
+         * which case cache mode doesn't matter) or used with cache=none or used with cache=directsync */
+        if (disk->src->shared ||
+            disk->cachemode == VIR_DOMAIN_DISK_CACHE_DISABLE ||
+            disk->cachemode == VIR_DOMAIN_DISK_CACHE_DIRECTSYNC)
+            continue;
+
         virReportError(VIR_ERR_MIGRATE_UNSAFE, "%s",
                        _("Migration may lead to data corruption if disks"
                          " use cache != none or cache != directsync"));