mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-26 23:55:23 +00:00
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:
parent
f99bc451fe
commit
41e9f54d05
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user