Since the disks are copied by qemu, there's no need to enforce
cache=none. Thankfully the code that added qemuMigrateDisk did not break
existing configs, since if you don't select any disk to migrate
explicitly the code behaves sanely.
The logic for determining whether a disk should be migrated is
open-coded since using qemuMigrateDisk twice would be semantically
incorrect.
---
src/qemu/qemu_migration.c | 57 ++++++++++++++++++++++++++++-------------------
1 file changed, 34 insertions(+), 23 deletions(-)
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index d8222fe3b..5bd45137c 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -1126,9 +1126,14 @@ qemuMigrationIsAllowed(virQEMUDriverPtr driver,
static bool
qemuMigrationIsSafe(virDomainDefPtr def,
size_t nmigrate_disks,
- const char **migrate_disks)
+ const char **migrate_disks,
+ unsigned int flags)
+
{
+ bool storagemigration = flags & (VIR_MIGRATE_NON_SHARED_DISK |
+ VIR_MIGRATE_NON_SHARED_INC);
size_t i;
+ int rc;
for (i = 0; i < def->ndisks; i++) {
virDomainDiskDefPtr disk = def->disks[i];
@@ -1136,29 +1141,35 @@ qemuMigrationIsSafe(virDomainDefPtr def,
/* Our code elsewhere guarantees shared disks are either readonly (in
* which case cache mode doesn't matter) or used with cache=none */
- if (qemuMigrateDisk(disk, nmigrate_disks, migrate_disks) &&
- disk->cachemode != VIR_DOMAIN_DISK_CACHE_DISABLE) {
- int rc;
+ if (virStorageSourceIsEmpty(disk->src) ||
+ disk->src->readonly ||
+ disk->src->shared ||
+ disk->cachemode == VIR_DOMAIN_DISK_CACHE_DISABLE)
+ continue;
- if (virDomainDiskGetType(disk) == VIR_STORAGE_TYPE_FILE) {
- if ((rc = virFileIsSharedFS(src)) < 0)
- return false;
- else if (rc == 0)
- continue;
- if ((rc = virStorageFileIsClusterFS(src)) < 0)
- return false;
- else if (rc == 1)
- continue;
- } else if (disk->src->type == VIR_STORAGE_TYPE_NETWORK &&
- disk->src->protocol == VIR_STORAGE_NET_PROTOCOL_RBD) {
- continue;
- }
+ /* disks which are migrated by qemu are safe too */
+ if (storagemigration &&
+ qemuMigrateDisk(disk, nmigrate_disks, migrate_disks))
+ continue;
- virReportError(VIR_ERR_MIGRATE_UNSAFE, "%s",
- _("Migration may lead to data corruption if disks"
- " use cache != none"));
- return false;
+ if (virDomainDiskGetType(disk) == VIR_STORAGE_TYPE_FILE) {
+ if ((rc = virFileIsSharedFS(src)) < 0)
+ return false;
+ else if (rc == 0)
+ continue;
+ if ((rc = virStorageFileIsClusterFS(src)) < 0)
+ return false;
+ else if (rc == 1)
+ continue;
+ } else if (disk->src->type == VIR_STORAGE_TYPE_NETWORK &&
+ disk->src->protocol == VIR_STORAGE_NET_PROTOCOL_RBD) {
+ continue;
}
+
+ virReportError(VIR_ERR_MIGRATE_UNSAFE, "%s",
+ _("Migration may lead to data corruption if disks"
+ " use cache != none"));
+ return false;
}
return true;
@@ -1915,7 +1926,7 @@ qemuMigrationBeginPhase(virQEMUDriverPtr driver,
goto cleanup;
if (!(flags & VIR_MIGRATE_UNSAFE) &&
- !qemuMigrationIsSafe(vm->def, nmigrate_disks, migrate_disks))
+ !qemuMigrationIsSafe(vm->def, nmigrate_disks, migrate_disks, flags))
goto cleanup;
if (flags & VIR_MIGRATE_POSTCOPY &&
@@ -4773,7 +4784,7 @@ qemuMigrationPerformJob(virQEMUDriverPtr driver,
goto endjob;
if (!(flags & VIR_MIGRATE_UNSAFE) &&
- !qemuMigrationIsSafe(vm->def, nmigrate_disks, migrate_disks))
+ !qemuMigrationIsSafe(vm->def, nmigrate_disks, migrate_disks, flags))
goto endjob;
qemuMigrationStoreDomainState(vm);
--
2.12.2