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
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);