On Wed, Aug 03, 2022 at 17:45:07 +0200, Pavel Hrdina wrote: > On Tue, Jul 26, 2022 at 04:36:59PM +0200, Peter Krempa wrote: > > Assume that QEMU_CAPS_BLOCKDEV is present and remove all code executed > > when it's not. > > > > Signed-off-by: Peter Krempa <pkrempa@xxxxxxxxxx> > > --- > > src/qemu/qemu_migration.c | 127 ++++++++------------------------------ > > 1 file changed, 25 insertions(+), 102 deletions(-) > > > > diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c > > index 8e9428a5bb..ef24a1dedf 100644 > > --- a/src/qemu/qemu_migration.c > > +++ b/src/qemu/qemu_migration.c > > [...] > > > @@ -2687,41 +2626,25 @@ qemuMigrationSrcBeginPhase(virQEMUDriver *driver, > > } > > > > if (flags & (VIR_MIGRATE_NON_SHARED_DISK | VIR_MIGRATE_NON_SHARED_INC)) { > > - if (flags & VIR_MIGRATE_NON_SHARED_SYNCHRONOUS_WRITES && > > - !virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV)) { > > + if (flags & VIR_MIGRATE_TUNNELLED) { > > virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", > > - _("VIR_MIGRATE_NON_SHARED_SYNCHRONOUS_WRITES is not supported by this QEMU")); > > - return NULL; > > + _("migration of non-shared storage is not supported with tunnelled migration and this QEMU")); [1] > > } > > > > - if (flags & VIR_MIGRATE_TUNNELLED) { Even prior to this patch, when tunnelled migration is requested with the VIR_MIGRATE_NON_SHARED* flag > > - if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV)) { > > - virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", > > - _("migration of non-shared storage is not supported with tunnelled migration and this QEMU")); > > - return NULL; > > - } ... and blockdev is enabled, we simply reject it right away without consulting anything else. This is what is now done right at the beginning [1] ... > > - > > - if (nmigrate_disks) { > > - virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", > > - _("Selecting disks to migrate is not implemented for tunnelled migration")); > > - return NULL; > > - } > > - } else { > > - if (nmigrate_disks) { > > - size_t i, j; > > - /* Check user requested only known disk targets. */ > > - for (i = 0; i < nmigrate_disks; i++) { > > - for (j = 0; j < vm->def->ndisks; j++) { > > - if (STREQ(vm->def->disks[j]->dst, migrate_disks[i])) > > - break; > > - } > > + if (nmigrate_disks) { ... so that we don't have to worry about any further checks. > > + size_t i, j; > > + /* Check user requested only known disk targets. */ > > + for (i = 0; i < nmigrate_disks; i++) { > > + for (j = 0; j < vm->def->ndisks; j++) { > > + if (STREQ(vm->def->disks[j]->dst, migrate_disks[i])) > > + break; > > + } > > > > - if (j == vm->def->ndisks) { > > - virReportError(VIR_ERR_INVALID_ARG, > > - _("disk target %s not found"), > > - migrate_disks[i]); > > - return NULL; > > - } > > + if (j == vm->def->ndisks) { > > + virReportError(VIR_ERR_INVALID_ARG, > > + _("disk target %s not found"), > > + migrate_disks[i]); > > + return NULL; > > } > > } > > This changes doesn't look equivalent. > > Before this patch the `for` loop to check `nmigrate_disks` would be done > only for non-tunneled migration but after this changes it is done even > for tunneled migration. As explained above, even before this patch we rejected tunnelled migration with storage when blockdev was enabled. After this patch, it's checked at the beginning and thus the rest of the code doesn't need to be conditional. > In addition the new code dropped the error path for tunneled migration > if `nmigrate_disks` is not NULL. Once again, we simply reject tunneled migration with storage unconditionally now, so the check would be dead code. > > Not sure if this was intended or is based on some other knowledge and > code that is not in scope of this patch. > > Pavel