From nobody Sun Feb 8 19:54:56 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 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