On Wed, Dec 05, 2012 at 17:25:11 +0800, Osier Yang wrote: > This prevents the domain starting if the shared disk's setting > conflicts with other active domain(s), E.g. A domain with > "cdbfilter" set as "yes", however, another active domain is using > it set as "no". > ... > diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c > index 05f8622..2938a65 100644 > --- a/src/qemu/qemu_process.c > +++ b/src/qemu/qemu_process.c > @@ -3712,12 +3712,56 @@ int qemuProcessStart(virConnectPtr conn, > if (disk->rawio == 1) > virCommandAllowCap(cmd, CAP_SYS_RAWIO); > > - /* Add to qemud_driver->sharedDisks list if the disk is shared */ > - if (disk->shared && > - (qemuSharedDiskListAdd(driver->sharedDisks, > - disk->src, > - vm->def->name) < 0)) { > - goto cleanup; > + if (disk->shared) { > + /* Error out if the cdbfilter setting is different with what > + * other domain(s) uses. > + */ > + qemuSharedDiskPtr entry = NULL; > + > + if ((entry = qemuSharedDiskListFind(driver->sharedDisks, > + disk->src, > + NULL, > + NULL))) { > + virDomainObjUnlock(vm); > + for (i = 0; i < entry->ndomains; i++) { > + virDomainObjPtr domobj = NULL; > + virDomainDiskDefPtr diskdef = NULL; > + > + if (!(domobj = virDomainFindByName(&driver->domains, > + entry->domains[i]))) { > + virDomainObjLock(vm); > + goto cleanup; > + } > + > + if (!(diskdef = virDomainDiskFindByPath(domobj->def, > + disk->src))) { > + virDomainObjUnlock(domobj); > + virDomainObjLock(vm); > + goto cleanup; > + } > + > + /* XXX: Can be abstracted into a function when there > + * are more stuffs to check in future. > + */ > + if (diskdef->cdbfilter != disk->cdbfilter) { > + virReportError(VIR_ERR_INTERNAL_ERROR, > + _("cdbfilter of shared disk '%s' " > + "conflicts with other active " > + "domains"), disk->src); > + virDomainObjUnlock(domobj); > + virDomainObjLock(vm); > + goto cleanup; > + } > + virDomainObjUnlock(domobj); > + } > + virDomainObjLock(vm); > + } NACK. This is still doing what Daniel complained about in v1. Although it does not go through all domains it is still locking some other domains. Not to mention that it is absolute overkill to do. IIUC, all domains in entry-domains has to have exactly the same cdbfilter otherwise libvirt would refuse to start them. And why do we even need to maintain a list of domains sharing the same disk? Wouldn't just storing the value of cdbfilter there be enough? It seems like it would, at least for this purpose of checking that it matches cdbfilter specified in current domain. Jirka -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list