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.
This commit is contained in:
Peter Krempa 2017-04-07 17:27:17 +02:00
parent f99bc451fe
commit 41e9f54d05

View File

@ -1127,9 +1127,14 @@ qemuMigrationIsAllowed(virQEMUDriverPtr driver,
static bool static bool
qemuMigrationIsSafe(virDomainDefPtr def, qemuMigrationIsSafe(virDomainDefPtr def,
size_t nmigrate_disks, 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; size_t i;
int rc;
for (i = 0; i < def->ndisks; i++) { for (i = 0; i < def->ndisks; i++) {
virDomainDiskDefPtr disk = def->disks[i]; virDomainDiskDefPtr disk = def->disks[i];
@ -1137,9 +1142,16 @@ qemuMigrationIsSafe(virDomainDefPtr def,
/* Our code elsewhere guarantees shared disks are either readonly (in /* Our code elsewhere guarantees shared disks are either readonly (in
* which case cache mode doesn't matter) or used with cache=none */ * which case cache mode doesn't matter) or used with cache=none */
if (qemuMigrateDisk(disk, nmigrate_disks, migrate_disks) && if (virStorageSourceIsEmpty(disk->src) ||
disk->cachemode != VIR_DOMAIN_DISK_CACHE_DISABLE) { disk->src->readonly ||
int rc; disk->src->shared ||
disk->cachemode == VIR_DOMAIN_DISK_CACHE_DISABLE)
continue;
/* 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 (virDomainDiskGetType(disk) == VIR_STORAGE_TYPE_FILE) {
if ((rc = virFileIsSharedFS(src)) < 0) if ((rc = virFileIsSharedFS(src)) < 0)
@ -1160,7 +1172,6 @@ qemuMigrationIsSafe(virDomainDefPtr def,
" use cache != none")); " use cache != none"));
return false; return false;
} }
}
return true; return true;
} }
@ -1916,7 +1927,7 @@ qemuMigrationBeginPhase(virQEMUDriverPtr driver,
goto cleanup; goto cleanup;
if (!(flags & VIR_MIGRATE_UNSAFE) && if (!(flags & VIR_MIGRATE_UNSAFE) &&
!qemuMigrationIsSafe(vm->def, nmigrate_disks, migrate_disks)) !qemuMigrationIsSafe(vm->def, nmigrate_disks, migrate_disks, flags))
goto cleanup; goto cleanup;
if (flags & VIR_MIGRATE_POSTCOPY && if (flags & VIR_MIGRATE_POSTCOPY &&
@ -4774,7 +4785,7 @@ qemuMigrationPerformJob(virQEMUDriverPtr driver,
goto endjob; goto endjob;
if (!(flags & VIR_MIGRATE_UNSAFE) && if (!(flags & VIR_MIGRATE_UNSAFE) &&
!qemuMigrationIsSafe(vm->def, nmigrate_disks, migrate_disks)) !qemuMigrationIsSafe(vm->def, nmigrate_disks, migrate_disks, flags))
goto endjob; goto endjob;
qemuMigrationStoreDomainState(vm); qemuMigrationStoreDomainState(vm);