[libvirt] handling qemuMonitorAddDevice failure: missing drive_del function?
Daniel P. Berrange
berrange at redhat.com
Tue May 18 15:07:16 UTC 2010
On Tue, May 18, 2010 at 04:02:44PM +0200, Jim Meyering wrote:
> Daniel P. Berrange wrote:
>
> > On Tue, May 18, 2010 at 03:23:23PM +0200, Jim Meyering wrote:
> >> In src/qemu/qemu_driver.c, coverity gripes (rightly) about this:
> >>
> >> 6912 qemuDomainObjEnterMonitorWithDriver(driver, vm);
> >> 6913 if (qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE) {
> >> 6914 ret = qemuMonitorAddDrive(priv->mon, drivestr);
> >> 6915 if (ret == 0)
> >> No check of the return value of "qemuMonitorAddDevice(priv->mon, devstr)".
> >> Calling function "qemuMonitorAddDevice" without checking return value.
> >> 6916 qemuMonitorAddDevice(priv->mon, devstr);
> >> 6917 /* XXX remove the drive upon fail */
> >> 6918 } else {
> >>
> >> Does anyone have a preference on how to deal with it
> >> while we wait for a drive-removal function?
> >> I think it deserves at least a diagnostic.
> >
> > Add a VIR_WARN message i guess
>
> Here you go:
>
>
> From 62ece506ead7534ac37a70a6750a97e69809d088 Mon Sep 17 00:00:00 2001
> From: Jim Meyering <meyering at redhat.com>
> Date: Tue, 18 May 2010 16:02:12 +0200
> Subject: [PATCH] do not ignore qemuMonitorAddDrive failure; make uses identical
>
> There were three very similar uses of qemuMonitorAddDrive.
> This change makes the three 17-line sequences identical.
> * src/qemu/qemu_driver.c (qemudDomainAttachPciDiskDevice): Detect
> failure. Add VIR_WARN and braces.
> (qemudDomainAttachSCSIDisk): Add VIR_WARN and braces.
> (qemudDomainAttachUsbMassstorageDevice): Likewise.
> ---
> src/qemu/qemu_driver.c | 44 +++++++++++++++++++++++++++++---------------
> 1 files changed, 29 insertions(+), 15 deletions(-)
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 5649a20..9d23191 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -6912,15 +6912,21 @@ static int qemudDomainAttachPciDiskDevice(struct qemud_driver *driver,
> goto error;
> }
>
> qemuDomainObjEnterMonitorWithDriver(driver, vm);
> if (qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE) {
> ret = qemuMonitorAddDrive(priv->mon, drivestr);
> - if (ret == 0)
> - qemuMonitorAddDevice(priv->mon, devstr);
> - /* XXX remove the drive upon fail */
> + if (ret == 0) {
> + ret = qemuMonitorAddDevice(priv->mon, devstr);
> + if (ret < 0) {
> + VIR_WARN(_("qemuMonitorAddDevice failed on %s (%s)"),
> + drivestr, devstr);
> + /* XXX should call 'drive_del' on error but this does not
> + exist yet */
> + }
> + }
> } else {
> virDomainDevicePCIAddress guestAddr;
> ret = qemuMonitorAddPCIDisk(priv->mon,
> disk->src,
> type,
> &guestAddr);
> @@ -7126,18 +7132,22 @@ static int qemudDomainAttachSCSIDisk(struct qemud_driver *driver,
> virReportOOMError();
> goto error;
> }
>
> qemuDomainObjEnterMonitorWithDriver(driver, vm);
> if (qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE) {
> - ret = qemuMonitorAddDrive(priv->mon,
> - drivestr);
> - if (ret == 0)
> - ret = qemuMonitorAddDevice(priv->mon,
> - devstr);
> - /* XXX should call 'drive_del' on error but this does not exist yet */
> + ret = qemuMonitorAddDrive(priv->mon, drivestr);
> + if (ret == 0) {
> + ret = qemuMonitorAddDevice(priv->mon, devstr);
> + if (ret < 0) {
> + VIR_WARN(_("qemuMonitorAddDevice failed on %s (%s)"),
> + drivestr, devstr);
> + /* XXX should call 'drive_del' on error but this does not
> + exist yet */
> + }
> + }
> } else {
> virDomainDeviceDriveAddress driveAddr;
> ret = qemuMonitorAttachDrive(priv->mon,
> drivestr,
> &cont->info.addr.pci,
> &driveAddr);
> @@ -7215,18 +7225,22 @@ static int qemudDomainAttachUsbMassstorageDevice(struct qemud_driver *driver,
> virReportOOMError();
> goto error;
> }
>
> qemuDomainObjEnterMonitorWithDriver(driver, vm);
> if (qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE) {
> - ret = qemuMonitorAddDrive(priv->mon,
> - drivestr);
> - if (ret == 0)
> - ret = qemuMonitorAddDevice(priv->mon,
> - devstr);
> - /* XXX should call 'drive_del' on error but this does not exist yet */
> + ret = qemuMonitorAddDrive(priv->mon, drivestr);
> + if (ret == 0) {
> + ret = qemuMonitorAddDevice(priv->mon, devstr);
> + if (ret < 0) {
> + VIR_WARN(_("qemuMonitorAddDevice failed on %s (%s)"),
> + drivestr, devstr);
> + /* XXX should call 'drive_del' on error but this does not
> + exist yet */
> + }
> + }
> } else {
> ret = qemuMonitorAddUSBDisk(priv->mon, disk->src);
> }
> qemuDomainObjExitMonitorWithDriver(driver, vm);
>
> if (ret < 0)
ACK
Daniel
--
|: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://deltacloud.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
More information about the libvir-list
mailing list