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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list