[libvirt] [PATCH v3] qemu: Validate address type when attaching a disk device.

Ruifeng Bian rbian at redhat.com
Thu Sep 17 03:19:38 UTC 2015


----- Original Message -----
> From: "Michal Privoznik" <mprivozn at redhat.com>
> To: "Ruifeng Bian" <rbian at redhat.com>, libvir-list at redhat.com
> Sent: Wednesday, September 16, 2015 11:32:27 PM
> Subject: Re: [libvirt] [PATCH v3] qemu: Validate address type when attaching a disk device.
> 
> On 09.09.2015 13:17, Ruifeng Bian wrote:
> > Bug fix for: https://bugzilla.redhat.com/show_bug.cgi?id=1257844
> > 
> > Attach-device can hotplug a virtio disk device with any address type now,
> > it need to validate the address type before the attachment.
> > 
> > Attaching a disk device with --config option need to check address type.
> > Otherwise, the domain cloudn't be started normally. This patch add a basic
> > check for address type.
> > 
> > Detaching a disk device with --config also need to check disk options,
> > add qemuCheckDiskConfig() method in qemuDomainDetachDeviceConfig().
> > ---
> >  src/qemu/qemu_command.c | 44 +++++++++++++++++++++++++++++++++++++++++++-
> >  src/qemu/qemu_driver.c  |  2 ++
> >  src/qemu/qemu_hotplug.c | 22 ++++++++++++++++++++++
> >  3 files changed, 67 insertions(+), 1 deletion(-)
> > 
> > diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> > index ec5e3d4..a2c7483 100644
> > --- a/src/qemu/qemu_command.c
> > +++ b/src/qemu/qemu_command.c
> > @@ -3579,12 +3579,54 @@ qemuCheckDiskConfig(virDomainDiskDefPtr disk)
> >              goto error;
> >          }
> >      }
> > +
> > +    if (disk->info.type) {
> > +        switch (disk->bus) {
> > +        case VIR_DOMAIN_DISK_BUS_IDE:
> > +        case VIR_DOMAIN_DISK_BUS_SCSI:
> > +        case VIR_DOMAIN_DISK_BUS_SATA:
> > +        case VIR_DOMAIN_DISK_BUS_FDC:
> > +            if (disk->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE) {
> > +                virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> > +                               _("disk cannot have an address of type
> > '%s'"),
> > +
> > virDomainDeviceAddressTypeToString(disk->info.type));
> > +                goto error;
> > +            }
> > +            break;
> > +        case VIR_DOMAIN_DISK_BUS_USB:
> > +            if (disk->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB) {
> > +                virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> > +                               _("usb disk cannot have an address of type
> > '%s'"),
> > +
> > virDomainDeviceAddressTypeToString(disk->info.type));
> > +                goto error;
> > +            }
> > +            break;
> > +        case VIR_DOMAIN_DISK_BUS_VIRTIO:
> > +            if (disk->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW &&
> > +                disk->info.type !=
> > VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390 &&
> > +                disk->info.type !=
> > VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO &&
> > +                disk->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) {
> > +                virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> > +                               _("virtio disk cannot have an address of
> > type '%s'"),
> > +
> > virDomainDeviceAddressTypeToString(disk->info.type));
> > +                goto error;
> > +            }
> > +            break;
> > +        case VIR_DOMAIN_DISK_BUS_XEN:
> > +        case VIR_DOMAIN_DISK_BUS_UML:
> > +        case VIR_DOMAIN_DISK_BUS_SD:
> > +            /* no address type currently, return false if address provided
> > */
> > +            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> > +                           _("disk cannot have an address of type '%s'"),
> > +
> > virDomainDeviceAddressTypeToString(disk->info.type));
> > +            goto error;
> > +        }
> > +    }
> >      return 0;
> >   error:
> >      return -1;
> >  }
> 
> While this is technically correct I wonder if this should live here or
> in the config parsing part. I mean, these constraints are not qemu
> specific, are they?

I have thought about it. I'm not sure whether other hypervisor will use it,
so I put it here. Okay, moving this part to domain_conf is better, I will do it.

Thanks,
Ruifeng

> 
> >  
> > -
> >  /* Check whether the device address is using either 'ccw' or default s390
> >   * address format and whether that's "legal" for the current qemu and/or
> >   * guest os.machine type. This is the corollary to the code which doesn't
> > diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> > index 91eb661..61424b0 100644
> > --- a/src/qemu/qemu_driver.c
> > +++ b/src/qemu/qemu_driver.c
> > @@ -8205,6 +8205,8 @@ qemuDomainDetachDeviceConfig(virDomainDefPtr vmdef,
> >      switch ((virDomainDeviceType) dev->type) {
> >      case VIR_DOMAIN_DEVICE_DISK:
> >          disk = dev->data.disk;
> > +        if (qemuCheckDiskConfig(disk) < 0)
> > +            return -1;
> >          if (!(det_disk = virDomainDiskRemoveByName(vmdef, disk->dst))) {
> >              virReportError(VIR_ERR_INVALID_ARG,
> >                             _("no target device %s"), disk->dst);
> > diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
> > index 63fafa6..1f46647 100644
> > --- a/src/qemu/qemu_hotplug.c
> > +++ b/src/qemu/qemu_hotplug.c
> > @@ -335,6 +335,28 @@ qemuDomainAttachVirtioDiskDevice(virConnectPtr conn,
> >          if (!qemuCheckCCWS390AddressSupport(vm->def, disk->info,
> >          priv->qemuCaps,
> >                                              disk->dst))
> >              goto cleanup;
> > +
> > +        if (qemuDomainMachineIsS390CCW(vm->def) &&
> > +            virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_VIRTIO_CCW)) {
> > +            if (!virDomainDeviceAddressIsValid(&disk->info,
> > +
> > VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW))
> > {
> > +                virReportError(VIR_ERR_OPERATION_FAILED, "%s",
> > +                               _("device cannot be attached without a
> > valid CCW address"));
> > +                goto cleanup;
> > +            }
> > +        } else if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_VIRTIO_S390))
> > {
> > +            if (!virDomainDeviceAddressIsValid(&disk->info,
> > +
> > VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390))
> > {
> > +                virReportError(VIR_ERR_OPERATION_FAILED, "%s",
> > +                               _("device cannot be attached without a
> > valid S390 address"));
> > +                goto cleanup;
> > +            }
> > +        } else if (!virDomainDeviceAddressIsValid(&disk->info,
> > +
> > VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI))
> > {
> > +                virReportError(VIR_ERR_OPERATION_FAILED, "%s",
> > +                               _("device cannot be attached without a
> > valid PCI address"));
> > +                goto cleanup;
> > +        }
> >      }
> >  
> >      for (i = 0; i < vm->def->ndisks; i++) {
> > 
> 
> Otherwise this is looking good.
> 
> Michal
> 




More information about the libvir-list mailing list