[libvirt] [PATCH 6/6] unpriv_sgio: Error out if the unpriv_sgio setting conflicts with others
Daniel P. Berrange
berrange at redhat.com
Mon Nov 26 10:40:38 UTC 2012
On Mon, Nov 26, 2012 at 06:21:42PM +0800, Osier Yang wrote:
> This prevent the domain starting if the shared disk's setting conflicts
> with other active domain(s), E.g. A domain with unpriv_sgio set as
> "yes", however, another active domain is using it set as "no".
> ---
> src/conf/domain_conf.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
> src/conf/domain_conf.h | 3 +++
> src/libvirt_private.syms | 1 +
> src/qemu/qemu_process.c | 14 +++++++++++++-
> 4 files changed, 62 insertions(+), 1 deletions(-)
>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 02df96e..fb7bb1f 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -15763,3 +15763,48 @@ virDomainDiskIsUsed(const virDomainObjList doms,
>
> return false;
> }
> +
> +static int
> +virDomainSharedDiskCompare(const void *payload,
> + const void *name ATTRIBUTE_UNUSED,
> + const void *opaque)
> +{
> + virDomainObjPtr obj = (virDomainObjPtr)payload;
> + const virDomainDiskDefPtr disk = (virDomainDiskDefPtr)opaque;
> + int i;
> +
> + virDomainObjLock(obj);
> +
> + /* Ingores the inactive ones */
> + if (!virDomainObjIsActive(obj))
> + return 0;
> +
> + for (i = 0; i < obj->def->ndisks; i++) {
> + if (STRNEQ(obj->def->disks[i]->src, disk->src))
> + continue;
> +
> + if (obj->def->disks[i]->unpriv_sgio != disk->unpriv_sgio) {
> + virDomainObjUnlock(obj);
> + return 1;
> + }
> + }
> +
> + virDomainObjUnlock(obj);
> + return 0;
> +}
> +
> +/* Validate if the shared disk conf is conflicted with other domains,
> + * currently only validates the unpriv_sgio setting
> + */
> +bool
> +virDomainSharedDiskValidate(const virDomainObjList doms,
> + const virDomainDiskDefPtr disk)
> +{
> + virDomainObjPtr obj;
> +
> + obj = virHashSearch(doms.objs, virDomainSharedDiskCompare, disk);
> + if (obj)
> + return false;
> +
> + return true;
> +}
This code is rather undesirable since it requires locking every
single VM known to the QEMU driver. Better to use the model we
have for PCI/USB devices where the driver maintains a central
list of the devices
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