From nobody Sat May 4 09:15:06 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 1510851564829799.8034521572775; Thu, 16 Nov 2017 08:59:24 -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 8BB0B7CBA5; Thu, 16 Nov 2017 16:58:53 +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 693FB5C2F6; Thu, 16 Nov 2017 16:58:53 +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 3166A3D387; Thu, 16 Nov 2017 16:58:53 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id vAGGwACo011215 for ; Thu, 16 Nov 2017 11:58:10 -0500 Received: by smtp.corp.redhat.com (Postfix) id 1ACF12C7C4; Thu, 16 Nov 2017 16:58:10 +0000 (UTC) Received: from localhost.localdomain.com (ovpn-117-167.phx2.redhat.com [10.3.117.167]) by smtp.corp.redhat.com (Postfix) with ESMTP id AFE772D256 for ; Thu, 16 Nov 2017 16:58:09 +0000 (UTC) From: John Ferlan To: libvir-list@redhat.com Date: Thu, 16 Nov 2017 11:58:02 -0500 Message-Id: <20171116165805.14496-2-jferlan@redhat.com> In-Reply-To: <20171116165805.14496-1-jferlan@redhat.com> References: <20171116165805.14496-1-jferlan@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 1/4] storage: Introduce virStoragePoolObjEndAPI 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.26]); Thu, 16 Nov 2017 16:58:53 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" For now it'll just call the virStoragePoolObjUnlock, but a future adjustment will do something different. Since the new API will check for a NULL object before the Unlock call, callers no longer need to check for NULL before calling. The virStoragePoolObjUnlock is now private/static to virstorageobj.c with a short term forward reference. Signed-off-by: John Ferlan Reviewed-by: Erik Skultety --- src/conf/virstorageobj.c | 15 ++++- src/conf/virstorageobj.h | 6 +- src/libvirt_private.syms | 2 +- src/storage/storage_backend_scsi.c | 2 +- src/storage/storage_driver.c | 115 +++++++++++++++++----------------= ---- src/test/test_driver.c | 71 +++++++++++------------ tests/storagevolxml2argvtest.c | 3 +- 7 files changed, 106 insertions(+), 108 deletions(-) diff --git a/src/conf/virstorageobj.c b/src/conf/virstorageobj.c index 50dbd7bf4d..2ca8453139 100644 --- a/src/conf/virstorageobj.c +++ b/src/conf/virstorageobj.c @@ -36,6 +36,9 @@ =20 VIR_LOG_INIT("conf.virstorageobj"); =20 +static void +virStoragePoolObjUnlock(virStoragePoolObjPtr obj); + =20 struct _virStorageVolDefList { size_t count; @@ -77,6 +80,16 @@ virStoragePoolObjNew(void) } =20 =20 +void +virStoragePoolObjEndAPI(virStoragePoolObjPtr *obj) +{ + if (!*obj) + return; + + virStoragePoolObjUnlock(*obj); +} + + virStoragePoolDefPtr virStoragePoolObjGetDef(virStoragePoolObjPtr obj) { @@ -1274,7 +1287,7 @@ virStoragePoolObjLock(virStoragePoolObjPtr obj) } =20 =20 -void +static void virStoragePoolObjUnlock(virStoragePoolObjPtr obj) { virMutexUnlock(&obj->lock); diff --git a/src/conf/virstorageobj.h b/src/conf/virstorageobj.h index 69e737226b..a4d7186d12 100644 --- a/src/conf/virstorageobj.h +++ b/src/conf/virstorageobj.h @@ -58,6 +58,9 @@ typedef bool virStoragePoolObjPtr virStoragePoolObjNew(void); =20 +void +virStoragePoolObjEndAPI(virStoragePoolObjPtr *obj); + virStoragePoolDefPtr virStoragePoolObjGetDef(virStoragePoolObjPtr obj); =20 @@ -240,9 +243,6 @@ virStoragePoolObjSourceFindDuplicate(virConnectPtr conn, void virStoragePoolObjLock(virStoragePoolObjPtr obj); =20 -void -virStoragePoolObjUnlock(virStoragePoolObjPtr obj); - int virStoragePoolObjListExport(virConnectPtr conn, virStoragePoolObjListPtr poolobjs, diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index a91b87d09a..57ba8f4038 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1073,6 +1073,7 @@ virStoragePoolObjClearVols; virStoragePoolObjDecrAsyncjobs; virStoragePoolObjDefUseNewDef; virStoragePoolObjDeleteDef; +virStoragePoolObjEndAPI; virStoragePoolObjFindByName; virStoragePoolObjFindByUUID; virStoragePoolObjForEachVolume; @@ -1104,7 +1105,6 @@ virStoragePoolObjSetAutostart; virStoragePoolObjSetConfigFile; virStoragePoolObjSetDef; virStoragePoolObjSourceFindDuplicate; -virStoragePoolObjUnlock; virStoragePoolObjVolumeGetNames; virStoragePoolObjVolumeListExport; =20 diff --git a/src/storage/storage_backend_scsi.c b/src/storage/storage_backe= nd_scsi.c index ee79ad72f5..9347d66384 100644 --- a/src/storage/storage_backend_scsi.c +++ b/src/storage/storage_backend_scsi.c @@ -166,7 +166,7 @@ virStoragePoolFCRefreshThread(void *opaque) virStoragePoolObjClearVols(pool); found =3D virStorageBackendSCSIFindLUs(pool, host); } - virStoragePoolObjUnlock(pool); + virStoragePoolObjEndAPI(&pool); } while (!found && --tries); =20 if (pool && !found) diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c index d209f5afb8..7cc3c518b4 100644 --- a/src/storage/storage_driver.c +++ b/src/storage/storage_driver.c @@ -167,7 +167,7 @@ storagePoolUpdateAllState(void) =20 virStoragePoolObjLock(obj); storagePoolUpdateState(obj); - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); } } =20 @@ -192,7 +192,7 @@ storageDriverAutostart(void) =20 virStoragePoolObjLock(obj); if ((backend =3D virStorageBackendForType(def->type)) =3D=3D NULL)= { - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); continue; } =20 @@ -203,7 +203,7 @@ storageDriverAutostart(void) virReportError(VIR_ERR_INTERNAL_ERROR, _("Failed to autostart storage pool '%s': %= s"), def->name, virGetLastErrorMessage()); - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); continue; } started =3D true; @@ -229,7 +229,7 @@ storageDriverAutostart(void) } VIR_FREE(stateFile); } - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); } =20 virObjectUnref(conn); @@ -458,7 +458,7 @@ storagePoolLookupByUUID(virConnectPtr conn, pool =3D virGetStoragePool(conn, def->name, def->uuid, NULL, NULL); =20 cleanup: - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return pool; } =20 @@ -480,7 +480,7 @@ storagePoolLookupByName(virConnectPtr conn, pool =3D virGetStoragePool(conn, def->name, def->uuid, NULL, NULL); =20 cleanup: - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return pool; } =20 @@ -501,7 +501,7 @@ storagePoolLookupByVolume(virStorageVolPtr vol) pool =3D virGetStoragePool(vol->conn, def->name, def->uuid, NULL, NULL= ); =20 cleanup: - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return pool; } =20 @@ -632,7 +632,7 @@ storagePoolIsActive(virStoragePoolPtr pool) ret =3D virStoragePoolObjIsActive(obj); =20 cleanup: - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return ret; } =20 @@ -654,7 +654,7 @@ storagePoolIsPersistent(virStoragePoolPtr pool) ret =3D virStoragePoolObjGetConfigFile(obj) ? 1 : 0; =20 cleanup: - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return ret; } =20 @@ -753,8 +753,7 @@ storagePoolCreateXML(virConnectPtr conn, virStoragePoolDefFree(newDef); if (event) virObjectEventStateQueue(driver->storageEventState, event); - if (obj) - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); storageDriverUnlock(); return pool; } @@ -813,8 +812,7 @@ storagePoolDefineXML(virConnectPtr conn, if (event) virObjectEventStateQueue(driver->storageEventState, event); virStoragePoolDefFree(newDef); - if (obj) - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); storageDriverUnlock(); return pool; } @@ -874,8 +872,7 @@ storagePoolUndefine(virStoragePoolPtr pool) cleanup: if (event) virObjectEventStateQueue(driver->storageEventState, event); - if (obj) - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); storageDriverUnlock(); return ret; } @@ -958,8 +955,7 @@ storagePoolCreate(virStoragePoolPtr pool, VIR_FREE(stateFile); if (event) virObjectEventStateQueue(driver->storageEventState, event); - if (obj) - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return ret; } =20 @@ -1004,7 +1000,7 @@ storagePoolBuild(virStoragePoolPtr pool, cleanup: if (event) virObjectEventStateQueue(driver->storageEventState, event); - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return ret; } =20 @@ -1071,8 +1067,7 @@ storagePoolDestroy(virStoragePoolPtr pool) cleanup: if (event) virObjectEventStateQueue(driver->storageEventState, event); - if (obj) - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); storageDriverUnlock(); return ret; } @@ -1138,7 +1133,7 @@ storagePoolDelete(virStoragePoolPtr pool, cleanup: if (event) virObjectEventStateQueue(driver->storageEventState, event); - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return ret; } =20 @@ -1202,8 +1197,7 @@ storagePoolRefresh(virStoragePoolPtr pool, cleanup: if (event) virObjectEventStateQueue(driver->storageEventState, event); - if (obj) - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); storageDriverUnlock(); return ret; } @@ -1238,7 +1232,7 @@ storagePoolGetInfo(virStoragePoolPtr pool, ret =3D 0; =20 cleanup: - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return ret; } =20 @@ -1270,7 +1264,7 @@ storagePoolGetXMLDesc(virStoragePoolPtr pool, ret =3D virStoragePoolDefFormat(curDef); =20 cleanup: - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return ret; } =20 @@ -1293,7 +1287,7 @@ storagePoolGetAutostart(virStoragePoolPtr pool, ret =3D 0; =20 cleanup: - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return ret; } =20 @@ -1356,8 +1350,7 @@ storagePoolSetAutostart(virStoragePoolPtr pool, ret =3D 0; =20 cleanup: - if (obj) - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); storageDriverUnlock(); return ret; } @@ -1387,7 +1380,7 @@ storagePoolNumOfVolumes(virStoragePoolPtr pool) virStoragePoolNumOfVolumesCheckACL= ); =20 cleanup: - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return ret; } =20 @@ -1418,7 +1411,7 @@ storagePoolListVolumes(virStoragePoolPtr pool, virStoragePoolListVolumesCheckACL, names, maxnames); cleanup: - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return n; } =20 @@ -1452,7 +1445,7 @@ storagePoolListAllVolumes(virStoragePoolPtr pool, =20 =20 cleanup: - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); =20 return ret; } @@ -1492,7 +1485,7 @@ storageVolLookupByName(virStoragePoolPtr pool, voldef->key, NULL, NULL); =20 cleanup: - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return vol; } =20 @@ -1516,7 +1509,7 @@ storageVolLookupByKey(virConnectPtr conn, =20 if (voldef) { if (virStorageVolLookupByKeyEnsureACL(conn, def, voldef) <= 0) { - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); goto cleanup; } =20 @@ -1525,7 +1518,7 @@ storageVolLookupByKey(virConnectPtr conn, NULL, NULL); } } - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); } =20 if (!vol) @@ -1560,7 +1553,7 @@ storageVolLookupByPath(virConnectPtr conn, def =3D virStoragePoolObjGetDef(obj); =20 if (!virStoragePoolObjIsActive(obj)) { - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); continue; } =20 @@ -1583,7 +1576,7 @@ storageVolLookupByPath(virConnectPtr conn, */ VIR_WARN("Failed to get stable path for pool '%s'", def->name); - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); continue; } break; @@ -1594,7 +1587,7 @@ storageVolLookupByPath(virConnectPtr conn, case VIR_STORAGE_POOL_ZFS: case VIR_STORAGE_POOL_LAST: if (VIR_STRDUP(stable_path, path) < 0) { - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); goto cleanup; } break; @@ -1605,7 +1598,7 @@ storageVolLookupByPath(virConnectPtr conn, =20 if (voldef) { if (virStorageVolLookupByPathEnsureACL(conn, def, voldef) < 0)= { - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); goto cleanup; } =20 @@ -1614,7 +1607,7 @@ storageVolLookupByPath(virConnectPtr conn, NULL, NULL); } =20 - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); } =20 if (!vol) { @@ -1655,14 +1648,14 @@ storagePoolLookupByTargetPath(virConnectPtr conn, def =3D virStoragePoolObjGetDef(obj); =20 if (!virStoragePoolObjIsActive(obj)) { - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); continue; } =20 if (STREQ(path, def->target.path)) pool =3D virGetStoragePool(conn, def->name, def->uuid, NULL, N= ULL); =20 - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); } storageDriverUnlock(); =20 @@ -1751,7 +1744,7 @@ virStorageVolDefFromVol(virStorageVolPtr vol, return voldef; =20 error: - virStoragePoolObjUnlock(*obj); + virStoragePoolObjEndAPI(obj); *obj =3D NULL; =20 return NULL; @@ -1794,7 +1787,7 @@ storageVolDelete(virStorageVolPtr vol, ret =3D 0; =20 cleanup: - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return ret; } =20 @@ -1885,7 +1878,7 @@ storageVolCreateXML(virStoragePoolPtr pool, /* Drop the pool lock during volume allocation */ virStoragePoolObjIncrAsyncjobs(obj); voldef->building =3D true; - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); =20 buildret =3D backend->buildVol(pool->conn, obj, buildvoldef, flags= ); =20 @@ -1932,8 +1925,7 @@ storageVolCreateXML(virStoragePoolPtr pool, cleanup: virObjectUnref(newvol); virStorageVolDefFree(voldef); - if (obj) - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return vol; } =20 @@ -1961,7 +1953,7 @@ storageVolCreateXMLFrom(virStoragePoolPtr pool, storageDriverLock(); obj =3D virStoragePoolObjFindByUUID(&driver->pools, pool->uuid); if (obj && STRNEQ(pool->name, volsrc->pool)) { - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); objsrc =3D virStoragePoolObjFindByName(&driver->pools, volsrc->poo= l); virStoragePoolObjLock(obj); } @@ -2082,11 +2074,11 @@ storageVolCreateXMLFrom(virStoragePoolPtr pool, virStoragePoolObjIncrAsyncjobs(obj); voldef->building =3D true; voldefsrc->in_use++; - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); =20 if (objsrc) { virStoragePoolObjIncrAsyncjobs(objsrc); - virStoragePoolObjUnlock(objsrc); + virStoragePoolObjEndAPI(&objsrc); } =20 buildret =3D backend->buildVolFrom(pool->conn, obj, shadowvol, voldefs= rc, flags); @@ -2103,7 +2095,7 @@ storageVolCreateXMLFrom(virStoragePoolPtr pool, =20 if (objsrc) { virStoragePoolObjDecrAsyncjobs(objsrc); - virStoragePoolObjUnlock(objsrc); + virStoragePoolObjEndAPI(&objsrc); objsrc =3D NULL; } =20 @@ -2133,10 +2125,8 @@ storageVolCreateXMLFrom(virStoragePoolPtr pool, virObjectUnref(newvol); virStorageVolDefFree(voldef); VIR_FREE(shadowvol); - if (obj) - virStoragePoolObjUnlock(obj); - if (objsrc) - virStoragePoolObjUnlock(objsrc); + virStoragePoolObjEndAPI(&obj); + virStoragePoolObjEndAPI(&objsrc); return vol; } =20 @@ -2179,7 +2169,7 @@ storageVolDownload(virStorageVolPtr vol, offset, length, flags); =20 cleanup: - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); =20 return ret; } @@ -2286,8 +2276,7 @@ virStorageVolPoolRefreshThread(void *opaque) cleanup: if (event) virObjectEventStateQueue(driver->storageEventState, event); - if (obj) - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); storageDriverUnlock(); virStorageVolPoolRefreshDataFree(cbdata); } @@ -2386,7 +2375,7 @@ storageVolUpload(virStorageVolPtr vol, cbdata =3D NULL; =20 cleanup: - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); if (cbdata) virStorageVolPoolRefreshDataFree(cbdata); =20 @@ -2488,7 +2477,7 @@ storageVolResize(virStorageVolPtr vol, ret =3D 0; =20 cleanup: - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); =20 return ret; } @@ -2554,7 +2543,7 @@ storageVolWipePattern(virStorageVolPtr vol, ret =3D 0; =20 cleanup: - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); =20 return ret; } @@ -2601,7 +2590,7 @@ storageVolGetInfoFlags(virStorageVolPtr vol, ret =3D 0; =20 cleanup: - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return ret; } =20 @@ -2640,7 +2629,7 @@ storageVolGetXMLDesc(virStorageVolPtr vol, ret =3D virStorageVolDefFormat(def, voldef); =20 cleanup: - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); =20 return ret; } @@ -2662,7 +2651,7 @@ storageVolGetPath(virStorageVolPtr vol) ignore_value(VIR_STRDUP(ret, voldef->target.path)); =20 cleanup: - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return ret; } =20 diff --git a/src/test/test_driver.c b/src/test/test_driver.c index dbde37cf39..72b3c6db5d 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -1119,18 +1119,18 @@ testParseStorage(testDriverPtr privconn, } =20 if (testStoragePoolObjSetDefaults(obj) =3D=3D -1) { - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); goto error; } virStoragePoolObjSetActive(obj, true); =20 /* Find storage volumes */ if (testOpenVolumesForPool(file, ctxt, obj, i+1) < 0) { - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); goto error; } =20 - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); } =20 ret =3D 0; @@ -4100,7 +4100,7 @@ testStoragePoolObjFindActiveByName(testDriverPtr priv= conn, if (!virStoragePoolObjIsActive(obj)) { virReportError(VIR_ERR_OPERATION_INVALID, _("storage pool '%s' is not active"), name); - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return NULL; } =20 @@ -4120,7 +4120,7 @@ testStoragePoolObjFindInactiveByName(testDriverPtr pr= ivconn, if (virStoragePoolObjIsActive(obj)) { virReportError(VIR_ERR_OPERATION_INVALID, _("storage pool '%s' is active"), name); - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return NULL; } =20 @@ -4165,7 +4165,7 @@ testStoragePoolLookupByUUID(virConnectPtr conn, =20 pool =3D virGetStoragePool(conn, def->name, def->uuid, NULL, NULL); =20 - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return pool; } =20 @@ -4185,7 +4185,7 @@ testStoragePoolLookupByName(virConnectPtr conn, =20 pool =3D virGetStoragePool(conn, def->name, def->uuid, NULL, NULL); =20 - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return pool; } =20 @@ -4294,7 +4294,7 @@ testStoragePoolIsActive(virStoragePoolPtr pool) =20 cleanup: if (obj) - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return ret; } =20 @@ -4311,7 +4311,7 @@ testStoragePoolIsPersistent(virStoragePoolPtr pool) =20 ret =3D virStoragePoolObjGetConfigFile(obj) ? 1 : 0; =20 - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return ret; } =20 @@ -4336,7 +4336,7 @@ testStoragePoolCreate(virStoragePoolPtr pool, 0); =20 testObjectEventQueue(privconn, event); - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return 0; } =20 @@ -4490,8 +4490,7 @@ testStoragePoolCreateXML(virConnectPtr conn, cleanup: virStoragePoolDefFree(newDef); testObjectEventQueue(privconn, event); - if (obj) - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); testDriverUnlock(privconn); return pool; } @@ -4539,8 +4538,7 @@ testStoragePoolDefineXML(virConnectPtr conn, cleanup: virStoragePoolDefFree(newDef); testObjectEventQueue(privconn, event); - if (obj) - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); testDriverUnlock(privconn); return pool; } @@ -4584,7 +4582,7 @@ testStoragePoolBuild(virStoragePoolPtr pool, VIR_STORAGE_POOL_EVENT_CREATED, 0); =20 - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); =20 testObjectEventQueue(privconn, event); return 0; @@ -4660,8 +4658,7 @@ testStoragePoolDestroy(virStoragePoolPtr pool) =20 cleanup: testObjectEventQueue(privconn, event); - if (obj) - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return ret; } =20 @@ -4685,7 +4682,7 @@ testStoragePoolDelete(virStoragePoolPtr pool, =20 testObjectEventQueue(privconn, event); =20 - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return 0; } =20 @@ -4706,7 +4703,7 @@ testStoragePoolRefresh(virStoragePoolPtr pool, event =3D virStoragePoolEventRefreshNew(pool->name, pool->uuid); =20 testObjectEventQueue(privconn, event); - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return 0; } =20 @@ -4732,7 +4729,7 @@ testStoragePoolGetInfo(virStoragePoolPtr pool, info->allocation =3D def->allocation; info->available =3D def->available; =20 - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return 0; } =20 @@ -4752,7 +4749,7 @@ testStoragePoolGetXMLDesc(virStoragePoolPtr pool, =20 ret =3D virStoragePoolDefFormat(virStoragePoolObjGetDef(obj)); =20 - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return ret; } =20 @@ -4772,7 +4769,7 @@ testStoragePoolGetAutostart(virStoragePoolPtr pool, else *autostart =3D virStoragePoolObjIsAutostart(obj) ? 1 : 0; =20 - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return 0; } =20 @@ -4799,7 +4796,7 @@ testStoragePoolSetAutostart(virStoragePoolPtr pool, ret =3D 0; =20 cleanup: - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return ret; } =20 @@ -4816,7 +4813,7 @@ testStoragePoolNumOfVolumes(virStoragePoolPtr pool) =20 ret =3D virStoragePoolObjNumOfVolumes(obj, pool->conn, NULL); =20 - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return ret; } =20 @@ -4835,7 +4832,7 @@ testStoragePoolListVolumes(virStoragePoolPtr pool, =20 n =3D virStoragePoolObjVolumeGetNames(obj, pool->conn, NULL, names, ma= xnames); =20 - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return n; } =20 @@ -4863,7 +4860,7 @@ testStoragePoolListAllVolumes(virStoragePoolPtr pool, ret =3D virStoragePoolObjVolumeListExport(pool->conn, obj, vols, NULL); =20 cleanup: - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); =20 return ret; } @@ -4906,7 +4903,7 @@ testStorageVolLookupByName(virStoragePoolPtr pool, NULL, NULL); =20 cleanup: - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return ret; } =20 @@ -4933,11 +4930,11 @@ testStorageVolLookupByKey(virConnectPtr conn, ret =3D virGetStorageVol(conn, def->name, privvol->name, privvol->key, NULL, NULL); - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); break; } } - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); } testDriverUnlock(privconn); =20 @@ -4971,11 +4968,11 @@ testStorageVolLookupByPath(virConnectPtr conn, ret =3D virGetStorageVol(conn, def->name, privvol->name, privvol->key, NULL, NULL); - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); break; } } - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); } testDriverUnlock(privconn); =20 @@ -5041,7 +5038,7 @@ testStorageVolCreateXML(virStoragePoolPtr pool, =20 cleanup: virStorageVolDefFree(privvol); - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return ret; } =20 @@ -5109,7 +5106,7 @@ testStorageVolCreateXMLFrom(virStoragePoolPtr pool, =20 cleanup: virStorageVolDefFree(privvol); - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return ret; } =20 @@ -5141,7 +5138,7 @@ testStorageVolDelete(virStorageVolPtr vol, ret =3D 0; =20 cleanup: - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return ret; } =20 @@ -5185,7 +5182,7 @@ testStorageVolGetInfo(virStorageVolPtr vol, ret =3D 0; =20 cleanup: - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return ret; } =20 @@ -5210,7 +5207,7 @@ testStorageVolGetXMLDesc(virStorageVolPtr vol, ret =3D virStorageVolDefFormat(virStoragePoolObjGetDef(obj), privvol); =20 cleanup: - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return ret; } =20 @@ -5232,7 +5229,7 @@ testStorageVolGetPath(virStorageVolPtr vol) ignore_value(VIR_STRDUP(ret, privvol->target.path)); =20 cleanup: - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return ret; } =20 diff --git a/tests/storagevolxml2argvtest.c b/tests/storagevolxml2argvtest.c index 7b62243df3..0b2f2bb3d3 100644 --- a/tests/storagevolxml2argvtest.c +++ b/tests/storagevolxml2argvtest.c @@ -110,8 +110,7 @@ testCompareXMLToArgvFiles(bool shouldFail, virStorageVolDefFree(inputvol); virCommandFree(cmd); VIR_FREE(actualCmdline); - if (obj) - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); virStoragePoolObjFree(obj); virObjectUnref(conn); return ret; --=20 2.13.6 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Sat May 4 09:15:06 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 1510851528066833.0064000215261; Thu, 16 Nov 2017 08:58:48 -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 E669F7652C; Thu, 16 Nov 2017 16:58:16 +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 B6E3760DD7; Thu, 16 Nov 2017 16:58:16 +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 848FC1800BD2; Thu, 16 Nov 2017 16:58:15 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id vAGGwAsH011220 for ; Thu, 16 Nov 2017 11:58:10 -0500 Received: by smtp.corp.redhat.com (Postfix) id 6E16B2C7C4; Thu, 16 Nov 2017 16:58:10 +0000 (UTC) Received: from localhost.localdomain.com (ovpn-117-167.phx2.redhat.com [10.3.117.167]) by smtp.corp.redhat.com (Postfix) with ESMTP id 3834846E61 for ; Thu, 16 Nov 2017 16:58:10 +0000 (UTC) From: John Ferlan To: libvir-list@redhat.com Date: Thu, 16 Nov 2017 11:58:03 -0500 Message-Id: <20171116165805.14496-3-jferlan@redhat.com> In-Reply-To: <20171116165805.14496-1-jferlan@redhat.com> References: <20171116165805.14496-1-jferlan@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 2/4] storage: Introduce virStoragePoolObjListForEach 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.26]); Thu, 16 Nov 2017 16:58:17 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Create an API to walk the pools->objs[] list in order to perform a callback function for each element of the objs array that doesn't care about whether the action succeeds or fails as the desire is to run the code over every element in the array rather than fail as soon as or if one fails. Signed-off-by: John Ferlan Reviewed-by: Erik Skultety --- src/conf/virstorageobj.c | 29 +++++++++++ src/conf/virstorageobj.h | 9 ++++ src/libvirt_private.syms | 1 + src/storage/storage_driver.c | 115 +++++++++++++++++++++++----------------= ---- 4 files changed, 100 insertions(+), 54 deletions(-) diff --git a/src/conf/virstorageobj.c b/src/conf/virstorageobj.c index 2ca8453139..3cae34d970 100644 --- a/src/conf/virstorageobj.c +++ b/src/conf/virstorageobj.c @@ -230,6 +230,35 @@ virStoragePoolObjListFree(virStoragePoolObjListPtr poo= ls) } =20 =20 +/** + * virStoragePoolObjListForEach + * @pools: Pointer to pools object + * @iter: Callback iteration helper + * @opaque: Opaque data to use as argument to helper + * + * For each object in @pools, call the @iter helper using @opaque as + * an argument. This function doesn't care whether the @iter fails or + * not as it's being used for Autostart and UpdateAllState callers + * that want to iterate over all the @pools objects not stopping if + * one happens to fail. + */ +void +virStoragePoolObjListForEach(virStoragePoolObjListPtr pools, + virStoragePoolObjListIterator iter, + const void *opaque) +{ + size_t i; + virStoragePoolObjPtr obj; + + for (i =3D 0; i < pools->count; i++) { + obj =3D pools->objs[i]; + virStoragePoolObjLock(obj); + iter(obj, opaque); + virStoragePoolObjUnlock(obj); + } +} + + void virStoragePoolObjRemove(virStoragePoolObjListPtr pools, virStoragePoolObjPtr obj) diff --git a/src/conf/virstorageobj.h b/src/conf/virstorageobj.h index a4d7186d12..c84877694e 100644 --- a/src/conf/virstorageobj.h +++ b/src/conf/virstorageobj.h @@ -226,6 +226,15 @@ virStoragePoolObjFree(virStoragePoolObjPtr obj); void virStoragePoolObjListFree(virStoragePoolObjListPtr pools); =20 +typedef void +(*virStoragePoolObjListIterator)(virStoragePoolObjPtr obj, + const void *opaque); + +void +virStoragePoolObjListForEach(virStoragePoolObjListPtr pools, + virStoragePoolObjListIterator iter, + const void *opaque); + void virStoragePoolObjRemove(virStoragePoolObjListPtr pools, virStoragePoolObjPtr obj); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 57ba8f4038..62f423649a 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1089,6 +1089,7 @@ virStoragePoolObjIsActive; virStoragePoolObjIsAutostart; virStoragePoolObjIsDuplicate; virStoragePoolObjListExport; +virStoragePoolObjListForEach; virStoragePoolObjListFree; virStoragePoolObjLoadAllConfigs; virStoragePoolObjLoadAllState; diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c index 7cc3c518b4..db327a875a 100644 --- a/src/storage/storage_driver.c +++ b/src/storage/storage_driver.c @@ -157,24 +157,75 @@ storagePoolUpdateState(virStoragePoolObjPtr obj) return; } =20 + + +static void +storagePoolUpdateAllStateCallback(virStoragePoolObjPtr obj, + const void *opaque ATTRIBUTE_UNUSED) +{ + storagePoolUpdateState(obj); +} + + static void storagePoolUpdateAllState(void) { - size_t i; + virStoragePoolObjListForEach(&driver->pools, + storagePoolUpdateAllStateCallback, + NULL); +} =20 - for (i =3D 0; i < driver->pools.count; i++) { - virStoragePoolObjPtr obj =3D driver->pools.objs[i]; =20 - virStoragePoolObjLock(obj); - storagePoolUpdateState(obj); - virStoragePoolObjEndAPI(&obj); +static void +storageDriverAutostartCallback(virStoragePoolObjPtr obj, + const void *opaque) +{ + virStoragePoolDefPtr def =3D virStoragePoolObjGetDef(obj); + virConnectPtr conn =3D (virConnectPtr) opaque; + virStorageBackendPtr backend; + bool started =3D false; + + if (!(backend =3D virStorageBackendForType(def->type))) + return; + + if (virStoragePoolObjIsAutostart(obj) && + !virStoragePoolObjIsActive(obj)) { + if (backend->startPool && + backend->startPool(conn, obj) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Failed to autostart storage pool '%s': %s"), + def->name, virGetLastErrorMessage()); + return; + } + started =3D true; + } + + if (started) { + char *stateFile; + + virStoragePoolObjClearVols(obj); + stateFile =3D virFileBuildPath(driver->stateDir, def->name, ".xml"= ); + if (!stateFile || + virStoragePoolSaveState(stateFile, def) < 0 || + backend->refreshPool(conn, obj) < 0) { + if (stateFile) + unlink(stateFile); + if (backend->stopPool) + backend->stopPool(conn, obj); + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Failed to autostart storage pool '%s': %s"), + def->name, virGetLastErrorMessage()); + } else { + virStoragePoolObjSetActive(obj, true); + } + VIR_FREE(stateFile); } } =20 + static void storageDriverAutostart(void) { - size_t i; virConnectPtr conn =3D NULL; =20 /* XXX Remove hardcoding of QEMU URI */ @@ -184,53 +235,9 @@ storageDriverAutostart(void) conn =3D virConnectOpen("qemu:///session"); /* Ignoring NULL conn - let backends decide */ =20 - for (i =3D 0; i < driver->pools.count; i++) { - virStoragePoolObjPtr obj =3D driver->pools.objs[i]; - virStoragePoolDefPtr def =3D virStoragePoolObjGetDef(obj); - virStorageBackendPtr backend; - bool started =3D false; - - virStoragePoolObjLock(obj); - if ((backend =3D virStorageBackendForType(def->type)) =3D=3D NULL)= { - virStoragePoolObjEndAPI(&obj); - continue; - } - - if (virStoragePoolObjIsAutostart(obj) && - !virStoragePoolObjIsActive(obj)) { - if (backend->startPool && - backend->startPool(conn, obj) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("Failed to autostart storage pool '%s': %= s"), - def->name, virGetLastErrorMessage()); - virStoragePoolObjEndAPI(&obj); - continue; - } - started =3D true; - } - - if (started) { - char *stateFile; - - virStoragePoolObjClearVols(obj); - stateFile =3D virFileBuildPath(driver->stateDir, def->name, ".= xml"); - if (!stateFile || - virStoragePoolSaveState(stateFile, def) < 0 || - backend->refreshPool(conn, obj) < 0) { - if (stateFile) - unlink(stateFile); - if (backend->stopPool) - backend->stopPool(conn, obj); - virReportError(VIR_ERR_INTERNAL_ERROR, - _("Failed to autostart storage pool '%s': %= s"), - def->name, virGetLastErrorMessage()); - } else { - virStoragePoolObjSetActive(obj, true); - } - VIR_FREE(stateFile); - } - virStoragePoolObjEndAPI(&obj); - } + virStoragePoolObjListForEach(&driver->pools, + storageDriverAutostartCallback, + conn); =20 virObjectUnref(conn); } --=20 2.13.6 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Sat May 4 09:15:06 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 151085154127852.68324331060228; Thu, 16 Nov 2017 08:59:01 -0800 (PST) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 27A552DB711; Thu, 16 Nov 2017 16:58:30 +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 03EE746E6A; Thu, 16 Nov 2017 16:58: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 BE8B73D385; Thu, 16 Nov 2017 16:58:29 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id vAGGwAeb011225 for ; Thu, 16 Nov 2017 11:58:10 -0500 Received: by smtp.corp.redhat.com (Postfix) id E56B92C7C4; Thu, 16 Nov 2017 16:58:10 +0000 (UTC) Received: from localhost.localdomain.com (ovpn-117-167.phx2.redhat.com [10.3.117.167]) by smtp.corp.redhat.com (Postfix) with ESMTP id AD98046E64 for ; Thu, 16 Nov 2017 16:58:10 +0000 (UTC) From: John Ferlan To: libvir-list@redhat.com Date: Thu, 16 Nov 2017 11:58:04 -0500 Message-Id: <20171116165805.14496-4-jferlan@redhat.com> In-Reply-To: <20171116165805.14496-1-jferlan@redhat.com> References: <20171116165805.14496-1-jferlan@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 3/4] storage: Introduce virStoragePoolObjListSearch 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.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Thu, 16 Nov 2017 16:58:30 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Create an API to search through the storage pool objects looking for a specific truism from a callback API in order to return the specific storage pool object that is desired. Signed-off-by: John Ferlan Reviewed-by: Erik Skultety --- src/conf/virstorageobj.c | 32 ++++++ src/conf/virstorageobj.h | 9 ++ src/libvirt_private.syms | 1 + src/storage/storage_driver.c | 226 +++++++++++++++++++++++----------------= ---- src/test/test_driver.c | 91 ++++++++++------- 5 files changed, 218 insertions(+), 141 deletions(-) diff --git a/src/conf/virstorageobj.c b/src/conf/virstorageobj.c index 3cae34d970..eb8a57324b 100644 --- a/src/conf/virstorageobj.c +++ b/src/conf/virstorageobj.c @@ -259,6 +259,38 @@ virStoragePoolObjListForEach(virStoragePoolObjListPtr = pools, } =20 =20 +/** + * virStoragePoolObjListSearch + * @pools: Pointer to pools object + * @search: Callback searcher helper + * @opaque: Opaque data to use as argument to helper + * + * Search through the @pools objects calling the @search helper using + * the @opaque data in order to find an object that matches some criteria + * and return that object locked. + * + * Returns a locked object when found and NULL when not found + */ +virStoragePoolObjPtr +virStoragePoolObjListSearch(virStoragePoolObjListPtr pools, + virStoragePoolObjListSearcher searcher, + const void *opaque) +{ + size_t i; + virStoragePoolObjPtr obj; + + for (i =3D 0; i < pools->count; i++) { + obj =3D pools->objs[i]; + virStoragePoolObjLock(obj); + if (searcher(obj, opaque)) + return obj; + virStoragePoolObjUnlock(obj); + } + + return NULL; +} + + void virStoragePoolObjRemove(virStoragePoolObjListPtr pools, virStoragePoolObjPtr obj) diff --git a/src/conf/virstorageobj.h b/src/conf/virstorageobj.h index c84877694e..7fe4a9f68a 100644 --- a/src/conf/virstorageobj.h +++ b/src/conf/virstorageobj.h @@ -235,6 +235,15 @@ virStoragePoolObjListForEach(virStoragePoolObjListPtr = pools, virStoragePoolObjListIterator iter, const void *opaque); =20 +typedef bool +(*virStoragePoolObjListSearcher)(virStoragePoolObjPtr obj, + const void *opaque); + +virStoragePoolObjPtr +virStoragePoolObjListSearch(virStoragePoolObjListPtr pools, + virStoragePoolObjListSearcher searcher, + const void *opaque); + void virStoragePoolObjRemove(virStoragePoolObjListPtr pools, virStoragePoolObjPtr obj); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 62f423649a..e4aebb3ca5 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1091,6 +1091,7 @@ virStoragePoolObjIsDuplicate; virStoragePoolObjListExport; virStoragePoolObjListForEach; virStoragePoolObjListFree; +virStoragePoolObjListSearch; virStoragePoolObjLoadAllConfigs; virStoragePoolObjLoadAllState; virStoragePoolObjLock; diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c index db327a875a..033196dc95 100644 --- a/src/storage/storage_driver.c +++ b/src/storage/storage_driver.c @@ -1497,171 +1497,188 @@ storageVolLookupByName(virStoragePoolPtr pool, } =20 =20 +struct storageVolLookupData { + virConnectPtr conn; + const char *key; + char *cleanpath; + const char *path; + virStorageVolDefPtr voldef; +}; + +static bool +storageVolLookupByKeyCallback(virStoragePoolObjPtr obj, + const void *opaque) +{ + struct storageVolLookupData *data =3D (struct storageVolLookupData *) = opaque; + + if (virStoragePoolObjIsActive(obj)) + data->voldef =3D virStorageVolDefFindByKey(obj, data->key); + + return !!data->voldef; +} + + static virStorageVolPtr storageVolLookupByKey(virConnectPtr conn, const char *key) { - size_t i; + virStoragePoolObjPtr obj; + virStoragePoolDefPtr def; + struct storageVolLookupData data =3D { + .conn =3D conn, .key =3D key, .voldef =3D NULL }; virStorageVolPtr vol =3D NULL; =20 storageDriverLock(); - for (i =3D 0; i < driver->pools.count && !vol; i++) { - virStoragePoolObjPtr obj =3D driver->pools.objs[i]; - virStoragePoolDefPtr def; - - virStoragePoolObjLock(obj); + if ((obj =3D virStoragePoolObjListSearch(&driver->pools, + storageVolLookupByKeyCallback, + &data)) && data.voldef) { def =3D virStoragePoolObjGetDef(obj); - if (virStoragePoolObjIsActive(obj)) { - virStorageVolDefPtr voldef =3D virStorageVolDefFindByKey(obj, = key); - - if (voldef) { - if (virStorageVolLookupByKeyEnsureACL(conn, def, voldef) <= 0) { - virStoragePoolObjEndAPI(&obj); - goto cleanup; - } - - vol =3D virGetStorageVol(conn, def->name, - voldef->name, voldef->key, - NULL, NULL); - } + if (virStorageVolLookupByKeyEnsureACL(conn, def, data.voldef) =3D= =3D 0) { + vol =3D virGetStorageVol(conn, def->name, + data.voldef->name, data.voldef->key, + NULL, NULL); } virStoragePoolObjEndAPI(&obj); } + storageDriverUnlock(); =20 if (!vol) virReportError(VIR_ERR_NO_STORAGE_VOL, _("no storage vol with matching key %s"), key); =20 - cleanup: - storageDriverUnlock(); return vol; } =20 + +static bool +storageVolLookupByPathCallback(virStoragePoolObjPtr obj, + const void *opaque) +{ + struct storageVolLookupData *data =3D (struct storageVolLookupData *) = opaque; + virStoragePoolDefPtr def; + char *stable_path =3D NULL; + + if (!virStoragePoolObjIsActive(obj)) + return false; + + def =3D virStoragePoolObjGetDef(obj); + + switch ((virStoragePoolType) def->type) { + case VIR_STORAGE_POOL_DIR: + case VIR_STORAGE_POOL_FS: + case VIR_STORAGE_POOL_NETFS: + case VIR_STORAGE_POOL_LOGICAL: + case VIR_STORAGE_POOL_DISK: + case VIR_STORAGE_POOL_ISCSI: + case VIR_STORAGE_POOL_SCSI: + case VIR_STORAGE_POOL_MPATH: + case VIR_STORAGE_POOL_VSTORAGE: + stable_path =3D virStorageBackendStablePath(obj, data->cleanpa= th, + false); + break; + + case VIR_STORAGE_POOL_GLUSTER: + case VIR_STORAGE_POOL_RBD: + case VIR_STORAGE_POOL_SHEEPDOG: + case VIR_STORAGE_POOL_ZFS: + case VIR_STORAGE_POOL_LAST: + ignore_value(VIR_STRDUP(stable_path, data->path)); + break; + } + + /* Don't break the whole lookup process if it fails on + * getting the stable path for some of the pools. */ + if (!stable_path) { + VIR_WARN("Failed to get stable path for pool '%s'", def->name); + return false; + } + + data->voldef =3D virStorageVolDefFindByPath(obj, stable_path); + VIR_FREE(stable_path); + + return !!data->voldef; +} + + static virStorageVolPtr storageVolLookupByPath(virConnectPtr conn, const char *path) { - size_t i; + virStoragePoolObjPtr obj; + virStoragePoolDefPtr def; + struct storageVolLookupData data =3D { + .conn =3D conn, .path =3D path, .voldef =3D NULL }; virStorageVolPtr vol =3D NULL; - char *cleanpath; =20 - cleanpath =3D virFileSanitizePath(path); - if (!cleanpath) + if (!(data.cleanpath =3D virFileSanitizePath(path))) return NULL; =20 storageDriverLock(); - for (i =3D 0; i < driver->pools.count && !vol; i++) { - virStoragePoolObjPtr obj =3D driver->pools.objs[i]; - virStoragePoolDefPtr def; - virStorageVolDefPtr voldef; - char *stable_path =3D NULL; - - virStoragePoolObjLock(obj); + if ((obj =3D virStoragePoolObjListSearch(&driver->pools, + storageVolLookupByPathCallback, + &data)) && data.voldef) { def =3D virStoragePoolObjGetDef(obj); =20 - if (!virStoragePoolObjIsActive(obj)) { - virStoragePoolObjEndAPI(&obj); - continue; - } - - switch ((virStoragePoolType) def->type) { - case VIR_STORAGE_POOL_DIR: - case VIR_STORAGE_POOL_FS: - case VIR_STORAGE_POOL_NETFS: - case VIR_STORAGE_POOL_LOGICAL: - case VIR_STORAGE_POOL_DISK: - case VIR_STORAGE_POOL_ISCSI: - case VIR_STORAGE_POOL_SCSI: - case VIR_STORAGE_POOL_MPATH: - case VIR_STORAGE_POOL_VSTORAGE: - stable_path =3D virStorageBackendStablePath(obj, - cleanpath, - false); - if (stable_path =3D=3D NULL) { - /* Don't break the whole lookup process if it fails on - * getting the stable path for some of the pools. - */ - VIR_WARN("Failed to get stable path for pool '%s'", - def->name); - virStoragePoolObjEndAPI(&obj); - continue; - } - break; - - case VIR_STORAGE_POOL_GLUSTER: - case VIR_STORAGE_POOL_RBD: - case VIR_STORAGE_POOL_SHEEPDOG: - case VIR_STORAGE_POOL_ZFS: - case VIR_STORAGE_POOL_LAST: - if (VIR_STRDUP(stable_path, path) < 0) { - virStoragePoolObjEndAPI(&obj); - goto cleanup; - } - break; - } - - voldef =3D virStorageVolDefFindByPath(obj, stable_path); - VIR_FREE(stable_path); - - if (voldef) { - if (virStorageVolLookupByPathEnsureACL(conn, def, voldef) < 0)= { - virStoragePoolObjEndAPI(&obj); - goto cleanup; - } - + if (virStorageVolLookupByPathEnsureACL(conn, def, data.voldef) =3D= =3D 0) { vol =3D virGetStorageVol(conn, def->name, - voldef->name, voldef->key, + data.voldef->name, data.voldef->key, NULL, NULL); } - virStoragePoolObjEndAPI(&obj); } + storageDriverUnlock(); =20 if (!vol) { - if (STREQ(path, cleanpath)) { + if (STREQ(path, data.cleanpath)) { virReportError(VIR_ERR_NO_STORAGE_VOL, _("no storage vol with matching path '%s'"), pa= th); } else { virReportError(VIR_ERR_NO_STORAGE_VOL, _("no storage vol with matching path '%s' (%s)"= ), - path, cleanpath); + path, data.cleanpath); } } =20 - cleanup: - VIR_FREE(cleanpath); - storageDriverUnlock(); + VIR_FREE(data.cleanpath); return vol; } =20 + +static bool +storagePoolLookupByTargetPathCallback(virStoragePoolObjPtr obj, + const void *opaque) +{ + const char *path =3D opaque; + virStoragePoolDefPtr def; + + if (!virStoragePoolObjIsActive(obj)) + return false; + + def =3D virStoragePoolObjGetDef(obj); + return STREQ(path, def->target.path); +} + + virStoragePoolPtr storagePoolLookupByTargetPath(virConnectPtr conn, const char *path) { - size_t i; + virStoragePoolObjPtr obj; + virStoragePoolDefPtr def; virStoragePoolPtr pool =3D NULL; char *cleanpath; =20 cleanpath =3D virFileSanitizePath(path); if (!cleanpath) return NULL; + VIR_FREE(cleanpath); =20 storageDriverLock(); - for (i =3D 0; i < driver->pools.count && !pool; i++) { - virStoragePoolObjPtr obj =3D driver->pools.objs[i]; - virStoragePoolDefPtr def; - - virStoragePoolObjLock(obj); + if ((obj =3D=3D virStoragePoolObjListSearch(&driver->pools, + storagePoolLookupByTargetPathC= allback, + path))) { def =3D virStoragePoolObjGetDef(obj); - - if (!virStoragePoolObjIsActive(obj)) { - virStoragePoolObjEndAPI(&obj); - continue; - } - - if (STREQ(path, def->target.path)) - pool =3D virGetStoragePool(conn, def->name, def->uuid, NULL, N= ULL); - + pool =3D virGetStoragePool(conn, def->name, def->uuid, NULL, NULL); virStoragePoolObjEndAPI(&obj); } storageDriverUnlock(); @@ -1672,7 +1689,6 @@ storagePoolLookupByTargetPath(virConnectPtr conn, path); } =20 - VIR_FREE(cleanpath); return pool; } =20 diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 72b3c6db5d..25b6592bcd 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -4908,6 +4908,26 @@ testStorageVolLookupByName(virStoragePoolPtr pool, } =20 =20 +struct storageVolLookupData { + virConnectPtr conn; + const char *key; + const char *path; + virStorageVolDefPtr voldef; +}; + +static bool +testStorageVolLookupByKeyCallback(virStoragePoolObjPtr obj, + const void *opaque) +{ + struct storageVolLookupData *data =3D (struct storageVolLookupData *) = opaque; + + if (virStoragePoolObjIsActive(obj)) + data->voldef =3D virStorageVolDefFindByKey(obj, data->key); + + return !!data->voldef; +} + + static virStorageVolPtr testStorageVolLookupByKey(virConnectPtr conn, const char *key) @@ -4915,34 +4935,40 @@ testStorageVolLookupByKey(virConnectPtr conn, testDriverPtr privconn =3D conn->privateData; virStoragePoolObjPtr obj; virStoragePoolDefPtr def; - size_t i; - virStorageVolPtr ret =3D NULL; + struct storageVolLookupData data =3D { + .conn =3D conn, .key =3D key, .voldef =3D NULL }; + virStorageVolPtr vol =3D NULL; =20 testDriverLock(privconn); - for (i =3D 0; i < privconn->pools.count; i++) { - obj =3D privconn->pools.objs[i]; - virStoragePoolObjLock(obj); + if ((obj =3D virStoragePoolObjListSearch(&privconn->pools, + testStorageVolLookupByKeyCallba= ck, + &data)) && data.voldef) { def =3D virStoragePoolObjGetDef(obj); - if (virStoragePoolObjIsActive(obj)) { - virStorageVolDefPtr privvol =3D virStorageVolDefFindByKey(obj,= key); - - if (privvol) { - ret =3D virGetStorageVol(conn, def->name, - privvol->name, privvol->key, - NULL, NULL); - virStoragePoolObjEndAPI(&obj); - break; - } - } + vol =3D virGetStorageVol(conn, def->name, + data.voldef->name, data.voldef->key, + NULL, NULL); virStoragePoolObjEndAPI(&obj); } testDriverUnlock(privconn); =20 - if (!ret) + if (!vol) virReportError(VIR_ERR_NO_STORAGE_VOL, _("no storage vol with matching key '%s'"), key); =20 - return ret; + return vol; +} + + +static bool +testStorageVolLookupByPathCallback(virStoragePoolObjPtr obj, + const void *opaque) +{ + struct storageVolLookupData *data =3D (struct storageVolLookupData *) = opaque; + + if (virStoragePoolObjIsActive(obj)) + data->voldef =3D virStorageVolDefFindByPath(obj, data->path); + + return !!data->voldef; } =20 =20 @@ -4953,34 +4979,27 @@ testStorageVolLookupByPath(virConnectPtr conn, testDriverPtr privconn =3D conn->privateData; virStoragePoolObjPtr obj; virStoragePoolDefPtr def; - size_t i; - virStorageVolPtr ret =3D NULL; + struct storageVolLookupData data =3D { + .conn =3D conn, .path =3D path, .voldef =3D NULL }; + virStorageVolPtr vol =3D NULL; =20 testDriverLock(privconn); - for (i =3D 0; i < privconn->pools.count; i++) { - obj =3D privconn->pools.objs[i]; - virStoragePoolObjLock(obj); + if ((obj =3D virStoragePoolObjListSearch(&privconn->pools, + testStorageVolLookupByPathCallb= ack, + &data)) && data.voldef) { def =3D virStoragePoolObjGetDef(obj); - if (virStoragePoolObjIsActive(obj)) { - virStorageVolDefPtr privvol =3D virStorageVolDefFindByPath(obj= , path); - - if (privvol) { - ret =3D virGetStorageVol(conn, def->name, - privvol->name, privvol->key, - NULL, NULL); - virStoragePoolObjEndAPI(&obj); - break; - } - } + vol =3D virGetStorageVol(conn, def->name, + data.voldef->name, data.voldef->key, + NULL, NULL); virStoragePoolObjEndAPI(&obj); } testDriverUnlock(privconn); =20 - if (!ret) + if (!vol) virReportError(VIR_ERR_NO_STORAGE_VOL, _("no storage vol with matching path '%s'"), path); =20 - return ret; + return vol; } =20 =20 --=20 2.13.6 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Sat May 4 09:15:06 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 1510851541505982.9650209690178; Thu, 16 Nov 2017 08:59:01 -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 5101BD5700; Thu, 16 Nov 2017 16:58: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 2857E5C2F0; Thu, 16 Nov 2017 16:58: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 E1ED51800BDC; Thu, 16 Nov 2017 16:58:29 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id vAGGwBib011230 for ; Thu, 16 Nov 2017 11:58:11 -0500 Received: by smtp.corp.redhat.com (Postfix) id 4DAF02C7C4; Thu, 16 Nov 2017 16:58:11 +0000 (UTC) Received: from localhost.localdomain.com (ovpn-117-167.phx2.redhat.com [10.3.117.167]) by smtp.corp.redhat.com (Postfix) with ESMTP id 154B046E61 for ; Thu, 16 Nov 2017 16:58:11 +0000 (UTC) From: John Ferlan To: libvir-list@redhat.com Date: Thu, 16 Nov 2017 11:58:05 -0500 Message-Id: <20171116165805.14496-5-jferlan@redhat.com> In-Reply-To: <20171116165805.14496-1-jferlan@redhat.com> References: <20171116165805.14496-1-jferlan@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 4/4] storage: Convert virStoragePoolObj into virObjectLockable 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.38]); Thu, 16 Nov 2017 16:58:30 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Now that we're moved the object into virstorageobj, let's make the code use the lockable object. Signed-off-by: John Ferlan Reviewed-by: Erik Skultety --- src/conf/virstorageobj.c | 136 +++++++++++++++++++++----------------= ---- src/conf/virstorageobj.h | 3 - src/libvirt_private.syms | 1 - src/storage/storage_driver.c | 18 +++--- tests/storagevolxml2argvtest.c | 1 - 5 files changed, 77 insertions(+), 82 deletions(-) diff --git a/src/conf/virstorageobj.c b/src/conf/virstorageobj.c index eb8a57324b..357e6a967e 100644 --- a/src/conf/virstorageobj.c +++ b/src/conf/virstorageobj.c @@ -36,8 +36,10 @@ =20 VIR_LOG_INIT("conf.virstorageobj"); =20 +static virClassPtr virStoragePoolObjClass; + static void -virStoragePoolObjUnlock(virStoragePoolObjPtr obj); +virStoragePoolObjDispose(void *opaque); =20 =20 struct _virStorageVolDefList { @@ -46,7 +48,7 @@ struct _virStorageVolDefList { }; =20 struct _virStoragePoolObj { - virMutex lock; + virObjectLockable parent; =20 char *configFile; char *autostartLink; @@ -60,21 +62,34 @@ struct _virStoragePoolObj { virStorageVolDefList volumes; }; =20 + +static int +virStoragePoolObjOnceInit(void) +{ + if (!(virStoragePoolObjClass =3D virClassNew(virClassForObjectLockable= (), + "virStoragePoolObj", + sizeof(virStoragePoolObj), + virStoragePoolObjDispose))) + return -1; + + return 0; +} + +VIR_ONCE_GLOBAL_INIT(virStoragePoolObj) + + virStoragePoolObjPtr virStoragePoolObjNew(void) { virStoragePoolObjPtr obj; =20 - if (VIR_ALLOC(obj) < 0) + if (virStoragePoolObjInitialize() < 0) return NULL; =20 - if (virMutexInit(&obj->lock) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("cannot initialize mutex")); - VIR_FREE(obj); + if (!(obj =3D virObjectLockableNew(virStoragePoolObjClass))) return NULL; - } - virStoragePoolObjLock(obj); + + virObjectLock(obj); obj->active =3D false; return obj; } @@ -86,7 +101,9 @@ virStoragePoolObjEndAPI(virStoragePoolObjPtr *obj) if (!*obj) return; =20 - virStoragePoolObjUnlock(*obj); + virObjectUnlock(*obj); + virObjectUnref(*obj); + *obj =3D NULL; } =20 =20 @@ -200,8 +217,10 @@ virStoragePoolObjDecrAsyncjobs(virStoragePoolObjPtr ob= j) =20 =20 void -virStoragePoolObjFree(virStoragePoolObjPtr obj) +virStoragePoolObjDispose(void *opaque) { + virStoragePoolObjPtr obj =3D opaque; + if (!obj) return; =20 @@ -212,10 +231,6 @@ virStoragePoolObjFree(virStoragePoolObjPtr obj) =20 VIR_FREE(obj->configFile); VIR_FREE(obj->autostartLink); - - virMutexDestroy(&obj->lock); - - VIR_FREE(obj); } =20 =20 @@ -224,7 +239,7 @@ virStoragePoolObjListFree(virStoragePoolObjListPtr pool= s) { size_t i; for (i =3D 0; i < pools->count; i++) - virStoragePoolObjFree(pools->objs[i]); + virObjectUnref(pools->objs[i]); VIR_FREE(pools->objs); pools->count =3D 0; } @@ -252,9 +267,9 @@ virStoragePoolObjListForEach(virStoragePoolObjListPtr p= ools, =20 for (i =3D 0; i < pools->count; i++) { obj =3D pools->objs[i]; - virStoragePoolObjLock(obj); + virObjectLock(obj); iter(obj, opaque); - virStoragePoolObjUnlock(obj); + virObjectUnlock(obj); } } =20 @@ -269,7 +284,7 @@ virStoragePoolObjListForEach(virStoragePoolObjListPtr p= ools, * the @opaque data in order to find an object that matches some criteria * and return that object locked. * - * Returns a locked object when found and NULL when not found + * Returns a locked and reffed object when found and NULL when not found */ virStoragePoolObjPtr virStoragePoolObjListSearch(virStoragePoolObjListPtr pools, @@ -281,10 +296,10 @@ virStoragePoolObjListSearch(virStoragePoolObjListPtr = pools, =20 for (i =3D 0; i < pools->count; i++) { obj =3D pools->objs[i]; - virStoragePoolObjLock(obj); + virObjectLock(obj); if (searcher(obj, opaque)) - return obj; - virStoragePoolObjUnlock(obj); + return virObjectRef(obj); + virObjectUnlock(obj); } =20 return NULL; @@ -297,18 +312,18 @@ virStoragePoolObjRemove(virStoragePoolObjListPtr pool= s, { size_t i; =20 - virStoragePoolObjUnlock(obj); + virObjectUnlock(obj); =20 for (i =3D 0; i < pools->count; i++) { - virStoragePoolObjLock(pools->objs[i]); + virObjectLock(pools->objs[i]); if (pools->objs[i] =3D=3D obj) { - virStoragePoolObjUnlock(pools->objs[i]); - virStoragePoolObjFree(pools->objs[i]); + virObjectUnlock(pools->objs[i]); + virObjectUnref(pools->objs[i]); =20 VIR_DELETE_ELEMENT(pools->objs, i, pools->count); break; } - virStoragePoolObjUnlock(pools->objs[i]); + virObjectUnlock(pools->objs[i]); } } =20 @@ -320,10 +335,12 @@ virStoragePoolObjFindByUUID(virStoragePoolObjListPtr = pools, size_t i; =20 for (i =3D 0; i < pools->count; i++) { - virStoragePoolObjLock(pools->objs[i]); - if (!memcmp(pools->objs[i]->def->uuid, uuid, VIR_UUID_BUFLEN)) - return pools->objs[i]; - virStoragePoolObjUnlock(pools->objs[i]); + virStoragePoolObjPtr obj =3D pools->objs[i]; + + virObjectLock(obj); + if (!memcmp(obj->def->uuid, uuid, VIR_UUID_BUFLEN)) + return virObjectRef(obj); + virObjectUnlock(obj); } =20 return NULL; @@ -337,10 +354,12 @@ virStoragePoolObjFindByName(virStoragePoolObjListPtr = pools, size_t i; =20 for (i =3D 0; i < pools->count; i++) { - virStoragePoolObjLock(pools->objs[i]); - if (STREQ(pools->objs[i]->def->name, name)) - return pools->objs[i]; - virStoragePoolObjUnlock(pools->objs[i]); + virStoragePoolObjPtr obj =3D pools->objs[i]; + + virObjectLock(obj); + if (STREQ(obj->def->name, name)) + return virObjectRef(obj); + virObjectUnlock(obj); } =20 return NULL; @@ -608,13 +627,12 @@ virStoragePoolObjAssignDef(virStoragePoolObjListPtr p= ools, return NULL; =20 if (VIR_APPEND_ELEMENT_COPY(pools->objs, pools->count, obj) < 0) { - virStoragePoolObjUnlock(obj); - virStoragePoolObjFree(obj); + virStoragePoolObjEndAPI(&obj); return NULL; } obj->def =3D def; =20 - return obj; + return virObjectRef(obj); } =20 =20 @@ -741,7 +759,7 @@ virStoragePoolObjLoadAllState(virStoragePoolObjListPtr = pools, =20 if (!(obj =3D virStoragePoolObjLoadState(pools, stateDir, entry->d= _name))) continue; - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); } =20 VIR_DIR_CLOSE(dir); @@ -780,8 +798,7 @@ virStoragePoolObjLoadAllConfigs(virStoragePoolObjListPt= r pools, } =20 obj =3D virStoragePoolObjLoad(pools, entry->d_name, path, autostar= tLink); - if (obj) - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); =20 VIR_FREE(path); VIR_FREE(autostartLink); @@ -852,12 +869,12 @@ virStoragePoolObjNumOfStoragePools(virStoragePoolObjL= istPtr pools, =20 for (i =3D 0; i < pools->count; i++) { virStoragePoolObjPtr obj =3D pools->objs[i]; - virStoragePoolObjLock(obj); + virObjectLock(obj); if (!filter || filter(conn, obj->def)) { if (wantActive =3D=3D virStoragePoolObjIsActive(obj)) npools++; } - virStoragePoolObjUnlock(obj); + virObjectUnlock(obj); } =20 return npools; @@ -877,17 +894,17 @@ virStoragePoolObjGetNames(virStoragePoolObjListPtr po= ols, =20 for (i =3D 0; i < pools->count && nnames < maxnames; i++) { virStoragePoolObjPtr obj =3D pools->objs[i]; - virStoragePoolObjLock(obj); + virObjectLock(obj); if (!filter || filter(conn, obj->def)) { if (wantActive =3D=3D virStoragePoolObjIsActive(obj)) { if (VIR_STRDUP(names[nnames], obj->def->name) < 0) { - virStoragePoolObjUnlock(obj); + virObjectUnlock(obj); goto failure; } nnames++; } } - virStoragePoolObjUnlock(obj); + virObjectUnlock(obj); } =20 return nnames; @@ -957,8 +974,7 @@ virStoragePoolObjIsDuplicate(virStoragePoolObjListPtr p= ools, } =20 cleanup: - if (obj) - virStoragePoolObjUnlock(obj); + virStoragePoolObjEndAPI(&obj); return ret; } =20 @@ -1273,7 +1289,7 @@ virStoragePoolObjSourceFindDuplicate(virConnectPtr co= nn, if (STREQ(obj->def->name, def->name)) continue; =20 - virStoragePoolObjLock(obj); + virObjectLock(obj); =20 switch ((virStoragePoolType)obj->def->type) { case VIR_STORAGE_POOL_DIR: @@ -1325,7 +1341,7 @@ virStoragePoolObjSourceFindDuplicate(virConnectPtr co= nn, case VIR_STORAGE_POOL_LAST: break; } - virStoragePoolObjUnlock(obj); + virObjectUnlock(obj); =20 if (matchobj) break; @@ -1341,20 +1357,6 @@ virStoragePoolObjSourceFindDuplicate(virConnectPtr c= onn, } =20 =20 -void -virStoragePoolObjLock(virStoragePoolObjPtr obj) -{ - virMutexLock(&obj->lock); -} - - -static void -virStoragePoolObjUnlock(virStoragePoolObjPtr obj) -{ - virMutexUnlock(&obj->lock); -} - - #define MATCH(FLAG) (flags & (FLAG)) static bool virStoragePoolMatch(virStoragePoolObjPtr obj, @@ -1438,7 +1440,7 @@ virStoragePoolObjListExport(virConnectPtr conn, =20 for (i =3D 0; i < poolobjs->count; i++) { virStoragePoolObjPtr obj =3D poolobjs->objs[i]; - virStoragePoolObjLock(obj); + virObjectLock(obj); if ((!filter || filter(conn, obj->def)) && virStoragePoolMatch(obj, flags)) { if (pools) { @@ -1446,14 +1448,14 @@ virStoragePoolObjListExport(virConnectPtr conn, obj->def->name, obj->def->uuid, NULL, NULL))) { - virStoragePoolObjUnlock(obj); + virObjectUnlock(obj); goto cleanup; } tmp_pools[npools] =3D pool; } npools++; } - virStoragePoolObjUnlock(obj); + virObjectUnlock(obj); } =20 if (tmp_pools) { diff --git a/src/conf/virstorageobj.h b/src/conf/virstorageobj.h index 7fe4a9f68a..34c4c9e10b 100644 --- a/src/conf/virstorageobj.h +++ b/src/conf/virstorageobj.h @@ -258,9 +258,6 @@ virStoragePoolObjSourceFindDuplicate(virConnectPtr conn, virStoragePoolObjListPtr pools, virStoragePoolDefPtr def); =20 -void -virStoragePoolObjLock(virStoragePoolObjPtr obj); - int virStoragePoolObjListExport(virConnectPtr conn, virStoragePoolObjListPtr poolobjs, diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index e4aebb3ca5..e408df8671 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1094,7 +1094,6 @@ virStoragePoolObjListFree; virStoragePoolObjListSearch; virStoragePoolObjLoadAllConfigs; virStoragePoolObjLoadAllState; -virStoragePoolObjLock; virStoragePoolObjNew; virStoragePoolObjNumOfStoragePools; virStoragePoolObjNumOfVolumes; diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c index 033196dc95..e19b5a2071 100644 --- a/src/storage/storage_driver.c +++ b/src/storage/storage_driver.c @@ -1768,7 +1768,6 @@ virStorageVolDefFromVol(virStorageVolPtr vol, =20 error: virStoragePoolObjEndAPI(obj); - *obj =3D NULL; =20 return NULL; } @@ -1901,14 +1900,14 @@ storageVolCreateXML(virStoragePoolPtr pool, /* Drop the pool lock during volume allocation */ virStoragePoolObjIncrAsyncjobs(obj); voldef->building =3D true; - virStoragePoolObjEndAPI(&obj); + virObjectUnlock(obj); =20 buildret =3D backend->buildVol(pool->conn, obj, buildvoldef, flags= ); =20 VIR_FREE(buildvoldef); =20 storageDriverLock(); - virStoragePoolObjLock(obj); + virObjectLock(obj); storageDriverUnlock(); =20 voldef->building =3D false; @@ -1976,9 +1975,9 @@ storageVolCreateXMLFrom(virStoragePoolPtr pool, storageDriverLock(); obj =3D virStoragePoolObjFindByUUID(&driver->pools, pool->uuid); if (obj && STRNEQ(pool->name, volsrc->pool)) { - virStoragePoolObjEndAPI(&obj); + virObjectUnlock(obj); objsrc =3D virStoragePoolObjFindByName(&driver->pools, volsrc->poo= l); - virStoragePoolObjLock(obj); + virObjectLock(obj); } storageDriverUnlock(); if (!obj) { @@ -2097,19 +2096,19 @@ storageVolCreateXMLFrom(virStoragePoolPtr pool, virStoragePoolObjIncrAsyncjobs(obj); voldef->building =3D true; voldefsrc->in_use++; - virStoragePoolObjEndAPI(&obj); + virObjectUnlock(obj); =20 if (objsrc) { virStoragePoolObjIncrAsyncjobs(objsrc); - virStoragePoolObjEndAPI(&objsrc); + virObjectUnlock(objsrc); } =20 buildret =3D backend->buildVolFrom(pool->conn, obj, shadowvol, voldefs= rc, flags); =20 storageDriverLock(); - virStoragePoolObjLock(obj); + virObjectLock(obj); if (objsrc) - virStoragePoolObjLock(objsrc); + virObjectLock(objsrc); storageDriverUnlock(); =20 voldefsrc->in_use--; @@ -2119,7 +2118,6 @@ storageVolCreateXMLFrom(virStoragePoolPtr pool, if (objsrc) { virStoragePoolObjDecrAsyncjobs(objsrc); virStoragePoolObjEndAPI(&objsrc); - objsrc =3D NULL; } =20 if (buildret < 0 || diff --git a/tests/storagevolxml2argvtest.c b/tests/storagevolxml2argvtest.c index 0b2f2bb3d3..1cd083766a 100644 --- a/tests/storagevolxml2argvtest.c +++ b/tests/storagevolxml2argvtest.c @@ -111,7 +111,6 @@ testCompareXMLToArgvFiles(bool shouldFail, virCommandFree(cmd); VIR_FREE(actualCmdline); virStoragePoolObjEndAPI(&obj); - virStoragePoolObjFree(obj); virObjectUnref(conn); return ret; } --=20 2.13.6 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list