From 41e9f54d058732cd935976a605d9c6c1c5563b74 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Fri, 7 Apr 2017 17:27:17 +0200 Subject: [PATCH] qemu: migration: Skip cache=none check for disks which are storage-migrated 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 9b3285f302..09adb04845 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -1127,9 +1127,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]; @@ -1137,29 +1142,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) { + /* disks which are migrated by qemu are safe too */ + if (storagemigration && + qemuMigrateDisk(disk, nmigrate_disks, migrate_disks)) + continue; + + if (virDomainDiskGetType(disk) == VIR_STORAGE_TYPE_FILE) { + if ((rc = virFileIsSharedFS(src)) < 0) + return false; + else if (rc == 0) continue; - } - - virReportError(VIR_ERR_MIGRATE_UNSAFE, "%s", - _("Migration may lead to data corruption if disks" - " use cache != none")); - return false; + 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; @@ -1916,7 +1927,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 && @@ -4774,7 +4785,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);