[libvirt] [PATCH 1/7] util: Alter virObjectLockRead to return status
Daniel P. Berrange
berrange at redhat.com
Mon Jul 31 10:08:22 UTC 2017
On Fri, Jul 28, 2017 at 12:38:55PM -0400, John Ferlan wrote:
> Rather than ignore errors, let's have virObjectLockRead check for
> the correct usage and issue an error when not properly used so
> so that we don't run into situations where the resource we think
> we're locking really isn't locked because the void input parameter
> wasn't valid.
>
> Signed-off-by: John Ferlan <jferlan at redhat.com>
> ---
> src/conf/virdomainobjlist.c | 27 ++++++++++++++++++---------
> src/util/virobject.c | 6 +++++-
> src/util/virobject.h | 2 +-
> 3 files changed, 24 insertions(+), 11 deletions(-)
>
> diff --git a/src/conf/virdomainobjlist.c b/src/conf/virdomainobjlist.c
> index 1d027a4..fed4029 100644
> --- a/src/conf/virdomainobjlist.c
> +++ b/src/conf/virdomainobjlist.c
> @@ -118,7 +118,8 @@ virDomainObjListFindByIDInternal(virDomainObjListPtr doms,
> bool ref)
> {
> virDomainObjPtr obj;
> - virObjectLockRead(doms);
> + if (virObjectLockRead(doms) < 0)
> + return NULL;
> obj = virHashSearch(doms->objs, virDomainObjListSearchID, &id, NULL);
> if (ref) {
> virObjectRef(obj);
> @@ -160,7 +161,8 @@ virDomainObjListFindByUUIDInternal(virDomainObjListPtr doms,
> char uuidstr[VIR_UUID_STRING_BUFLEN];
> virDomainObjPtr obj;
>
> - virObjectLockRead(doms);
> + if (virObjectLockRead(doms) < 0)
> + return NULL;
> virUUIDFormat(uuid, uuidstr);
>
> obj = virHashLookup(doms->objs, uuidstr);
> @@ -204,7 +206,8 @@ virDomainObjPtr virDomainObjListFindByName(virDomainObjListPtr doms,
> {
> virDomainObjPtr obj;
>
> - virObjectLockRead(doms);
> + if (virObjectLockRead(doms) < 0)
> + return NULL;
> obj = virHashLookup(doms->objsName, name);
> virObjectRef(obj);
> virObjectUnlock(doms);
> @@ -653,7 +656,8 @@ virDomainObjListNumOfDomains(virDomainObjListPtr doms,
> virConnectPtr conn)
> {
> struct virDomainObjListData data = { filter, conn, active, 0 };
> - virObjectLockRead(doms);
> + if (virObjectLockRead(doms) < 0)
> + return -1;
> virHashForEach(doms->objs, virDomainObjListCount, &data);
> virObjectUnlock(doms);
> return data.count;
> @@ -697,7 +701,8 @@ virDomainObjListGetActiveIDs(virDomainObjListPtr doms,
> {
> struct virDomainIDData data = { filter, conn,
> 0, maxids, ids };
> - virObjectLockRead(doms);
> + if (virObjectLockRead(doms) < 0)
> + return -1;
> virHashForEach(doms->objs, virDomainObjListCopyActiveIDs, &data);
> virObjectUnlock(doms);
> return data.numids;
> @@ -751,7 +756,8 @@ virDomainObjListGetInactiveNames(virDomainObjListPtr doms,
> struct virDomainNameData data = { filter, conn,
> 0, 0, maxnames, names };
> size_t i;
> - virObjectLockRead(doms);
> + if (virObjectLockRead(doms) < 0)
> + return -1;
> virHashForEach(doms->objs, virDomainObjListCopyInactiveNames, &data);
> virObjectUnlock(doms);
> if (data.oom) {
> @@ -792,7 +798,8 @@ virDomainObjListForEach(virDomainObjListPtr doms,
> struct virDomainListIterData data = {
> callback, opaque, 0,
> };
> - virObjectLockRead(doms);
> + if (virObjectLockRead(doms) < 0)
> + return -1;
> virHashForEach(doms->objs, virDomainObjListHelper, &data);
> virObjectUnlock(doms);
> return data.ret;
> @@ -925,7 +932,8 @@ virDomainObjListCollect(virDomainObjListPtr domlist,
> {
> struct virDomainListData data = { NULL, 0 };
>
> - virObjectLockRead(domlist);
> + if (virObjectLockRead(domlist) < 0)
> + return -1;
> sa_assert(domlist->objs);
> if (VIR_ALLOC_N(data.vms, virHashSize(domlist->objs)) < 0) {
> virObjectUnlock(domlist);
> @@ -962,7 +970,8 @@ virDomainObjListConvert(virDomainObjListPtr domlist,
> *nvms = 0;
> *vms = NULL;
>
> - virObjectLockRead(domlist);
> + if (virObjectLockRead(domlist) < 0)
> + return -1;
> for (i = 0; i < ndoms; i++) {
> virDomainPtr dom = doms[i];
>
> diff --git a/src/util/virobject.c b/src/util/virobject.c
> index b1bb378..73de4d3 100644
> --- a/src/util/virobject.c
> +++ b/src/util/virobject.c
> @@ -410,17 +410,21 @@ virObjectLock(void *anyobj)
> * The object must be unlocked before releasing this
> * reference.
> */
> -void
> +int
I'm NACK on this return value change.
> virObjectLockRead(void *anyobj)
> {
> if (virObjectIsClass(anyobj, virObjectRWLockableClass)) {
> virObjectRWLockablePtr obj = anyobj;
> virRWLockRead(&obj->lock);
> + return 0;
> } else {
> virObjectPtr obj = anyobj;
> VIR_WARN("Object %p (%s) is not a virObjectRWLockable instance",
> anyobj, obj ? obj->klass->name : "(unknown)");
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("unable to obtain rwlock for object=%p"), anyobj);
> }
> + return -1;
> }
IMHO this should just be simplified to
virObjectLockRead(void *anyobj)
{
virObjectRWLockablePtr obj = anyobj;
virRWLockRead(&obj->lock);
}
Regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
More information about the libvir-list
mailing list