[libvirt] [PATCHv7 3/4] libvirt/qemu - check address confliction before addition.
KAMEZAWA Hiroyuki
kamezawa.hiroyu at jp.fujitsu.com
Tue Mar 29 05:13:43 UTC 2011
On Tue, 29 Mar 2011 13:09:37 +0800
Wen Congyang <wency at cn.fujitsu.com> wrote:
> At 03/25/2011 04:17 PM, KAMEZAWA Hiroyuki Write:
> >>From 638341bdf3eaac824e36d265e134608279750049 Mon Sep 17 00:00:00 2001
> > From: KAMEZAWA Hiroyuki <kamezawa.hiroyu at jp.fujitsu.com>
> > Date: Fri, 25 Mar 2011 17:10:58 +0900
> > Subject: [PATCHv7 3/4] libvirt/qemu - check address confliction before addition.
> >
> > qemuDomainAttachDevicePersistent() calls qemuDomainAssignPCIAddresses()
> > and virDomainDefAddImplicitControllers() at the end of its call.
> >
> > But PCI/Drive address confliction checks are
> > PCI - confliction will be found but error report is not verbose.
> > Drive - never done.
> >
> > For example, you can add following (unusual) 2 devices without errors.
> >
> > <disk type='file' device='disk'>
> > <driver name='qemu' type='raw'/>
> > <source file='/var/lib/libvirt/images/test3.img'/>
> > <target dev="sdx" bus='scsi'/>
> > <address type='drive' controller='0' bus='0' unit='0'/>
> > </disk>
> >
> > <disk type='file' device='disk'>
> > <driver name='qemu' type='raw'/>
> > <source file='/var/lib/libvirt/images/test3.img'/>
> > <target dev="sdy" bus='scsi'/>
> > <address type='drive' controller='0' bus='0' unit='0'/>
> > </disk>
> >
> > It's better to check drive address confliction before addition.
> >
> > Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu at jp.fujitsu.com>
> > ---
> > src/conf/domain_conf.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++
> > src/conf/domain_conf.h | 2 +
> > src/libvirt_private.syms | 1 +
> > src/qemu/qemu_driver.c | 9 +++++++
> > 4 files changed, 71 insertions(+), 0 deletions(-)
> >
> > diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> > index 3e3f342..4a54f62 100644
> > --- a/src/conf/domain_conf.c
> > +++ b/src/conf/domain_conf.c
> > @@ -1287,6 +1287,65 @@ void virDomainDefClearDeviceAliases(virDomainDefPtr def)
> > virDomainDeviceInfoIterate(def, virDomainDeviceInfoClearAlias, NULL);
> > }
> >
> > +static int virDomainDeviceAddressMatch(virDomainDefPtr def ATTRIBUTE_UNUSED,
> > + virDomainDeviceInfoPtr info,
> > + void *opaque)
> > +{
> > + virDomainDeviceInfoPtr checked = opaque;
> > + /* skip to check confliction of alias */
> > + if (info->type != checked->type)
> > + return 0;
> > + if (info->alias && checked->alias && strcmp(info->alias, checked->alias))
> > + return -1;
> > + if (!memcmp(&info->addr, &checked->addr, sizeof(info->addr)))
> > + return -1;
> > + return 0;
> > +}
> > +
> > +int virDomainDefFindDeviceAddressConflict(virDomainDefPtr def,
> > + virDomainDeviceDefPtr dev)
> > +{
> > + virDomainDeviceInfoPtr checked;
> > +
> > + switch (dev->type) {
> > + case VIR_DOMAIN_DEVICE_DISK:
> > + checked = &dev->data.disk->info;
> > + break;
> > + case VIR_DOMAIN_DEVICE_FS:
> > + checked = &dev->data.fs->info;
> > + break;
> > + case VIR_DOMAIN_DEVICE_NET:
> > + checked = &dev->data.net->info;
> > + break;
> > + case VIR_DOMAIN_DEVICE_INPUT:
> > + checked = &dev->data.input->info;
> > + break;
> > + case VIR_DOMAIN_DEVICE_SOUND:
> > + checked = &dev->data.sound->info;
> > + break;
> > + case VIR_DOMAIN_DEVICE_VIDEO:
> > + checked = &dev->data.video->info;
> > + break;
> > + case VIR_DOMAIN_DEVICE_HOSTDEV:
> > + checked = &dev->data.hostdev->info;
> > + break;
> > + case VIR_DOMAIN_DEVICE_WATCHDOG:
> > + checked = &dev->data.watchdog->info;
> > + break;
> > + case VIR_DOMAIN_DEVICE_CONTROLLER:
> > + checked = &dev->data.controller->info;
> > + break;
> > + case VIR_DOMAIN_DEVICE_GRAPHICS: /* has no address info */
> > + return 0;
> > + default:
> > + virDomainReportError(VIR_ERR_INTERNAL_ERROR,
> > + "%s", _("Unknown device type"));
> > + return -1;
>
> You report error here, but you report error in caller(qemuDomainAttachDevicePersistent())
> again.
"unknown device type" is an internal/"should never happen" error rathar than
errors reported in the caller.
I think this error should be reported. Internal error implies bug.
>
> > + }
> > + if (checked->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE)
> > + return 0;
> > + return virDomainDeviceInfoIterate(def, virDomainDeviceAddressMatch, checked);
> > +}
> >
> > /* Generate a string representation of a device address
> > * @param address Device address to stringify
> > diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> > index b791714..53ccf32 100644
> > --- a/src/conf/domain_conf.h
> > +++ b/src/conf/domain_conf.h
> > @@ -1194,6 +1194,8 @@ int virDomainDeviceInfoIsSet(virDomainDeviceInfoPtr info);
> > void virDomainDeviceInfoClear(virDomainDeviceInfoPtr info);
> > void virDomainDefClearPCIAddresses(virDomainDefPtr def);
> > void virDomainDefClearDeviceAliases(virDomainDefPtr def);
> > +int virDomainDefFindDeviceAddressConflict(virDomainDefPtr def,
> > + virDomainDeviceDefPtr dev);
> >
> > typedef int (*virDomainDeviceInfoCallback)(virDomainDefPtr def,
> > virDomainDeviceInfoPtr dev,
> > diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> > index 7459c40..ffdf9cf 100644
> > --- a/src/libvirt_private.syms
> > +++ b/src/libvirt_private.syms
> > @@ -220,6 +220,7 @@ virDomainCpuSetParse;
> > virDomainDefAddImplicitControllers;
> > virDomainDefClearDeviceAliases;
> > virDomainDefClearPCIAddresses;
> > +virDomainDefFindDeviceAddressConflict;
> > virDomainDefFormat;
> > virDomainDefFree;
> > virDomainDefParseFile;
> > diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> > index 4d3b416..e746576 100644
> > --- a/src/qemu/qemu_driver.c
> > +++ b/src/qemu/qemu_driver.c
> > @@ -4144,6 +4144,9 @@ cleanup:
> > return ret;
> > }
> >
> > +/*
> > + * Checking device's definition meets qemu's (and qemu drivre's) limitation.
> > + */
>
> Is this comment in correct place?
> You do not modify this function. If this comment is for this function, it should be
> merged into patch 2.
> According to the comment's content, it is not for this function.
>
will check again. I'm not a good git user ;(
Thanks,
-Kame
More information about the libvir-list
mailing list