From nobody Mon Apr 29 12:58:51 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 1512438303746270.4662548938886; Mon, 4 Dec 2017 17:45:03 -0800 (PST) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A5DE368682; Tue, 5 Dec 2017 01:45:02 +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 7AA4760FA3; Tue, 5 Dec 2017 01:45: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 437C23D380; Tue, 5 Dec 2017 01:45:02 +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 vB51ipGV030450 for ; Mon, 4 Dec 2017 20:44:51 -0500 Received: by smtp.corp.redhat.com (Postfix) id E9326189B9; Tue, 5 Dec 2017 01:44:51 +0000 (UTC) Received: from localhost.localdomain.com (ovpn-117-84.phx2.redhat.com [10.3.117.84]) by smtp.corp.redhat.com (Postfix) with ESMTP id B01C6189B7 for ; Tue, 5 Dec 2017 01:44:51 +0000 (UTC) From: John Ferlan To: libvir-list@redhat.com Date: Mon, 4 Dec 2017 20:43:52 -0500 Message-Id: <20171205014355.30524-2-jferlan@redhat.com> In-Reply-To: <20171205014355.30524-1-jferlan@redhat.com> References: <20171205014355.30524-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/4] storage: Fix path check in storagePoolLookupByTargetPath 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.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Tue, 05 Dec 2017 01:45:03 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Commit id '5ab746b8' introduced the function as perhaps a copy of storageVolLookupByPath; however, it did not use the @cleanpath variable even though it used the virFileSanitizePath. So in essance the only "check" being done for failure is whether it was possible to strdup the path. Looking at the virStoragePoolDefParseXML one will note that the target.path is stored using the result of virFileSanitizePath. Therefore, this function should sanitize and use the input @path for the argument to storagePoolLookupByTargetPathCallback which is comparing against stored target.path values. Additionally, if there was an error we should use the proper error of VIR_ERR_NO_STORAGE_POOL (instead of VIR_ERR_NO_STORAGE_VOL). Signed-off-by: John Ferlan --- src/storage/storage_driver.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c index 561ca36f9..699a38281 100644 --- a/src/storage/storage_driver.c +++ b/src/storage/storage_driver.c @@ -1667,7 +1667,7 @@ storagePoolLookupByTargetPath(virConnectPtr conn, storageDriverLock(); if ((obj =3D virStoragePoolObjListSearch(&driver->pools, storagePoolLookupByTargetPathCa= llback, - path))) { + cleanpath))) { def =3D virStoragePoolObjGetDef(obj); pool =3D virGetStoragePool(conn, def->name, def->uuid, NULL, NULL); virStoragePoolObjEndAPI(&obj); @@ -1675,9 +1675,15 @@ storagePoolLookupByTargetPath(virConnectPtr conn, storageDriverUnlock(); =20 if (!pool) { - virReportError(VIR_ERR_NO_STORAGE_VOL, - _("no storage pool with matching target path '%s'"), - path); + if (STREQ(path, cleanpath)) { + virReportError(VIR_ERR_NO_STORAGE_POOL, + _("no storage pool with matching target path '%= s'"), + path); + } else { + virReportError(VIR_ERR_NO_STORAGE_POOL, + _("no storage pool with matching target path '%= s' (%s)"), + path, cleanpath); + } } =20 VIR_FREE(cleanpath); --=20 2.13.6 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Mon Apr 29 12:58:51 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 1512438307398224.13005844360225; Mon, 4 Dec 2017 17:45:07 -0800 (PST) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 496C47F7C2; Tue, 5 Dec 2017 01:45:06 +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 23ACA189D6; Tue, 5 Dec 2017 01:45:06 +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 BAF0D1800C87; Tue, 5 Dec 2017 01:45:05 +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 vB51iqgO030455 for ; Mon, 4 Dec 2017 20:44:52 -0500 Received: by smtp.corp.redhat.com (Postfix) id 64427189B9; Tue, 5 Dec 2017 01:44:52 +0000 (UTC) Received: from localhost.localdomain.com (ovpn-117-84.phx2.redhat.com [10.3.117.84]) by smtp.corp.redhat.com (Postfix) with ESMTP id 1869F189B7 for ; Tue, 5 Dec 2017 01:44:52 +0000 (UTC) From: John Ferlan To: libvir-list@redhat.com Date: Mon, 4 Dec 2017 20:43:53 -0500 Message-Id: <20171205014355.30524-3-jferlan@redhat.com> In-Reply-To: <20171205014355.30524-1-jferlan@redhat.com> References: <20171205014355.30524-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/4] storage: Privatize virStoragePoolObjListPtr 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.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Tue, 05 Dec 2017 01:45:06 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Move the structure into virstorageobj.c. Use the virStoragePoolObjListNew allocator to fill in the @pools for the storage driver and test driver. Signed-off-by: John Ferlan --- src/conf/virstorageobj.c | 19 +++++++++++- src/conf/virstorageobj.h | 9 +++--- src/libvirt_private.syms | 1 + src/storage/storage_driver.c | 69 +++++++++++++++++++++++-----------------= ---- src/test/test_driver.c | 46 ++++++++++++++--------------- 5 files changed, 82 insertions(+), 62 deletions(-) diff --git a/src/conf/virstorageobj.c b/src/conf/virstorageobj.c index 357e6a967..a48346b24 100644 --- a/src/conf/virstorageobj.c +++ b/src/conf/virstorageobj.c @@ -62,6 +62,11 @@ struct _virStoragePoolObj { virStorageVolDefList volumes; }; =20 +struct _virStoragePoolObjList { + size_t count; + virStoragePoolObjPtr *objs; +}; + =20 static int virStoragePoolObjOnceInit(void) @@ -241,7 +246,19 @@ virStoragePoolObjListFree(virStoragePoolObjListPtr poo= ls) for (i =3D 0; i < pools->count; i++) virObjectUnref(pools->objs[i]); VIR_FREE(pools->objs); - pools->count =3D 0; + VIR_FREE(pools); +} + + +virStoragePoolObjListPtr +virStoragePoolObjListNew(void) +{ + virStoragePoolObjListPtr pools; + + if (VIR_ALLOC(pools) < 0) + return NULL; + + return pools; } =20 =20 diff --git a/src/conf/virstorageobj.h b/src/conf/virstorageobj.h index 34c4c9e10..d4165fbe7 100644 --- a/src/conf/virstorageobj.h +++ b/src/conf/virstorageobj.h @@ -29,10 +29,6 @@ typedef virStoragePoolObj *virStoragePoolObjPtr; =20 typedef struct _virStoragePoolObjList virStoragePoolObjList; typedef virStoragePoolObjList *virStoragePoolObjListPtr; -struct _virStoragePoolObjList { - size_t count; - virStoragePoolObjPtr *objs; -}; =20 typedef struct _virStorageDriverState virStorageDriverState; typedef virStorageDriverState *virStorageDriverStatePtr; @@ -40,7 +36,7 @@ typedef virStorageDriverState *virStorageDriverStatePtr; struct _virStorageDriverState { virMutex lock; =20 - virStoragePoolObjList pools; + virStoragePoolObjListPtr pools; =20 char *configDir; char *autostartDir; @@ -244,6 +240,9 @@ virStoragePoolObjListSearch(virStoragePoolObjListPtr po= ols, virStoragePoolObjListSearcher searcher, const void *opaque); =20 +virStoragePoolObjListPtr +virStoragePoolObjListNew(void); + void virStoragePoolObjRemove(virStoragePoolObjListPtr pools, virStoragePoolObjPtr obj); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 53057aa82..e4744378c 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1096,6 +1096,7 @@ virStoragePoolObjIsDuplicate; virStoragePoolObjListExport; virStoragePoolObjListForEach; virStoragePoolObjListFree; +virStoragePoolObjListNew; virStoragePoolObjListSearch; virStoragePoolObjLoadAllConfigs; virStoragePoolObjLoadAllState; diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c index 699a38281..e0748615a 100644 --- a/src/storage/storage_driver.c +++ b/src/storage/storage_driver.c @@ -93,7 +93,7 @@ virStoragePoolUpdateInactive(virStoragePoolObjPtr *objptr) virStoragePoolObjPtr obj =3D *objptr; =20 if (!virStoragePoolObjGetConfigFile(obj)) { - virStoragePoolObjRemove(&driver->pools, obj); + virStoragePoolObjRemove(driver->pools, obj); *objptr =3D NULL; } else if (virStoragePoolObjGetNewDef(obj)) { virStoragePoolObjDefUseNewDef(obj); @@ -162,7 +162,7 @@ storagePoolUpdateStateCallback(virStoragePoolObjPtr obj, static void storagePoolUpdateAllState(void) { - virStoragePoolObjListForEach(&driver->pools, + virStoragePoolObjListForEach(driver->pools, storagePoolUpdateStateCallback, NULL); } @@ -227,7 +227,7 @@ storageDriverAutostart(void) conn =3D virConnectOpen("qemu:///session"); /* Ignoring NULL conn - let backends decide */ =20 - virStoragePoolObjListForEach(&driver->pools, + virStoragePoolObjListForEach(driver->pools, storageDriverAutostartCallback, conn); =20 @@ -257,6 +257,9 @@ storageStateInitialize(bool privileged, } storageDriverLock(); =20 + if (!(driver->pools =3D virStoragePoolObjListNew())) + goto error; + if (privileged) { if (VIR_STRDUP(driver->configDir, SYSCONFDIR "/libvirt/storage") < 0 || @@ -288,11 +291,11 @@ storageStateInitialize(bool privileged, goto error; } =20 - if (virStoragePoolObjLoadAllState(&driver->pools, + if (virStoragePoolObjLoadAllState(driver->pools, driver->stateDir) < 0) goto error; =20 - if (virStoragePoolObjLoadAllConfigs(&driver->pools, + if (virStoragePoolObjLoadAllConfigs(driver->pools, driver->configDir, driver->autostartDir) < 0) goto error; @@ -344,9 +347,9 @@ storageStateReload(void) return -1; =20 storageDriverLock(); - virStoragePoolObjLoadAllState(&driver->pools, + virStoragePoolObjLoadAllState(driver->pools, driver->stateDir); - virStoragePoolObjLoadAllConfigs(&driver->pools, + virStoragePoolObjLoadAllConfigs(driver->pools, driver->configDir, driver->autostartDir); storageDriverAutostart(); @@ -372,7 +375,7 @@ storageStateCleanup(void) virObjectUnref(driver->storageEventState); =20 /* free inactive pools */ - virStoragePoolObjListFree(&driver->pools); + virStoragePoolObjListFree(driver->pools); =20 VIR_FREE(driver->configDir); VIR_FREE(driver->autostartDir); @@ -392,7 +395,7 @@ storagePoolObjFindByUUID(const unsigned char *uuid, virStoragePoolObjPtr obj; char uuidstr[VIR_UUID_STRING_BUFLEN]; =20 - if (!(obj =3D virStoragePoolObjFindByUUID(&driver->pools, uuid))) { + if (!(obj =3D virStoragePoolObjFindByUUID(driver->pools, uuid))) { virUUIDFormat(uuid, uuidstr); if (name) virReportError(VIR_ERR_NO_STORAGE_POOL, @@ -427,7 +430,7 @@ storagePoolObjFindByName(const char *name) virStoragePoolObjPtr obj; =20 storageDriverLock(); - if (!(obj =3D virStoragePoolObjFindByName(&driver->pools, name))) + if (!(obj =3D virStoragePoolObjFindByName(driver->pools, name))) virReportError(VIR_ERR_NO_STORAGE_POOL, _("no storage pool with matching name '%s'"), name); storageDriverUnlock(); @@ -513,7 +516,7 @@ storageConnectNumOfStoragePools(virConnectPtr conn) return -1; =20 storageDriverLock(); - nactive =3D virStoragePoolObjNumOfStoragePools(&driver->pools, conn, t= rue, + nactive =3D virStoragePoolObjNumOfStoragePools(driver->pools, conn, tr= ue, virConnectNumOfStoragePoo= lsCheckACL); storageDriverUnlock(); =20 @@ -532,7 +535,7 @@ storageConnectListStoragePools(virConnectPtr conn, return -1; =20 storageDriverLock(); - got =3D virStoragePoolObjGetNames(&driver->pools, conn, true, + got =3D virStoragePoolObjGetNames(driver->pools, conn, true, virConnectListStoragePoolsCheckACL, names, maxnames); storageDriverUnlock(); @@ -548,7 +551,7 @@ storageConnectNumOfDefinedStoragePools(virConnectPtr co= nn) return -1; =20 storageDriverLock(); - nactive =3D virStoragePoolObjNumOfStoragePools(&driver->pools, conn, f= alse, + nactive =3D virStoragePoolObjNumOfStoragePools(driver->pools, conn, fa= lse, virConnectNumOfDefinedSto= ragePoolsCheckACL); storageDriverUnlock(); =20 @@ -567,7 +570,7 @@ storageConnectListDefinedStoragePools(virConnectPtr con= n, return -1; =20 storageDriverLock(); - got =3D virStoragePoolObjGetNames(&driver->pools, conn, false, + got =3D virStoragePoolObjGetNames(driver->pools, conn, false, virConnectListDefinedStoragePoolsCheck= ACL, names, maxnames); storageDriverUnlock(); @@ -686,16 +689,16 @@ storagePoolCreateXML(virConnectPtr conn, if (virStoragePoolCreateXMLEnsureACL(conn, newDef) < 0) goto cleanup; =20 - if (virStoragePoolObjIsDuplicate(&driver->pools, newDef, 1) < 0) + if (virStoragePoolObjIsDuplicate(driver->pools, newDef, 1) < 0) goto cleanup; =20 - if (virStoragePoolObjSourceFindDuplicate(conn, &driver->pools, newDef)= < 0) + if (virStoragePoolObjSourceFindDuplicate(conn, driver->pools, newDef) = < 0) goto cleanup; =20 if ((backend =3D virStorageBackendForType(newDef->type)) =3D=3D NULL) goto cleanup; =20 - if (!(obj =3D virStoragePoolObjAssignDef(&driver->pools, newDef))) + if (!(obj =3D virStoragePoolObjAssignDef(driver->pools, newDef))) goto cleanup; newDef =3D NULL; def =3D virStoragePoolObjGetDef(obj); @@ -709,7 +712,7 @@ storagePoolCreateXML(virConnectPtr conn, if (build_flags || (flags & VIR_STORAGE_POOL_CREATE_WITH_BUILD)) { if (backend->buildPool(conn, obj, build_flags) < 0) { - virStoragePoolObjRemove(&driver->pools, obj); + virStoragePoolObjRemove(driver->pools, obj); obj =3D NULL; goto cleanup; } @@ -718,7 +721,7 @@ storagePoolCreateXML(virConnectPtr conn, =20 if (backend->startPool && backend->startPool(conn, obj) < 0) { - virStoragePoolObjRemove(&driver->pools, obj); + virStoragePoolObjRemove(driver->pools, obj); obj =3D NULL; goto cleanup; } @@ -732,7 +735,7 @@ storagePoolCreateXML(virConnectPtr conn, unlink(stateFile); if (backend->stopPool) backend->stopPool(conn, obj); - virStoragePoolObjRemove(&driver->pools, obj); + virStoragePoolObjRemove(driver->pools, obj); obj =3D NULL; goto cleanup; } @@ -780,22 +783,22 @@ storagePoolDefineXML(virConnectPtr conn, if (virStoragePoolDefineXMLEnsureACL(conn, newDef) < 0) goto cleanup; =20 - if (virStoragePoolObjIsDuplicate(&driver->pools, newDef, 0) < 0) + if (virStoragePoolObjIsDuplicate(driver->pools, newDef, 0) < 0) goto cleanup; =20 - if (virStoragePoolObjSourceFindDuplicate(conn, &driver->pools, newDef)= < 0) + if (virStoragePoolObjSourceFindDuplicate(conn, driver->pools, newDef) = < 0) goto cleanup; =20 if (virStorageBackendForType(newDef->type) =3D=3D NULL) goto cleanup; =20 - if (!(obj =3D virStoragePoolObjAssignDef(&driver->pools, newDef))) + if (!(obj =3D virStoragePoolObjAssignDef(driver->pools, newDef))) goto cleanup; newDef =3D NULL; def =3D virStoragePoolObjGetDef(obj); =20 if (virStoragePoolObjSaveDef(driver, obj, def) < 0) { - virStoragePoolObjRemove(&driver->pools, obj); + virStoragePoolObjRemove(driver->pools, obj); obj =3D NULL; goto cleanup; } @@ -864,7 +867,7 @@ storagePoolUndefine(virStoragePoolPtr pool) 0); =20 VIR_INFO("Undefining storage pool '%s'", def->name); - virStoragePoolObjRemove(&driver->pools, obj); + virStoragePoolObjRemove(driver->pools, obj); obj =3D NULL; ret =3D 0; =20 @@ -1521,7 +1524,7 @@ storageVolLookupByKey(virConnectPtr conn, virStorageVolPtr vol =3D NULL; =20 storageDriverLock(); - if ((obj =3D virStoragePoolObjListSearch(&driver->pools, + if ((obj =3D virStoragePoolObjListSearch(driver->pools, storageVolLookupByKeyCallback, &data)) && data.voldef) { def =3D virStoragePoolObjGetDef(obj); @@ -1606,7 +1609,7 @@ storageVolLookupByPath(virConnectPtr conn, return NULL; =20 storageDriverLock(); - if ((obj =3D virStoragePoolObjListSearch(&driver->pools, + if ((obj =3D virStoragePoolObjListSearch(driver->pools, storageVolLookupByPathCallback, &data)) && data.voldef) { def =3D virStoragePoolObjGetDef(obj); @@ -1665,7 +1668,7 @@ storagePoolLookupByTargetPath(virConnectPtr conn, return NULL; =20 storageDriverLock(); - if ((obj =3D virStoragePoolObjListSearch(&driver->pools, + if ((obj =3D virStoragePoolObjListSearch(driver->pools, storagePoolLookupByTargetPathCa= llback, cleanpath))) { def =3D virStoragePoolObjGetDef(obj); @@ -1971,10 +1974,10 @@ storageVolCreateXMLFrom(virStoragePoolPtr pool, NULL); =20 storageDriverLock(); - obj =3D virStoragePoolObjFindByUUID(&driver->pools, pool->uuid); + obj =3D virStoragePoolObjFindByUUID(driver->pools, pool->uuid); if (obj && STRNEQ(pool->name, volsrc->pool)) { virObjectUnlock(obj); - objsrc =3D virStoragePoolObjFindByName(&driver->pools, volsrc->poo= l); + objsrc =3D virStoragePoolObjFindByName(driver->pools, volsrc->pool= ); virObjectLock(obj); } storageDriverUnlock(); @@ -2271,7 +2274,7 @@ virStorageVolPoolRefreshThread(void *opaque) if (virStorageBackendPloopRestoreDesc(cbdata->vol_path) < 0) goto cleanup; } - if (!(obj =3D virStoragePoolObjFindByName(&driver->pools, + if (!(obj =3D virStoragePoolObjFindByName(driver->pools, cbdata->pool_name))) goto cleanup; def =3D virStoragePoolObjGetDef(obj); @@ -2687,7 +2690,7 @@ storageConnectListAllStoragePools(virConnectPtr conn, goto cleanup; =20 storageDriverLock(); - ret =3D virStoragePoolObjListExport(conn, &driver->pools, pools, + ret =3D virStoragePoolObjListExport(conn, driver->pools, pools, virConnectListAllStoragePoolsCheckAC= L, flags); storageDriverUnlock(); @@ -3092,7 +3095,7 @@ virStoragePoolObjFindPoolByUUID(const unsigned char *= uuid) virStoragePoolObjPtr obj; =20 storageDriverLock(); - obj =3D virStoragePoolObjFindByUUID(&driver->pools, uuid); + obj =3D virStoragePoolObjFindByUUID(driver->pools, uuid); storageDriverUnlock(); return obj; } diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 25b6592bc..531e2880c 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -100,7 +100,7 @@ struct _testDriver { virInterfaceObjListPtr ifaces; bool transaction_running; virInterfaceObjListPtr backupIfaces; - virStoragePoolObjList pools; + virStoragePoolObjListPtr pools; virNodeDeviceObjListPtr devs; int numCells; testCell cells[MAX_CELLS]; @@ -155,7 +155,7 @@ testDriverFree(testDriverPtr driver) virNodeDeviceObjListFree(driver->devs); virObjectUnref(driver->networks); virObjectUnref(driver->ifaces); - virStoragePoolObjListFree(&driver->pools); + virStoragePoolObjListFree(driver->pools); virObjectUnref(driver->eventState); virMutexUnlock(&driver->lock); virMutexDestroy(&driver->lock); @@ -419,7 +419,8 @@ testDriverNew(void) !(ret->ifaces =3D virInterfaceObjListNew()) || !(ret->domains =3D virDomainObjListNew()) || !(ret->networks =3D virNetworkObjListNew()) || - !(ret->devs =3D virNodeDeviceObjListNew())) + !(ret->devs =3D virNodeDeviceObjListNew()) || + !(ret->pools =3D virStoragePoolObjListNew())) goto error; =20 virAtomicIntSet(&ret->nextDomID, 1); @@ -1112,8 +1113,7 @@ testParseStorage(testDriverPtr privconn, if (!def) goto error; =20 - if (!(obj =3D virStoragePoolObjAssignDef(&privconn->pools, - def))) { + if (!(obj =3D virStoragePoolObjAssignDef(privconn->pools, def))) { virStoragePoolDefFree(def); goto error; } @@ -4076,7 +4076,7 @@ testStoragePoolObjFindByName(testDriverPtr privconn, virStoragePoolObjPtr obj; =20 testDriverLock(privconn); - obj =3D virStoragePoolObjFindByName(&privconn->pools, name); + obj =3D virStoragePoolObjFindByName(privconn->pools, name); testDriverUnlock(privconn); =20 if (!obj) @@ -4136,7 +4136,7 @@ testStoragePoolObjFindByUUID(testDriverPtr privconn, char uuidstr[VIR_UUID_STRING_BUFLEN]; =20 testDriverLock(privconn); - obj =3D virStoragePoolObjFindByUUID(&privconn->pools, uuid); + obj =3D virStoragePoolObjFindByUUID(privconn->pools, uuid); testDriverUnlock(privconn); =20 if (!obj) { @@ -4204,7 +4204,7 @@ testConnectNumOfStoragePools(virConnectPtr conn) int numActive =3D 0; =20 testDriverLock(privconn); - numActive =3D virStoragePoolObjNumOfStoragePools(&privconn->pools, con= n, + numActive =3D virStoragePoolObjNumOfStoragePools(privconn->pools, conn, true, NULL); testDriverUnlock(privconn); =20 @@ -4221,7 +4221,7 @@ testConnectListStoragePools(virConnectPtr conn, int n =3D 0; =20 testDriverLock(privconn); - n =3D virStoragePoolObjGetNames(&privconn->pools, conn, true, NULL, + n =3D virStoragePoolObjGetNames(privconn->pools, conn, true, NULL, names, maxnames); testDriverUnlock(privconn); =20 @@ -4236,7 +4236,7 @@ testConnectNumOfDefinedStoragePools(virConnectPtr con= n) int numInactive =3D 0; =20 testDriverLock(privconn); - numInactive =3D virStoragePoolObjNumOfStoragePools(&privconn->pools, c= onn, + numInactive =3D virStoragePoolObjNumOfStoragePools(privconn->pools, co= nn, false, NULL); testDriverUnlock(privconn); =20 @@ -4253,7 +4253,7 @@ testConnectListDefinedStoragePools(virConnectPtr conn, int n =3D 0; =20 testDriverLock(privconn); - n =3D virStoragePoolObjGetNames(&privconn->pools, conn, false, NULL, + n =3D virStoragePoolObjGetNames(privconn->pools, conn, false, NULL, names, maxnames); testDriverUnlock(privconn); =20 @@ -4272,7 +4272,7 @@ testConnectListAllStoragePools(virConnectPtr conn, virCheckFlags(VIR_CONNECT_LIST_STORAGE_POOLS_FILTERS_ALL, -1); =20 testDriverLock(privconn); - ret =3D virStoragePoolObjListExport(conn, &privconn->pools, pools, + ret =3D virStoragePoolObjListExport(conn, privconn->pools, pools, NULL, flags); testDriverUnlock(privconn); =20 @@ -4440,16 +4440,16 @@ testStoragePoolCreateXML(virConnectPtr conn, if (!(newDef =3D virStoragePoolDefParseString(xml))) goto cleanup; =20 - obj =3D virStoragePoolObjFindByUUID(&privconn->pools, newDef->uuid); + obj =3D virStoragePoolObjFindByUUID(privconn->pools, newDef->uuid); if (!obj) - obj =3D virStoragePoolObjFindByName(&privconn->pools, newDef->name= ); + obj =3D virStoragePoolObjFindByName(privconn->pools, newDef->name); if (obj) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("storage pool already exists")); goto cleanup; } =20 - if (!(obj =3D virStoragePoolObjAssignDef(&privconn->pools, newDef))) + if (!(obj =3D virStoragePoolObjAssignDef(privconn->pools, newDef))) goto cleanup; newDef =3D NULL; def =3D virStoragePoolObjGetDef(obj); @@ -4462,14 +4462,14 @@ testStoragePoolCreateXML(virConnectPtr conn, if (testCreateVport(privconn, def->source.adapter.data.fchost.wwnn, def->source.adapter.data.fchost.wwpn) < 0) { - virStoragePoolObjRemove(&privconn->pools, obj); + virStoragePoolObjRemove(privconn->pools, obj); obj =3D NULL; goto cleanup; } } =20 if (testStoragePoolObjSetDefaults(obj) =3D=3D -1) { - virStoragePoolObjRemove(&privconn->pools, obj); + virStoragePoolObjRemove(privconn->pools, obj); obj =3D NULL; goto cleanup; } @@ -4518,7 +4518,7 @@ testStoragePoolDefineXML(virConnectPtr conn, newDef->allocation =3D defaultPoolAlloc; newDef->available =3D defaultPoolCap - defaultPoolAlloc; =20 - if (!(obj =3D virStoragePoolObjAssignDef(&privconn->pools, newDef))) + if (!(obj =3D virStoragePoolObjAssignDef(privconn->pools, newDef))) goto cleanup; newDef =3D NULL; def =3D virStoragePoolObjGetDef(obj); @@ -4528,7 +4528,7 @@ testStoragePoolDefineXML(virConnectPtr conn, 0); =20 if (testStoragePoolObjSetDefaults(obj) =3D=3D -1) { - virStoragePoolObjRemove(&privconn->pools, obj); + virStoragePoolObjRemove(privconn->pools, obj); obj =3D NULL; goto cleanup; } @@ -4558,7 +4558,7 @@ testStoragePoolUndefine(virStoragePoolPtr pool) VIR_STORAGE_POOL_EVENT_UNDEFIN= ED, 0); =20 - virStoragePoolObjRemove(&privconn->pools, obj); + virStoragePoolObjRemove(privconn->pools, obj); =20 testObjectEventQueue(privconn, event); return 0; @@ -4651,7 +4651,7 @@ testStoragePoolDestroy(virStoragePoolPtr pool) 0); =20 if (!(virStoragePoolObjGetConfigFile(obj))) { - virStoragePoolObjRemove(&privconn->pools, obj); + virStoragePoolObjRemove(privconn->pools, obj); obj =3D NULL; } ret =3D 0; @@ -4940,7 +4940,7 @@ testStorageVolLookupByKey(virConnectPtr conn, virStorageVolPtr vol =3D NULL; =20 testDriverLock(privconn); - if ((obj =3D virStoragePoolObjListSearch(&privconn->pools, + if ((obj =3D virStoragePoolObjListSearch(privconn->pools, testStorageVolLookupByKeyCallba= ck, &data)) && data.voldef) { def =3D virStoragePoolObjGetDef(obj); @@ -4984,7 +4984,7 @@ testStorageVolLookupByPath(virConnectPtr conn, virStorageVolPtr vol =3D NULL; =20 testDriverLock(privconn); - if ((obj =3D virStoragePoolObjListSearch(&privconn->pools, + if ((obj =3D virStoragePoolObjListSearch(privconn->pools, testStorageVolLookupByPathCallb= ack, &data)) && data.voldef) { def =3D virStoragePoolObjGetDef(obj); --=20 2.13.6 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Mon Apr 29 12:58:51 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 15124382961811010.6767725570127; Mon, 4 Dec 2017 17:44:56 -0800 (PST) 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 4189161D20; Tue, 5 Dec 2017 01:44:55 +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 12C874D5; Tue, 5 Dec 2017 01:44:55 +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 BD0F81809547; Tue, 5 Dec 2017 01:44:53 +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 vB51iqt0030461 for ; Mon, 4 Dec 2017 20:44:52 -0500 Received: by smtp.corp.redhat.com (Postfix) id D55F1189B9; Tue, 5 Dec 2017 01:44:52 +0000 (UTC) Received: from localhost.localdomain.com (ovpn-117-84.phx2.redhat.com [10.3.117.84]) by smtp.corp.redhat.com (Postfix) with ESMTP id 87790189B7 for ; Tue, 5 Dec 2017 01:44:52 +0000 (UTC) From: John Ferlan To: libvir-list@redhat.com Date: Mon, 4 Dec 2017 20:43:54 -0500 Message-Id: <20171205014355.30524-4-jferlan@redhat.com> In-Reply-To: <20171205014355.30524-1-jferlan@redhat.com> References: <20171205014355.30524-1-jferlan@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 3/4] storage: Convert virStoragePoolObjList to use virObjectRWLockable 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.39]); Tue, 05 Dec 2017 01:44:55 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Now that we have a private storage pool list, we can take the next step and convert to using objects. In this case, we're going to use RWLockable objects (just like every other driver) with two hash tables for lookup by UUID or Name. Along the way the ForEach and Search API's will be adjusted to use the related Hash API's and the various FindBy functions altered and augmented to allow for HashLookup w/ and w/o the pool lock already taken. After virStoragePoolObjRemove we will need to virObjectUnref(obj) after to indicate the caller is "done" with it's reference. The Unlock occurs during the Remove. The NumOf, GetNames, and Export functions all have their own callback functions to return the required data and the FindDuplicate code can use the HashSearch function callbacks. Signed-off-by: John Ferlan --- src/conf/virstorageobj.c | 638 +++++++++++++++++++++++++++++----------= ---- src/conf/virstorageobj.h | 3 - src/libvirt_private.syms | 1 - src/storage/storage_driver.c | 8 +- src/test/test_driver.c | 7 +- 5 files changed, 449 insertions(+), 208 deletions(-) diff --git a/src/conf/virstorageobj.c b/src/conf/virstorageobj.c index a48346b24..0e5c98bf7 100644 --- a/src/conf/virstorageobj.c +++ b/src/conf/virstorageobj.c @@ -27,6 +27,7 @@ #include "viralloc.h" #include "virerror.h" #include "virfile.h" +#include "virhash.h" #include "virlog.h" #include "virscsihost.h" #include "virstring.h" @@ -37,9 +38,12 @@ VIR_LOG_INIT("conf.virstorageobj"); =20 static virClassPtr virStoragePoolObjClass; +static virClassPtr virStoragePoolObjListClass; =20 static void virStoragePoolObjDispose(void *opaque); +static void +virStoragePoolObjListDispose(void *opaque); =20 =20 struct _virStorageVolDefList { @@ -63,8 +67,15 @@ struct _virStoragePoolObj { }; =20 struct _virStoragePoolObjList { - size_t count; - virStoragePoolObjPtr *objs; + virObjectRWLockable parent; + + /* uuid string -> virStoragePoolObj mapping + * for (1), lockless lookup-by-uuid */ + virHashTable *objs; + + /* name string -> virStoragePoolObj mapping + * for (1), lockless lookup-by-name */ + virHashTable *objsName; }; =20 =20 @@ -77,6 +88,12 @@ virStoragePoolObjOnceInit(void) virStoragePoolObjDispose))) return -1; =20 + if (!(virStoragePoolObjListClass =3D virClassNew(virClassForObjectRWLo= ckable(), + "virStoragePoolObjList", + sizeof(virStoragePoolOb= jList), + virStoragePoolObjListDi= spose))) + return -1; + return 0; } =20 @@ -240,13 +257,15 @@ virStoragePoolObjDispose(void *opaque) =20 =20 void -virStoragePoolObjListFree(virStoragePoolObjListPtr pools) +virStoragePoolObjListDispose(void *opaque) { - size_t i; - for (i =3D 0; i < pools->count; i++) - virObjectUnref(pools->objs[i]); - VIR_FREE(pools->objs); - VIR_FREE(pools); + virStoragePoolObjListPtr pools =3D opaque; + + if (!pools) + return; + + virHashFree(pools->objs); + virHashFree(pools->objsName); } =20 =20 @@ -255,13 +274,44 @@ virStoragePoolObjListNew(void) { virStoragePoolObjListPtr pools; =20 - if (VIR_ALLOC(pools) < 0) + if (virStoragePoolObjInitialize() < 0) + return NULL; + + if (!(pools =3D virObjectRWLockableNew(virStoragePoolObjListClass))) + return NULL; + + if (!(pools->objs =3D virHashCreate(20, virObjectFreeHashData)) || + !(pools->objsName =3D virHashCreate(20, virObjectFreeHashData))) { + virObjectUnref(pools); return NULL; + } =20 return pools; } =20 =20 +struct _virStoragePoolObjListForEachData { + virStoragePoolObjListIterator iter; + const void *opaque; +}; + +static int +virStoragePoolObjListForEachCb(void *payload, + const void *name ATTRIBUTE_UNUSED, + void *opaque) +{ + virStoragePoolObjPtr obj =3D payload; + struct _virStoragePoolObjListForEachData *data =3D + (struct _virStoragePoolObjListForEachData *)opaque; + + virObjectLock(obj); + data->iter(obj, data->opaque); + virObjectUnlock(obj); + + return 0; +} + + /** * virStoragePoolObjListForEach * @pools: Pointer to pools object @@ -279,15 +329,35 @@ virStoragePoolObjListForEach(virStoragePoolObjListPtr= pools, virStoragePoolObjListIterator iter, const void *opaque) { - size_t i; - virStoragePoolObjPtr obj; + struct _virStoragePoolObjListForEachData data =3D { .iter =3D iter, + .opaque =3D opaque }; =20 - for (i =3D 0; i < pools->count; i++) { - obj =3D pools->objs[i]; - virObjectLock(obj); - iter(obj, opaque); - virObjectUnlock(obj); - } + virObjectRWLockRead(pools); + virHashForEach(pools->objs, virStoragePoolObjListForEachCb, &data); + virObjectRWUnlock(pools); +} + + +struct _virStoragePoolObjListSearchData { + virStoragePoolObjListSearcher searcher; + const void *opaque; +}; + + +static int +virStoragePoolObjListSearchCb(const void *payload, + const void *name ATTRIBUTE_UNUSED, + const void *opaque) +{ + virStoragePoolObjPtr obj =3D (virStoragePoolObjPtr) payload; + struct _virStoragePoolObjListSearchData *data =3D + (struct _virStoragePoolObjListSearchData *)opaque; + + virObjectLock(obj); + if (data->searcher(obj, data->opaque)) + return 1; + virObjectUnlock(obj); + return 0; } =20 =20 @@ -308,18 +378,15 @@ virStoragePoolObjListSearch(virStoragePoolObjListPtr = pools, virStoragePoolObjListSearcher searcher, const void *opaque) { - size_t i; - virStoragePoolObjPtr obj; + virStoragePoolObjPtr obj =3D NULL; + struct _virStoragePoolObjListSearchData data =3D { .searcher =3D searc= her, + .opaque =3D opaque }; =20 - for (i =3D 0; i < pools->count; i++) { - obj =3D pools->objs[i]; - virObjectLock(obj); - if (searcher(obj, opaque)) - return virObjectRef(obj); - virObjectUnlock(obj); - } + virObjectRWLockRead(pools); + obj =3D virHashSearch(pools->objs, virStoragePoolObjListSearchCb, &dat= a, NULL); + virObjectRWUnlock(pools); =20 - return NULL; + return virObjectRef(obj); } =20 =20 @@ -327,59 +394,88 @@ void virStoragePoolObjRemove(virStoragePoolObjListPtr pools, virStoragePoolObjPtr obj) { - size_t i; + char uuidstr[VIR_UUID_STRING_BUFLEN]; =20 + virUUIDFormat(obj->def->uuid, uuidstr); + virObjectRef(obj); virObjectUnlock(obj); + virObjectRWLockWrite(pools); + virObjectLock(obj); + virHashRemoveEntry(pools->objs, uuidstr); + virHashRemoveEntry(pools->objsName, obj->def->name); + virObjectUnlock(obj); + virObjectUnref(obj); + virObjectRWUnlock(pools); +} =20 - for (i =3D 0; i < pools->count; i++) { - virObjectLock(pools->objs[i]); - if (pools->objs[i] =3D=3D obj) { - virObjectUnlock(pools->objs[i]); - virObjectUnref(pools->objs[i]); =20 - VIR_DELETE_ELEMENT(pools->objs, i, pools->count); - break; - } - virObjectUnlock(pools->objs[i]); - } +static virStoragePoolObjPtr +virStoragePoolObjFindByUUIDLocked(virStoragePoolObjListPtr pools, + const unsigned char *uuid) +{ + char uuidstr[VIR_UUID_STRING_BUFLEN]; + + virUUIDFormat(uuid, uuidstr); + + return virObjectRef(virHashLookup(pools->objs, uuidstr)); } =20 =20 +/** + * virStoragePoolObjFindByUUID + * @pools: Storage pool object list pointer + * @uuid: Storage object uuid to find + * + * Lock the @pools and lookup the object by @uuid + * + * Returns: Locked and reffed storage pool object or NULL if not found + */ virStoragePoolObjPtr virStoragePoolObjFindByUUID(virStoragePoolObjListPtr pools, const unsigned char *uuid) { - size_t i; - - for (i =3D 0; i < pools->count; i++) { - virStoragePoolObjPtr obj =3D pools->objs[i]; + virStoragePoolObjPtr obj; =20 + virObjectRWLockRead(pools); + obj =3D virStoragePoolObjFindByUUIDLocked(pools, uuid); + virObjectRWUnlock(pools); + if (obj) virObjectLock(obj); - if (!memcmp(obj->def->uuid, uuid, VIR_UUID_BUFLEN)) - return virObjectRef(obj); - virObjectUnlock(obj); - } =20 - return NULL; + return obj; +} + + +static virStoragePoolObjPtr +virStoragePoolObjFindByNameLocked(virStoragePoolObjListPtr pools, + const char *name) +{ + return virObjectRef(virHashLookup(pools->objsName, name)); } =20 =20 +/** + * virStoragePoolObjFindByName + * @pools: Storage pool object list pointer + * @name: Storage object name to find + * + * Lock the @pools and lookup the object by @name + * + * Returns: Locked and reffed storage pool object or NULL if not found + */ virStoragePoolObjPtr virStoragePoolObjFindByName(virStoragePoolObjListPtr pools, const char *name) { - size_t i; - - for (i =3D 0; i < pools->count; i++) { - virStoragePoolObjPtr obj =3D pools->objs[i]; + virStoragePoolObjPtr obj; =20 + virObjectRWLockRead(pools); + obj =3D virStoragePoolObjFindByNameLocked(pools, name); + virObjectRWUnlock(pools); + if (obj) virObjectLock(obj); - if (STREQ(obj->def->name, name)) - return virObjectRef(obj); - virObjectUnlock(obj); - } =20 - return NULL; + return obj; } =20 =20 @@ -623,13 +719,27 @@ virStoragePoolObjVolumeListExport(virConnectPtr conn, } =20 =20 +/** + * virStoragePoolObjAssignDef: + * @pools: Storage Pool object list pointer + * @def: Storage pool definition to add or update + * + * Lookup the @def to see if it already exists in the @pools in order + * to either update or add if it does not exist. + * + * Returns locked and reffed object pointer or NULL on error + */ virStoragePoolObjPtr virStoragePoolObjAssignDef(virStoragePoolObjListPtr pools, virStoragePoolDefPtr def) { virStoragePoolObjPtr obj; + char uuidstr[VIR_UUID_STRING_BUFLEN]; + + virObjectRWLockWrite(pools); =20 - if ((obj =3D virStoragePoolObjFindByName(pools, def->name))) { + if ((obj =3D virStoragePoolObjFindByNameLocked(pools, def->name))) { + virObjectLock(obj); if (!virStoragePoolObjIsActive(obj)) { virStoragePoolDefFree(obj->def); obj->def =3D def; @@ -637,19 +747,31 @@ virStoragePoolObjAssignDef(virStoragePoolObjListPtr p= ools, virStoragePoolDefFree(obj->newDef); obj->newDef =3D def; } + virObjectRWUnlock(pools); return obj; } =20 if (!(obj =3D virStoragePoolObjNew())) return NULL; =20 - if (VIR_APPEND_ELEMENT_COPY(pools->objs, pools->count, obj) < 0) { - virStoragePoolObjEndAPI(&obj); - return NULL; + virUUIDFormat(def->uuid, uuidstr); + if (virHashAddEntry(pools->objs, uuidstr, obj) < 0) + goto error; + virObjectRef(obj); + + if (virHashAddEntry(pools->objsName, def->name, obj) < 0) { + virHashRemoveEntry(pools->objs, uuidstr); + goto error; } + virObjectRef(obj); obj->def =3D def; + virObjectRWUnlock(pools); + return obj; =20 - return virObjectRef(obj); + error: + virStoragePoolObjEndAPI(&obj); + virObjectRWUnlock(pools); + return NULL; } =20 =20 @@ -682,11 +804,13 @@ virStoragePoolObjLoad(virStoragePoolObjListPtr pools, VIR_FREE(obj->configFile); /* for driver reload */ if (VIR_STRDUP(obj->configFile, path) < 0) { virStoragePoolObjRemove(pools, obj); + virObjectUnref(obj); return NULL; } VIR_FREE(obj->autostartLink); /* for driver reload */ if (VIR_STRDUP(obj->autostartLink, autostartLink) < 0) { virStoragePoolObjRemove(pools, obj); + virObjectUnref(obj); return NULL; } =20 @@ -875,26 +999,100 @@ virStoragePoolObjDeleteDef(virStoragePoolObjPtr obj) } =20 =20 +struct _virStoragePoolCountData { + virConnectPtr conn; + virStoragePoolObjListACLFilter filter; + bool wantActive; + int count; +}; + + +static int +virStoragePoolObjNumOfStoragePoolsCb(void *payload, + const void *name ATTRIBUTE_UNUSED, + void *opaque) +{ + virStoragePoolObjPtr obj =3D payload; + struct _virStoragePoolCountData *data =3D opaque; + + virObjectLock(obj); + + if (data->filter && !data->filter(data->conn, obj->def)) + goto cleanup; + + if (data->wantActive !=3D virStoragePoolObjIsActive(obj)) + goto cleanup; + + data->count++; + + cleanup: + virObjectUnlock(obj); + return 0; +} + + int virStoragePoolObjNumOfStoragePools(virStoragePoolObjListPtr pools, virConnectPtr conn, bool wantActive, virStoragePoolObjListACLFilter filter) { - int npools =3D 0; - size_t i; + struct _virStoragePoolCountData data =3D { + .conn =3D conn, .filter =3D filter, .wantActive =3D wantActive, .c= ount =3D 0 }; =20 - for (i =3D 0; i < pools->count; i++) { - virStoragePoolObjPtr obj =3D pools->objs[i]; - virObjectLock(obj); - if (!filter || filter(conn, obj->def)) { - if (wantActive =3D=3D virStoragePoolObjIsActive(obj)) - npools++; + virObjectRWLockRead(pools); + virHashForEach(pools->objs, virStoragePoolObjNumOfStoragePoolsCb, &dat= a); + virObjectRWUnlock(pools); + + return data.count; +} + + +struct _virStoragePoolNameData { + virConnectPtr conn; + virStoragePoolObjListACLFilter filter; + bool wantActive; + bool error; + int nnames; + int maxnames; + char **const names; +}; + + +static int +virStoragePoolObjGetNamesCb(void *payload, + const void *name ATTRIBUTE_UNUSED, + void *opaque) +{ + virStoragePoolObjPtr obj =3D payload; + struct _virStoragePoolNameData *data =3D opaque; + + if (data->error) + return 0; + + if (data->maxnames >=3D 0 && data->nnames =3D=3D data->maxnames) + return 0; + + virObjectLock(obj); + + if (data->filter && !data->filter(data->conn, obj->def)) + goto cleanup; + + if (data->wantActive !=3D virStoragePoolObjIsActive(obj)) + goto cleanup; + + if (data->names) { + if (VIR_STRDUP(data->names[data->nnames], obj->def->name) < 0) { + data->error =3D true; + goto cleanup; } - virObjectUnlock(obj); } =20 - return npools; + data->nnames++; + + cleanup: + virObjectUnlock(obj); + return 0; } =20 =20 @@ -906,30 +1104,22 @@ virStoragePoolObjGetNames(virStoragePoolObjListPtr p= ools, char **const names, int maxnames) { - int nnames =3D 0; - size_t i; + struct _virStoragePoolNameData data =3D { + .conn =3D conn, .filter =3D filter, .wantActive =3D wantActive, + .error =3D false, .nnames =3D 0, .maxnames =3D maxnames, .names = =3D names }; =20 - for (i =3D 0; i < pools->count && nnames < maxnames; i++) { - virStoragePoolObjPtr obj =3D pools->objs[i]; - virObjectLock(obj); - if (!filter || filter(conn, obj->def)) { - if (wantActive =3D=3D virStoragePoolObjIsActive(obj)) { - if (VIR_STRDUP(names[nnames], obj->def->name) < 0) { - virObjectUnlock(obj); - goto failure; - } - nnames++; - } - } - virObjectUnlock(obj); - } + virObjectRWLockRead(pools); + virHashForEach(pools->objs, virStoragePoolObjGetNamesCb, &data); + virObjectRWUnlock(pools); =20 - return nnames; + if (data.error) + goto error; =20 - failure: - while (--nnames >=3D 0) - VIR_FREE(names[nnames]); + return data.nnames; =20 + error: + while (data.nnames) + VIR_FREE(data.names[--data.nnames]); return -1; } =20 @@ -1288,89 +1478,103 @@ virStoragePoolObjSourceMatchTypeDEVICE(virStorageP= oolObjPtr obj, } =20 =20 +struct _virStoragePoolObjFindDuplicateData { + virConnectPtr conn; + virStoragePoolDefPtr def; +}; + +static int +virStoragePoolObjSourceFindDuplicateCb(const void *payload, + const void *name ATTRIBUTE_UNUSED, + const void *opaque) +{ + virStoragePoolObjPtr obj =3D (virStoragePoolObjPtr) payload; + struct _virStoragePoolObjFindDuplicateData *data =3D + (struct _virStoragePoolObjFindDuplicateData *) opaque; + + /* Don't match against ourself if re-defining existing pool ! */ + if (STREQ(obj->def->name, data->def->name)) + return 0; + + switch ((virStoragePoolType)obj->def->type) { + case VIR_STORAGE_POOL_DIR: + case VIR_STORAGE_POOL_GLUSTER: + case VIR_STORAGE_POOL_NETFS: + if (data->def->type =3D=3D obj->def->type && + virStoragePoolObjSourceMatchTypeDIR(obj, data->def)) + return 1; + break; + + case VIR_STORAGE_POOL_SCSI: + if (data->def->type =3D=3D obj->def->type && + virStoragePoolObjSourceMatchTypeISCSI(obj, data->def, data->co= nn)) + return 1; + break; + + case VIR_STORAGE_POOL_ISCSI: + case VIR_STORAGE_POOL_FS: + case VIR_STORAGE_POOL_LOGICAL: + case VIR_STORAGE_POOL_DISK: + case VIR_STORAGE_POOL_ZFS: + if ((data->def->type =3D=3D VIR_STORAGE_POOL_ISCSI || + data->def->type =3D=3D VIR_STORAGE_POOL_FS || + data->def->type =3D=3D VIR_STORAGE_POOL_LOGICAL || + data->def->type =3D=3D VIR_STORAGE_POOL_DISK || + data->def->type =3D=3D VIR_STORAGE_POOL_ZFS) && + virStoragePoolObjSourceMatchTypeDEVICE(obj, data->def)) + return 1; + break; + + case VIR_STORAGE_POOL_SHEEPDOG: + if (data->def->type =3D=3D obj->def->type && + virStoragePoolSourceMatchSingleHost(&obj->def->source, + &data->def->source)) + return 1; + break; + + case VIR_STORAGE_POOL_MPATH: + /* Only one mpath pool is valid per host */ + if (data->def->type =3D=3D obj->def->type) + return 1; + break; + + case VIR_STORAGE_POOL_VSTORAGE: + if (data->def->type =3D=3D obj->def->type && + STREQ(obj->def->source.name, data->def->source.name)) + return 1; + break; + + case VIR_STORAGE_POOL_RBD: + case VIR_STORAGE_POOL_LAST: + break; + } + + return 0; +} + + int virStoragePoolObjSourceFindDuplicate(virConnectPtr conn, virStoragePoolObjListPtr pools, virStoragePoolDefPtr def) { - size_t i; - int ret =3D 1; + struct _virStoragePoolObjFindDuplicateData data =3D { .conn =3D conn, + .def =3D def }; virStoragePoolObjPtr obj =3D NULL; - virStoragePoolObjPtr matchobj =3D NULL; =20 - /* Check the pool list for duplicate underlying storage */ - for (i =3D 0; i < pools->count; i++) { - obj =3D pools->objs[i]; + virObjectRWLockRead(pools); + obj =3D virHashSearch(pools->objs, virStoragePoolObjSourceFindDuplicat= eCb, + &data, NULL); + virObjectRWUnlock(pools); =20 - /* Don't match against ourself if re-defining existing pool ! */ - if (STREQ(obj->def->name, def->name)) - continue; - - virObjectLock(obj); - - switch ((virStoragePoolType)obj->def->type) { - case VIR_STORAGE_POOL_DIR: - case VIR_STORAGE_POOL_GLUSTER: - case VIR_STORAGE_POOL_NETFS: - if (def->type =3D=3D obj->def->type) - matchobj =3D virStoragePoolObjSourceMatchTypeDIR(obj, def); - break; - - case VIR_STORAGE_POOL_SCSI: - if (def->type =3D=3D obj->def->type) - matchobj =3D virStoragePoolObjSourceMatchTypeISCSI(obj, de= f, - conn); - break; - - case VIR_STORAGE_POOL_ISCSI: - case VIR_STORAGE_POOL_FS: - case VIR_STORAGE_POOL_LOGICAL: - case VIR_STORAGE_POOL_DISK: - case VIR_STORAGE_POOL_ZFS: - if (def->type =3D=3D VIR_STORAGE_POOL_ISCSI || - def->type =3D=3D VIR_STORAGE_POOL_FS || - def->type =3D=3D VIR_STORAGE_POOL_LOGICAL || - def->type =3D=3D VIR_STORAGE_POOL_DISK || - def->type =3D=3D VIR_STORAGE_POOL_ZFS) - matchobj =3D virStoragePoolObjSourceMatchTypeDEVICE(obj, d= ef); - break; - - case VIR_STORAGE_POOL_SHEEPDOG: - if (def->type =3D=3D obj->def->type && - virStoragePoolSourceMatchSingleHost(&obj->def->source, - &def->source)) - matchobj =3D obj; - break; - - case VIR_STORAGE_POOL_MPATH: - /* Only one mpath pool is valid per host */ - if (def->type =3D=3D obj->def->type) - matchobj =3D obj; - break; - - case VIR_STORAGE_POOL_VSTORAGE: - if (def->type =3D=3D obj->def->type && - STREQ(obj->def->source.name, def->source.name)) - matchobj =3D obj; - break; - - case VIR_STORAGE_POOL_RBD: - case VIR_STORAGE_POOL_LAST: - break; - } - virObjectUnlock(obj); - - if (matchobj) - break; - } - - if (matchobj) { + if (obj) { virReportError(VIR_ERR_OPERATION_FAILED, _("Storage source conflict with pool: '%s'"), - matchobj->def->name); - ret =3D -1; + obj->def->name); + return -1; } - return ret; + + return 0; } =20 =20 @@ -1439,6 +1643,56 @@ virStoragePoolMatch(virStoragePoolObjPtr obj, #undef MATCH =20 =20 +struct _virStoragePoolExportData { + virConnectPtr conn; + virStoragePoolObjListACLFilter filter; + bool checkActive; + bool wantActive; + bool checkMatch; + unsigned int flags; + bool error; + int nPools; + virStoragePoolPtr *pools; +}; + + +static int +virStoragePoolObjListExportCb(void *payload, + const void *name ATTRIBUTE_UNUSED, + void *opaque) +{ + virStoragePoolObjPtr obj =3D payload; + struct _virStoragePoolExportData *data =3D opaque; + virStoragePoolPtr pool =3D NULL; + + if (data->error) + return 0; + + virObjectLock(obj); + + if (data->filter && !data->filter(data->conn, obj->def)) + goto cleanup; + + if (!virStoragePoolMatch(obj, data->flags)) + goto cleanup; + + if (data->pools) { + if (!(pool =3D virGetStoragePool(data->conn, obj->def->name, + obj->def->uuid, NULL, NULL))) { + data->error =3D true; + goto cleanup; + } + data->pools[data->nPools] =3D pool; + } + + data->nPools++; + + cleanup: + virObjectUnlock(obj); + return 0; +} + + int virStoragePoolObjListExport(virConnectPtr conn, virStoragePoolObjListPtr poolobjs, @@ -1446,50 +1700,30 @@ virStoragePoolObjListExport(virConnectPtr conn, virStoragePoolObjListFilter filter, unsigned int flags) { - virStoragePoolPtr *tmp_pools =3D NULL; - virStoragePoolPtr pool =3D NULL; - int npools =3D 0; - int ret =3D -1; - size_t i; + struct _virStoragePoolExportData data =3D { + .conn =3D conn, .filter =3D filter, .flags =3D flags, .error =3D f= alse, + .nPools =3D 0, .pools =3D NULL }; =20 - if (pools && VIR_ALLOC_N(tmp_pools, poolobjs->count + 1) < 0) - goto cleanup; + virObjectRWLockRead(poolobjs); =20 - for (i =3D 0; i < poolobjs->count; i++) { - virStoragePoolObjPtr obj =3D poolobjs->objs[i]; - virObjectLock(obj); - if ((!filter || filter(conn, obj->def)) && - virStoragePoolMatch(obj, flags)) { - if (pools) { - if (!(pool =3D virGetStoragePool(conn, - obj->def->name, - obj->def->uuid, - NULL, NULL))) { - virObjectUnlock(obj); - goto cleanup; - } - tmp_pools[npools] =3D pool; - } - npools++; - } - virObjectUnlock(obj); - } + if (pools && VIR_ALLOC_N(data.pools, virHashSize(poolobjs->objs) + 1) = < 0) + goto error; =20 - if (tmp_pools) { - /* trim the array to the final size */ - ignore_value(VIR_REALLOC_N(tmp_pools, npools + 1)); - *pools =3D tmp_pools; - tmp_pools =3D NULL; - } + virHashForEach(poolobjs->objs, virStoragePoolObjListExportCb, &data); + virObjectRWUnlock(poolobjs); =20 - ret =3D npools; + if (data.error) + goto error; =20 - cleanup: - if (tmp_pools) { - for (i =3D 0; i < npools; i++) - virObjectUnref(tmp_pools[i]); + if (data.pools) { + /* trim the array to the final size */ + ignore_value(VIR_REALLOC_N(data.pools, data.nPools + 1)); + *pools =3D data.pools; } =20 - VIR_FREE(tmp_pools); - return ret; + return data.nPools; + + error: + virObjectListFree(data.pools); + return -1; } diff --git a/src/conf/virstorageobj.h b/src/conf/virstorageobj.h index d4165fbe7..4f372386a 100644 --- a/src/conf/virstorageobj.h +++ b/src/conf/virstorageobj.h @@ -219,9 +219,6 @@ virStoragePoolObjGetNames(virStoragePoolObjListPtr pool= s, void virStoragePoolObjFree(virStoragePoolObjPtr obj); =20 -void -virStoragePoolObjListFree(virStoragePoolObjListPtr pools); - typedef void (*virStoragePoolObjListIterator)(virStoragePoolObjPtr obj, const void *opaque); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index e4744378c..e8924c545 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1095,7 +1095,6 @@ virStoragePoolObjIsAutostart; virStoragePoolObjIsDuplicate; virStoragePoolObjListExport; virStoragePoolObjListForEach; -virStoragePoolObjListFree; virStoragePoolObjListNew; virStoragePoolObjListSearch; virStoragePoolObjLoadAllConfigs; diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c index e0748615a..c9d5b60d8 100644 --- a/src/storage/storage_driver.c +++ b/src/storage/storage_driver.c @@ -94,6 +94,7 @@ virStoragePoolUpdateInactive(virStoragePoolObjPtr *objptr) =20 if (!virStoragePoolObjGetConfigFile(obj)) { virStoragePoolObjRemove(driver->pools, obj); + virObjectUnref(obj); *objptr =3D NULL; } else if (virStoragePoolObjGetNewDef(obj)) { virStoragePoolObjDefUseNewDef(obj); @@ -375,7 +376,7 @@ storageStateCleanup(void) virObjectUnref(driver->storageEventState); =20 /* free inactive pools */ - virStoragePoolObjListFree(driver->pools); + virObjectUnref(driver->pools); =20 VIR_FREE(driver->configDir); VIR_FREE(driver->autostartDir); @@ -713,6 +714,7 @@ storagePoolCreateXML(virConnectPtr conn, (flags & VIR_STORAGE_POOL_CREATE_WITH_BUILD)) { if (backend->buildPool(conn, obj, build_flags) < 0) { virStoragePoolObjRemove(driver->pools, obj); + virObjectUnref(obj); obj =3D NULL; goto cleanup; } @@ -722,6 +724,7 @@ storagePoolCreateXML(virConnectPtr conn, if (backend->startPool && backend->startPool(conn, obj) < 0) { virStoragePoolObjRemove(driver->pools, obj); + virObjectUnref(obj); obj =3D NULL; goto cleanup; } @@ -736,6 +739,7 @@ storagePoolCreateXML(virConnectPtr conn, if (backend->stopPool) backend->stopPool(conn, obj); virStoragePoolObjRemove(driver->pools, obj); + virObjectUnref(obj); obj =3D NULL; goto cleanup; } @@ -799,6 +803,7 @@ storagePoolDefineXML(virConnectPtr conn, =20 if (virStoragePoolObjSaveDef(driver, obj, def) < 0) { virStoragePoolObjRemove(driver->pools, obj); + virObjectUnref(obj); obj =3D NULL; goto cleanup; } @@ -868,6 +873,7 @@ storagePoolUndefine(virStoragePoolPtr pool) =20 VIR_INFO("Undefining storage pool '%s'", def->name); virStoragePoolObjRemove(driver->pools, obj); + virObjectUnref(obj); obj =3D NULL; ret =3D 0; =20 diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 531e2880c..8adc2167b 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -155,7 +155,7 @@ testDriverFree(testDriverPtr driver) virNodeDeviceObjListFree(driver->devs); virObjectUnref(driver->networks); virObjectUnref(driver->ifaces); - virStoragePoolObjListFree(driver->pools); + virObjectUnref(driver->pools); virObjectUnref(driver->eventState); virMutexUnlock(&driver->lock); virMutexDestroy(&driver->lock); @@ -4463,6 +4463,7 @@ testStoragePoolCreateXML(virConnectPtr conn, def->source.adapter.data.fchost.wwnn, def->source.adapter.data.fchost.wwpn) < 0) { virStoragePoolObjRemove(privconn->pools, obj); + virObjectUnref(obj); obj =3D NULL; goto cleanup; } @@ -4470,6 +4471,7 @@ testStoragePoolCreateXML(virConnectPtr conn, =20 if (testStoragePoolObjSetDefaults(obj) =3D=3D -1) { virStoragePoolObjRemove(privconn->pools, obj); + virObjectUnref(obj); obj =3D NULL; goto cleanup; } @@ -4529,6 +4531,7 @@ testStoragePoolDefineXML(virConnectPtr conn, =20 if (testStoragePoolObjSetDefaults(obj) =3D=3D -1) { virStoragePoolObjRemove(privconn->pools, obj); + virObjectUnref(obj); obj =3D NULL; goto cleanup; } @@ -4559,6 +4562,7 @@ testStoragePoolUndefine(virStoragePoolPtr pool) 0); =20 virStoragePoolObjRemove(privconn->pools, obj); + virObjectUnref(obj); =20 testObjectEventQueue(privconn, event); return 0; @@ -4652,6 +4656,7 @@ testStoragePoolDestroy(virStoragePoolPtr pool) =20 if (!(virStoragePoolObjGetConfigFile(obj))) { virStoragePoolObjRemove(privconn->pools, obj); + virObjectUnref(obj); obj =3D NULL; } ret =3D 0; --=20 2.13.6 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Mon Apr 29 12:58:51 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 1512438304125203.93282381938695; Mon, 4 Dec 2017 17:45:04 -0800 (PST) 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 B71647AE99; Tue, 5 Dec 2017 01:45:02 +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 8806F183C8; Tue, 5 Dec 2017 01:45: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 49A853D381; Tue, 5 Dec 2017 01:45:02 +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 vB51irWg030475 for ; Mon, 4 Dec 2017 20:44:53 -0500 Received: by smtp.corp.redhat.com (Postfix) id 3D2BD189B7; Tue, 5 Dec 2017 01:44:53 +0000 (UTC) Received: from localhost.localdomain.com (ovpn-117-84.phx2.redhat.com [10.3.117.84]) by smtp.corp.redhat.com (Postfix) with ESMTP id 04F4C189D4 for ; Tue, 5 Dec 2017 01:44:52 +0000 (UTC) From: John Ferlan To: libvir-list@redhat.com Date: Mon, 4 Dec 2017 20:43:55 -0500 Message-Id: <20171205014355.30524-5-jferlan@redhat.com> In-Reply-To: <20171205014355.30524-1-jferlan@redhat.com> References: <20171205014355.30524-1-jferlan@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 4/4] storage: Reduce need for using storageDriverLock 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.25]); Tue, 05 Dec 2017 01:45:03 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Now that the storage pools are self locking, we can reduce the number of places that need to take the big hammer storage driver lock Signed-off-by: John Ferlan --- src/storage/storage_driver.c | 103 +++++++--------------------------------= ---- 1 file changed, 16 insertions(+), 87 deletions(-) diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c index c9d5b60d8..f86087fb0 100644 --- a/src/storage/storage_driver.c +++ b/src/storage/storage_driver.c @@ -415,13 +415,7 @@ storagePoolObjFindByUUID(const unsigned char *uuid, static virStoragePoolObjPtr virStoragePoolObjFromStoragePool(virStoragePoolPtr pool) { - virStoragePoolObjPtr ret; - - storageDriverLock(); - ret =3D storagePoolObjFindByUUID(pool->uuid, pool->name); - storageDriverUnlock(); - - return ret; + return storagePoolObjFindByUUID(pool->uuid, pool->name); } =20 =20 @@ -430,12 +424,9 @@ storagePoolObjFindByName(const char *name) { virStoragePoolObjPtr obj; =20 - storageDriverLock(); if (!(obj =3D virStoragePoolObjFindByName(driver->pools, name))) virReportError(VIR_ERR_NO_STORAGE_POOL, _("no storage pool with matching name '%s'"), name); - storageDriverUnlock(); - return obj; } =20 @@ -448,9 +439,7 @@ storagePoolLookupByUUID(virConnectPtr conn, virStoragePoolDefPtr def; virStoragePoolPtr pool =3D NULL; =20 - storageDriverLock(); obj =3D storagePoolObjFindByUUID(uuid, NULL); - storageDriverUnlock(); if (!obj) return NULL; def =3D virStoragePoolObjGetDef(obj); @@ -511,17 +500,11 @@ storagePoolLookupByVolume(virStorageVolPtr vol) static int storageConnectNumOfStoragePools(virConnectPtr conn) { - int nactive =3D 0; - if (virConnectNumOfStoragePoolsEnsureACL(conn) < 0) return -1; =20 - storageDriverLock(); - nactive =3D virStoragePoolObjNumOfStoragePools(driver->pools, conn, tr= ue, - virConnectNumOfStoragePoo= lsCheckACL); - storageDriverUnlock(); - - return nactive; + return virStoragePoolObjNumOfStoragePools(driver->pools, conn, true, + virConnectNumOfStoragePoolsC= heckACL); } =20 =20 @@ -530,33 +513,22 @@ storageConnectListStoragePools(virConnectPtr conn, char **const names, int maxnames) { - int got =3D 0; - if (virConnectListStoragePoolsEnsureACL(conn) < 0) return -1; =20 - storageDriverLock(); - got =3D virStoragePoolObjGetNames(driver->pools, conn, true, - virConnectListStoragePoolsCheckACL, - names, maxnames); - storageDriverUnlock(); - return got; + return virStoragePoolObjGetNames(driver->pools, conn, true, + virConnectListStoragePoolsCheckACL, + names, maxnames); } =20 static int storageConnectNumOfDefinedStoragePools(virConnectPtr conn) { - int nactive =3D 0; - if (virConnectNumOfDefinedStoragePoolsEnsureACL(conn) < 0) return -1; =20 - storageDriverLock(); - nactive =3D virStoragePoolObjNumOfStoragePools(driver->pools, conn, fa= lse, - virConnectNumOfDefinedSto= ragePoolsCheckACL); - storageDriverUnlock(); - - return nactive; + return virStoragePoolObjNumOfStoragePools(driver->pools, conn, false, + virConnectNumOfDefinedStora= gePoolsCheckACL); } =20 =20 @@ -565,17 +537,12 @@ storageConnectListDefinedStoragePools(virConnectPtr c= onn, char **const names, int maxnames) { - int got =3D 0; - if (virConnectListDefinedStoragePoolsEnsureACL(conn) < 0) return -1; =20 - storageDriverLock(); - got =3D virStoragePoolObjGetNames(driver->pools, conn, false, - virConnectListDefinedStoragePoolsCheck= ACL, - names, maxnames); - storageDriverUnlock(); - return got; + return virStoragePoolObjGetNames(driver->pools, conn, false, + virConnectListDefinedStoragePoolsChec= kACL, + names, maxnames); } =20 /* This method is required to be re-entrant / thread safe, so @@ -683,7 +650,6 @@ storagePoolCreateXML(virConnectPtr conn, VIR_EXCLUSIVE_FLAGS_RET(VIR_STORAGE_POOL_BUILD_OVERWRITE, VIR_STORAGE_POOL_BUILD_NO_OVERWRITE, NULL); =20 - storageDriverLock(); if (!(newDef =3D virStoragePoolDefParseString(xml))) goto cleanup; =20 @@ -760,7 +726,6 @@ storagePoolCreateXML(virConnectPtr conn, if (event) virObjectEventStateQueue(driver->storageEventState, event); virStoragePoolObjEndAPI(&obj); - storageDriverUnlock(); return pool; } =20 @@ -777,7 +742,6 @@ storagePoolDefineXML(virConnectPtr conn, =20 virCheckFlags(0, NULL); =20 - storageDriverLock(); if (!(newDef =3D virStoragePoolDefParseString(xml))) goto cleanup; =20 @@ -820,7 +784,6 @@ storagePoolDefineXML(virConnectPtr conn, virObjectEventStateQueue(driver->storageEventState, event); virStoragePoolDefFree(newDef); virStoragePoolObjEndAPI(&obj); - storageDriverUnlock(); return pool; } =20 @@ -833,7 +796,6 @@ storagePoolUndefine(virStoragePoolPtr pool) virObjectEventPtr event =3D NULL; int ret =3D -1; =20 - storageDriverLock(); if (!(obj =3D storagePoolObjFindByUUID(pool->uuid, pool->name))) goto cleanup; def =3D virStoragePoolObjGetDef(obj); @@ -881,7 +843,6 @@ storagePoolUndefine(virStoragePoolPtr pool) if (event) virObjectEventStateQueue(driver->storageEventState, event); virStoragePoolObjEndAPI(&obj); - storageDriverUnlock(); return ret; } =20 @@ -1023,7 +984,6 @@ storagePoolDestroy(virStoragePoolPtr pool) char *stateFile =3D NULL; int ret =3D -1; =20 - storageDriverLock(); if (!(obj =3D storagePoolObjFindByUUID(pool->uuid, pool->name))) goto cleanup; def =3D virStoragePoolObjGetDef(obj); @@ -1076,7 +1036,6 @@ storagePoolDestroy(virStoragePoolPtr pool) if (event) virObjectEventStateQueue(driver->storageEventState, event); virStoragePoolObjEndAPI(&obj); - storageDriverUnlock(); return ret; } =20 @@ -1158,7 +1117,6 @@ storagePoolRefresh(virStoragePoolPtr pool, =20 virCheckFlags(0, -1); =20 - storageDriverLock(); if (!(obj =3D storagePoolObjFindByUUID(pool->uuid, pool->name))) goto cleanup; def =3D virStoragePoolObjGetDef(obj); @@ -1206,7 +1164,6 @@ storagePoolRefresh(virStoragePoolPtr pool, if (event) virObjectEventStateQueue(driver->storageEventState, event); virStoragePoolObjEndAPI(&obj); - storageDriverUnlock(); return ret; } =20 @@ -1310,7 +1267,6 @@ storagePoolSetAutostart(virStoragePoolPtr pool, bool cur_autostart; int ret =3D -1; =20 - storageDriverLock(); if (!(obj =3D storagePoolObjFindByUUID(pool->uuid, pool->name))) goto cleanup; =20 @@ -1359,7 +1315,6 @@ storagePoolSetAutostart(virStoragePoolPtr pool, =20 cleanup: virStoragePoolObjEndAPI(&obj); - storageDriverUnlock(); return ret; } =20 @@ -1529,7 +1484,6 @@ storageVolLookupByKey(virConnectPtr conn, .conn =3D conn, .key =3D key, .voldef =3D NULL }; virStorageVolPtr vol =3D NULL; =20 - storageDriverLock(); if ((obj =3D virStoragePoolObjListSearch(driver->pools, storageVolLookupByKeyCallback, &data)) && data.voldef) { @@ -1541,7 +1495,6 @@ storageVolLookupByKey(virConnectPtr conn, } virStoragePoolObjEndAPI(&obj); } - storageDriverUnlock(); =20 if (!vol) virReportError(VIR_ERR_NO_STORAGE_VOL, @@ -1614,7 +1567,6 @@ storageVolLookupByPath(virConnectPtr conn, if (!(data.cleanpath =3D virFileSanitizePath(path))) return NULL; =20 - storageDriverLock(); if ((obj =3D virStoragePoolObjListSearch(driver->pools, storageVolLookupByPathCallback, &data)) && data.voldef) { @@ -1627,7 +1579,6 @@ storageVolLookupByPath(virConnectPtr conn, } virStoragePoolObjEndAPI(&obj); } - storageDriverUnlock(); =20 if (!vol) { if (STREQ(path, data.cleanpath)) { @@ -1673,7 +1624,6 @@ storagePoolLookupByTargetPath(virConnectPtr conn, if (!cleanpath) return NULL; =20 - storageDriverLock(); if ((obj =3D virStoragePoolObjListSearch(driver->pools, storagePoolLookupByTargetPathCa= llback, cleanpath))) { @@ -1681,7 +1631,6 @@ storagePoolLookupByTargetPath(virConnectPtr conn, pool =3D virGetStoragePool(conn, def->name, def->uuid, NULL, NULL); virStoragePoolObjEndAPI(&obj); } - storageDriverUnlock(); =20 if (!pool) { if (STREQ(path, cleanpath)) { @@ -1913,9 +1862,7 @@ storageVolCreateXML(virStoragePoolPtr pool, =20 VIR_FREE(buildvoldef); =20 - storageDriverLock(); virObjectLock(obj); - storageDriverUnlock(); =20 voldef->building =3D false; virStoragePoolObjDecrAsyncjobs(obj); @@ -1979,14 +1926,12 @@ storageVolCreateXMLFrom(virStoragePoolPtr pool, VIR_STORAGE_VOL_CREATE_REFLINK, NULL); =20 - storageDriverLock(); obj =3D virStoragePoolObjFindByUUID(driver->pools, pool->uuid); if (obj && STRNEQ(pool->name, volsrc->pool)) { virObjectUnlock(obj); objsrc =3D virStoragePoolObjFindByName(driver->pools, volsrc->pool= ); virObjectLock(obj); } - storageDriverUnlock(); if (!obj) { char uuidstr[VIR_UUID_STRING_BUFLEN]; virUUIDFormat(pool->uuid, uuidstr); @@ -2112,11 +2057,9 @@ storageVolCreateXMLFrom(virStoragePoolPtr pool, =20 buildret =3D backend->buildVolFrom(pool->conn, obj, shadowvol, voldefs= rc, flags); =20 - storageDriverLock(); virObjectLock(obj); if (objsrc) virObjectLock(objsrc); - storageDriverUnlock(); =20 voldefsrc->in_use--; voldef->building =3D false; @@ -2275,7 +2218,6 @@ virStorageVolPoolRefreshThread(void *opaque) virStorageBackendPtr backend; virObjectEventPtr event =3D NULL; =20 - storageDriverLock(); if (cbdata->vol_path) { if (virStorageBackendPloopRestoreDesc(cbdata->vol_path) < 0) goto cleanup; @@ -2305,7 +2247,6 @@ virStorageVolPoolRefreshThread(void *opaque) if (event) virObjectEventStateQueue(driver->storageEventState, event); virStoragePoolObjEndAPI(&obj); - storageDriverUnlock(); virStorageVolPoolRefreshDataFree(cbdata); } =20 @@ -2688,21 +2629,14 @@ storageConnectListAllStoragePools(virConnectPtr con= n, virStoragePoolPtr **pools, unsigned int flags) { - int ret =3D -1; - virCheckFlags(VIR_CONNECT_LIST_STORAGE_POOLS_FILTERS_ALL, -1); =20 if (virConnectListAllStoragePoolsEnsureACL(conn) < 0) - goto cleanup; - - storageDriverLock(); - ret =3D virStoragePoolObjListExport(conn, driver->pools, pools, - virConnectListAllStoragePoolsCheckAC= L, - flags); - storageDriverUnlock(); + return -1; =20 - cleanup: - return ret; + return virStoragePoolObjListExport(conn, driver->pools, pools, + virConnectListAllStoragePoolsCheckA= CL, + flags); } =20 static int @@ -3098,12 +3032,7 @@ virStorageTranslateDiskSourcePool(virConnectPtr conn, virStoragePoolObjPtr virStoragePoolObjFindPoolByUUID(const unsigned char *uuid) { - virStoragePoolObjPtr obj; - - storageDriverLock(); - obj =3D virStoragePoolObjFindByUUID(driver->pools, uuid); - storageDriverUnlock(); - return obj; + return virStoragePoolObjFindByUUID(driver->pools, uuid); } =20 =20 --=20 2.13.6 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list