From nobody Mon Feb 9 22:09:39 2026 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