[libvirt] [PATCH] qemu-migration: Disallow migration of read only disk
Daniel P. Berrange
berrange at redhat.com
Mon Sep 19 08:01:58 UTC 2016
On Fri, Sep 16, 2016 at 04:03:55PM -0400, Jason J. Herne wrote:
> On 09/14/2016 10:40 AM, Daniel P. Berrange wrote:
> > On Wed, Sep 14, 2016 at 10:37:07AM -0400, Corey S. McQuay wrote:
> > > Currently Libvirt allows attempts to migrate read only disks. Qemu cannot handle this as read only
> > > disks cannot be written to on the destination system. The end result is a cryptic error message
> > > and a failed migration.
> > >
> > > This patch causes migration to fail earlier and provides a meaningful error message stating that
> > > migrating read only disks is not supported.
> > >
> > > Signed-off-by: Corey S. McQuay <csmcquay at linux.vnet.ibm.com>
> > > Reviewed-by: Jason J. Herne <jjherne at linux.vnet.ibm.com>
> > > Reviewed-by: Boris Fiuczynski <fiuczy at linux.vnet.ibm.com>
> > > ---
> > > src/qemu/qemu_migration.c | 25 +++++++++++++++++++++++++
> > > 1 file changed, 25 insertions(+)
> > >
> > > diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
> > > index e451ef6..3311711 100644
> > > --- a/src/qemu/qemu_migration.c
> > > +++ b/src/qemu/qemu_migration.c
> > > @@ -2392,6 +2392,28 @@ qemuMigrationIsSafe(virDomainDefPtr def,
> > > return true;
> > > }
> > >
> > > +static bool
> > > +qemuMigrationAreAllDisksRW(virDomainDefPtr def,
> > > + size_t nmigrate_disks,
> > > + const char **migrate_disks)
> > > +{
> > > + size_t i;
> > > +
> > > + for (i = 0; i < def->ndisks; i++) {
> > > + virDomainDiskDefPtr disk = def->disks[i];
> > > +
> > > + if (qemuMigrateDisk(disk, nmigrate_disks, migrate_disks) &&
> > > + disk->src->readonly) {
> > > + virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
> > > + _("Cannot migrate read-only disk %s"),
> > > + disk->dst);
> > > + return false;
> > > + }
> > > + }
> > > +
> > > + return true;
> > > +}
> >
> > We already have multiple places in the migration code which iterate
> > over all disks, determining which are migratable. IMHO we should
> > just add an readonly check in one of those, rather than adding yet
> > another iteration.
> >
>
> Hi Daniel,
>
> I'm not seeing a suitable existing location for this new check to live.
> The only place I see migration code loop over the disks for error checking
> is in qemuMigrationBeginPhase.
>
> 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]);
> goto cleanup;
> }
> }
>
> And putting inside a nested loop would be kind of silly :)
> It seems to be that all other disk loops are in locations
> that do not run before migration begins, or their purpose
> is not for error checking.
>
> It may make sense to add the check to either of the following:
> qemuMigrationDriveMirror
> qemuMigrationStartNBDServer
Yes, those are exactly what I'd expect it to be.
Regards,
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list