[libvirt] [PATCHv7 3/4] libvirt/qemu - check address confliction before addition.
KAMEZAWA Hiroyuki
kamezawa.hiroyu at jp.fujitsu.com
Tue Mar 29 05:31:38 UTC 2011
On Tue, 29 Mar 2011 13:30:03 +0800
Wen Congyang <wency at cn.fujitsu.com> wrote:
> At 03/29/2011 01:13 PM, KAMEZAWA Hiroyuki Write:
> > 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.
>
> Yes, this should not happen. If it happens, the error message will be overwritten by the caller.
> We can report error here if virDomainDeviceInfoIterate() returns -1, and the caller do not
> report error.
>
Is that make usability of this function ? If we report error, this function cannot
be used for simple sanity check of pci addresses.
Hmm, I'll replace this with DEBUG message. ok and never add error report here.
Ok ?
Thanks,
-Kame
More information about the libvir-list
mailing list