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];
/* 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;
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 &&
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);