From nobody Fri May 3 11:49:26 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1507576864506623.2302993590681; Mon, 9 Oct 2017 12:21:04 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 31C4B80477; Mon, 9 Oct 2017 19:21:03 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id BD42D6060A; Mon, 9 Oct 2017 19:21:02 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 5BDC3410B2; Mon, 9 Oct 2017 19:21:01 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v99IvhhE005111 for ; Mon, 9 Oct 2017 14:57:43 -0400 Received: by smtp.corp.redhat.com (Postfix) id 8562F53; Mon, 9 Oct 2017 18:57:43 +0000 (UTC) Received: from localhost.localdomain.com (ovpn-116-17.phx2.redhat.com [10.3.116.17]) by smtp.corp.redhat.com (Postfix) with ESMTP id 4E39060464 for ; Mon, 9 Oct 2017 18:57:43 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 31C4B80477 Authentication-Results: ext-mx04.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx04.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=libvir-list-bounces@redhat.com From: John Ferlan To: libvir-list@redhat.com Date: Mon, 9 Oct 2017 14:57:38 -0400 Message-Id: <20171009185739.26188-2-jferlan@redhat.com> In-Reply-To: <20171009185739.26188-1-jferlan@redhat.com> References: <20171009185739.26188-1-jferlan@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 1/2] secrets: Convert to use ObjectRWLockable X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Mon, 09 Oct 2017 19:21:03 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Let's use the ObjectRWLockable for the various list lock mgmt. Only time need Write lock will be for Add/Remove logic. Signed-off-by: John Ferlan Reviewed-by: Erik Skultety --- src/conf/virsecretobj.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/conf/virsecretobj.c b/src/conf/virsecretobj.c index 4dca152d48..47e0b28968 100644 --- a/src/conf/virsecretobj.c +++ b/src/conf/virsecretobj.c @@ -52,7 +52,7 @@ static void virSecretObjDispose(void *obj); static void virSecretObjListDispose(void *obj); =20 struct _virSecretObjList { - virObjectLockable parent; + virObjectRWLockable parent; =20 /* uuid string -> virSecretObj mapping * for O(1), lockless lookup-by-uuid */ @@ -74,7 +74,7 @@ virSecretObjOnceInit(void) virSecretObjDispose))) return -1; =20 - if (!(virSecretObjListClass =3D virClassNew(virClassForObjectLockable(= ), + if (!(virSecretObjListClass =3D virClassNew(virClassForObjectRWLockabl= e(), "virSecretObjList", sizeof(virSecretObjList), virSecretObjListDispose))) @@ -123,7 +123,7 @@ virSecretObjListNew(void) if (virSecretObjInitialize() < 0) return NULL; =20 - if (!(secrets =3D virObjectLockableNew(virSecretObjListClass))) + if (!(secrets =3D virObjectRWLockableNew(virSecretObjListClass))) return NULL; =20 if (!(secrets->objs =3D virHashCreate(50, virObjectFreeHashData))) { @@ -193,9 +193,9 @@ virSecretObjListFindByUUID(virSecretObjListPtr secrets, { virSecretObjPtr obj; =20 - virObjectLock(secrets); + virObjectRWLockRead(secrets); obj =3D virSecretObjListFindByUUIDLocked(secrets, uuidstr); - virObjectUnlock(secrets); + virObjectRWUnlock(secrets); if (obj) virObjectLock(obj); return obj; @@ -272,9 +272,9 @@ virSecretObjListFindByUsage(virSecretObjListPtr secrets, { virSecretObjPtr obj; =20 - virObjectLock(secrets); + virObjectRWLockRead(secrets); obj =3D virSecretObjListFindByUsageLocked(secrets, usageType, usageID); - virObjectUnlock(secrets); + virObjectRWUnlock(secrets); if (obj) virObjectLock(obj); return obj; @@ -305,12 +305,12 @@ virSecretObjListRemove(virSecretObjListPtr secrets, virObjectRef(obj); virObjectUnlock(obj); =20 - virObjectLock(secrets); + virObjectRWLockWrite(secrets); virObjectLock(obj); virHashRemoveEntry(secrets->objs, uuidstr); virObjectUnlock(obj); virObjectUnref(obj); - virObjectUnlock(secrets); + virObjectRWUnlock(secrets); } =20 =20 @@ -336,7 +336,7 @@ virSecretObjListAdd(virSecretObjListPtr secrets, virSecretObjPtr ret =3D NULL; char uuidstr[VIR_UUID_STRING_BUFLEN]; =20 - virObjectLock(secrets); + virObjectRWLockWrite(secrets); =20 if (oldDef) *oldDef =3D NULL; @@ -405,7 +405,7 @@ virSecretObjListAdd(virSecretObjListPtr secrets, =20 cleanup: virSecretObjEndAPI(&obj); - virObjectUnlock(secrets); + virObjectRWUnlock(secrets); return ret; } =20 @@ -496,9 +496,9 @@ virSecretObjListNumOfSecrets(virSecretObjListPtr secret= s, struct virSecretCountData data =3D { .conn =3D conn, .filter =3D filter, .count =3D 0 }; =20 - virObjectLock(secrets); + virObjectRWLockRead(secrets); virHashForEach(secrets->objs, virSecretObjListNumOfSecretsCallback, &d= ata); - virObjectUnlock(secrets); + virObjectRWUnlock(secrets); =20 return data.count; } @@ -595,15 +595,15 @@ virSecretObjListExport(virConnectPtr conn, .filter =3D filter, .flags =3D flags, .nsecrets =3D 0, .error =3D false }; =20 - virObjectLock(secretobjs); + virObjectRWLockRead(secretobjs); if (secrets && VIR_ALLOC_N(data.secrets, virHashSize(secretobjs->objs) + 1) < 0) { - virObjectUnlock(secretobjs); + virObjectRWUnlock(secretobjs); return -1; } =20 virHashForEach(secretobjs->objs, virSecretObjListExportCallback, &data= ); - virObjectUnlock(secretobjs); + virObjectRWUnlock(secretobjs); =20 if (data.error) goto error; @@ -633,9 +633,9 @@ virSecretObjListGetUUIDs(virSecretObjListPtr secrets, .conn =3D conn, .filter =3D filter, .uuids =3D uuids, .nuuids =3D = 0, .maxuuids =3D maxuuids, .error =3D false }; =20 - virObjectLock(secrets); + virObjectRWLockRead(secrets); virHashForEach(secrets->objs, virSecretObjListGetUUIDsCallback, &data); - virObjectUnlock(secrets); + virObjectRWUnlock(secrets); =20 if (data.error) goto error; --=20 2.13.6 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Fri May 3 11:49:26 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1507576892212332.42762195087175; Mon, 9 Oct 2017 12:21:32 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id DFC4D4A6FB; Mon, 9 Oct 2017 19:21:30 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id BA6A167CE0; Mon, 9 Oct 2017 19:21:30 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 7878C18355C5; Mon, 9 Oct 2017 19:21:30 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v99Ivhw5005116 for ; Mon, 9 Oct 2017 14:57:43 -0400 Received: by smtp.corp.redhat.com (Postfix) id DCD4C53; Mon, 9 Oct 2017 18:57:43 +0000 (UTC) Received: from localhost.localdomain.com (ovpn-116-17.phx2.redhat.com [10.3.116.17]) by smtp.corp.redhat.com (Postfix) with ESMTP id A64C060464 for ; Mon, 9 Oct 2017 18:57:43 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com DFC4D4A6FB Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=libvir-list-bounces@redhat.com From: John Ferlan To: libvir-list@redhat.com Date: Mon, 9 Oct 2017 14:57:39 -0400 Message-Id: <20171009185739.26188-3-jferlan@redhat.com> In-Reply-To: <20171009185739.26188-1-jferlan@redhat.com> References: <20171009185739.26188-1-jferlan@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 2/2] secrets: Introduce virSecretObjListForEachCb X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Mon, 09 Oct 2017 19:21:31 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Rather than separate functions for NumOfSecrets, GetUUIDs, and ListExport - let's converge the code into one handler. Signed-off-by: John Ferlan --- src/conf/virsecretobj.c | 167 ++++++++++++++++----------------------------= ---- 1 file changed, 54 insertions(+), 113 deletions(-) diff --git a/src/conf/virsecretobj.c b/src/conf/virsecretobj.c index 47e0b28968..6046547875 100644 --- a/src/conf/virsecretobj.c +++ b/src/conf/virsecretobj.c @@ -410,64 +410,41 @@ virSecretObjListAdd(virSecretObjListPtr secrets, } =20 =20 -struct virSecretCountData { +typedef bool +(*virSecretObjListMatchFilter)(virSecretObjPtr obj, unsigned int flags); +struct _virSecretForEachData { virConnectPtr conn; virSecretObjListACLFilter filter; - int count; -}; - -static int -virSecretObjListNumOfSecretsCallback(void *payload, - const void *name ATTRIBUTE_UNUSED, - void *opaque) -{ - struct virSecretCountData *data =3D opaque; - virSecretObjPtr obj =3D payload; - virSecretDefPtr def; - - virObjectLock(obj); - def =3D obj->def; - - if (data->filter && !data->filter(data->conn, def)) - goto cleanup; - - data->count++; - - cleanup: - virObjectUnlock(obj); - return 0; -} - - -struct virSecretListData { - virConnectPtr conn; - virSecretObjListACLFilter filter; - int nuuids; - char **uuids; - int maxuuids; + virSecretObjListMatchFilter match; + unsigned int flags; bool error; + int nElems; + int maxElems; + char **uuids; + virSecretPtr *secrets; }; =20 - static int -virSecretObjListGetUUIDsCallback(void *payload, - const void *name ATTRIBUTE_UNUSED, - void *opaque) +virSecretObjListForEachCb(void *payload, + const void *name ATTRIBUTE_UNUSED, + void *opaque) { - struct virSecretListData *data =3D opaque; + struct _virSecretForEachData *data =3D opaque; virSecretObjPtr obj =3D payload; - virSecretDefPtr def; + virSecretPtr secret =3D NULL; =20 if (data->error) return 0; =20 - if (data->maxuuids >=3D 0 && data->nuuids =3D=3D data->maxuuids) + if (data->maxElems >=3D 0 && data->nElems =3D=3D data->maxElems) return 0; =20 virObjectLock(obj); - def =3D obj->def; =20 - if (data->filter && !data->filter(data->conn, def)) + if (data->filter && !data->filter(data->conn, obj->def)) + goto cleanup; + + if (data->match && !data->match(obj, data->flags)) goto cleanup; =20 if (data->uuids) { @@ -478,10 +455,20 @@ virSecretObjListGetUUIDsCallback(void *payload, goto cleanup; } =20 - virUUIDFormat(def->uuid, uuidstr); - data->uuids[data->nuuids++] =3D uuidstr; + virUUIDFormat(obj->def->uuid, uuidstr); + data->uuids[data->nElems] =3D uuidstr; + } else if (data->secrets) { + if (!(secret =3D virGetSecret(data->conn, obj->def->uuid, + obj->def->usage_type, + obj->def->usage_id))) { + data->error =3D true; + goto cleanup; + } + data->secrets[data->nElems] =3D secret; } =20 + data->nElems++; + cleanup: virObjectUnlock(obj); return 0; @@ -493,14 +480,16 @@ virSecretObjListNumOfSecrets(virSecretObjListPtr secr= ets, virSecretObjListACLFilter filter, virConnectPtr conn) { - struct virSecretCountData data =3D { - .conn =3D conn, .filter =3D filter, .count =3D 0 }; + struct _virSecretForEachData data =3D { + .conn =3D conn, .filter =3D filter, .match =3D NULL, + .flags =3D 0, .error =3D false, .nElems =3D 0, .maxElems =3D -1, + .uuids =3D NULL, .secrets =3D NULL }; =20 virObjectRWLockRead(secrets); - virHashForEach(secrets->objs, virSecretObjListNumOfSecretsCallback, &d= ata); + virHashForEach(secrets->objs, virSecretObjListForEachCb, &data); virObjectRWUnlock(secrets); =20 - return data.count; + return data.nElems; } =20 =20 @@ -532,57 +521,6 @@ virSecretObjMatchFlags(virSecretObjPtr obj, #undef MATCH =20 =20 -struct virSecretObjListData { - virConnectPtr conn; - virSecretPtr *secrets; - virSecretObjListACLFilter filter; - unsigned int flags; - int nsecrets; - bool error; -}; - -static int -virSecretObjListExportCallback(void *payload, - const void *name ATTRIBUTE_UNUSED, - void *opaque) -{ - struct virSecretObjListData *data =3D opaque; - virSecretObjPtr obj =3D payload; - virSecretDefPtr def; - virSecretPtr secret =3D NULL; - - if (data->error) - return 0; - - virObjectLock(obj); - def =3D obj->def; - - if (data->filter && !data->filter(data->conn, def)) - goto cleanup; - - if (!virSecretObjMatchFlags(obj, data->flags)) - goto cleanup; - - if (!data->secrets) { - data->nsecrets++; - goto cleanup; - } - - if (!(secret =3D virGetSecret(data->conn, def->uuid, - def->usage_type, - def->usage_id))) { - data->error =3D true; - goto cleanup; - } - - data->secrets[data->nsecrets++] =3D secret; - - cleanup: - virObjectUnlock(obj); - return 0; -} - - int virSecretObjListExport(virConnectPtr conn, virSecretObjListPtr secretobjs, @@ -590,10 +528,10 @@ virSecretObjListExport(virConnectPtr conn, virSecretObjListACLFilter filter, unsigned int flags) { - struct virSecretObjListData data =3D { - .conn =3D conn, .secrets =3D NULL, - .filter =3D filter, .flags =3D flags, - .nsecrets =3D 0, .error =3D false }; + struct _virSecretForEachData data =3D { + .conn =3D conn, .filter =3D filter, .match =3D virSecretObjMatchFl= ags, + .flags =3D flags, .error =3D false, .nElems =3D 0, .maxElems =3D -= 1, + .uuids =3D NULL, .secrets =3D NULL }; =20 virObjectRWLockRead(secretobjs); if (secrets && @@ -601,8 +539,10 @@ virSecretObjListExport(virConnectPtr conn, virObjectRWUnlock(secretobjs); return -1; } + if (data.secrets) + data.maxElems =3D virHashSize(secretobjs->objs) + 1; =20 - virHashForEach(secretobjs->objs, virSecretObjListExportCallback, &data= ); + virHashForEach(secretobjs->objs, virSecretObjListForEachCb, &data); virObjectRWUnlock(secretobjs); =20 if (data.error) @@ -610,11 +550,11 @@ virSecretObjListExport(virConnectPtr conn, =20 if (data.secrets) { /* trim the array to the final size */ - ignore_value(VIR_REALLOC_N(data.secrets, data.nsecrets + 1)); + ignore_value(VIR_REALLOC_N(data.secrets, data.nElems + 1)); *secrets =3D data.secrets; } =20 - return data.nsecrets; + return data.nElems; =20 error: virObjectListFree(data.secrets); @@ -629,22 +569,23 @@ virSecretObjListGetUUIDs(virSecretObjListPtr secrets, virSecretObjListACLFilter filter, virConnectPtr conn) { - struct virSecretListData data =3D { - .conn =3D conn, .filter =3D filter, .uuids =3D uuids, .nuuids =3D = 0, - .maxuuids =3D maxuuids, .error =3D false }; + struct _virSecretForEachData data =3D { + .conn =3D conn, .filter =3D filter, .match =3D NULL, + .flags =3D 0, .error =3D false, .nElems =3D 0, .maxElems =3D maxuu= ids, + .uuids =3D uuids, .secrets =3D NULL }; =20 virObjectRWLockRead(secrets); - virHashForEach(secrets->objs, virSecretObjListGetUUIDsCallback, &data); + virHashForEach(secrets->objs, virSecretObjListForEachCb, &data); virObjectRWUnlock(secrets); =20 if (data.error) goto error; =20 - return data.nuuids; + return data.nElems; =20 error: - while (--data.nuuids) - VIR_FREE(data.uuids[data.nuuids]); + while (--data.nElems) + VIR_FREE(data.uuids[data.nElems]); return -1; } =20 --=20 2.13.6 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list