diff --git a/src/conf/virstorageobj.c b/src/conf/virstorageobj.c index a4e40f9090..5112bac92d 100644 --- a/src/conf/virstorageobj.c +++ b/src/conf/virstorageobj.c @@ -557,6 +557,29 @@ virStoragePoolObjDeleteDef(virStoragePoolObjPtr pool) } +int +virStoragePoolObjNumOfStoragePools(virStoragePoolObjListPtr pools, + virConnectPtr conn, + bool wantActive, + virStoragePoolObjListACLFilter aclfilter) +{ + int npools = 0; + size_t i; + + for (i = 0; i < pools->count; i++) { + virStoragePoolObjPtr obj = pools->objs[i]; + virStoragePoolObjLock(obj); + if (!aclfilter || aclfilter(conn, obj->def)) { + if (wantActive == virStoragePoolObjIsActive(obj)) + npools++; + } + virStoragePoolObjUnlock(obj); + } + + return npools; +} + + /* * virStoragePoolObjIsDuplicate: * @doms : virStoragePoolObjListPtr to search diff --git a/src/conf/virstorageobj.h b/src/conf/virstorageobj.h index 72daa5a814..5eeda1e43b 100644 --- a/src/conf/virstorageobj.h +++ b/src/conf/virstorageobj.h @@ -146,6 +146,15 @@ virStoragePoolObjSaveDef(virStorageDriverStatePtr driver, int virStoragePoolObjDeleteDef(virStoragePoolObjPtr pool); +typedef bool (*virStoragePoolObjListACLFilter)(virConnectPtr conn, + virStoragePoolDefPtr def); + +int +virStoragePoolObjNumOfStoragePools(virStoragePoolObjListPtr pools, + virConnectPtr conn, + bool wantActive, + virStoragePoolObjListACLFilter aclfilter); + void virStoragePoolObjFree(virStoragePoolObjPtr pool); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 8122b9ffda..d8a9c1373d 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1005,6 +1005,7 @@ virStoragePoolObjListFree; virStoragePoolObjLoadAllConfigs; virStoragePoolObjLoadAllState; virStoragePoolObjLock; +virStoragePoolObjNumOfStoragePools; virStoragePoolObjNumOfVolumes; virStoragePoolObjRemove; virStoragePoolObjSaveDef; diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c index 1b2b9dee52..0ccca85ce5 100644 --- a/src/storage/storage_driver.c +++ b/src/storage/storage_driver.c @@ -477,21 +477,14 @@ storagePoolLookupByVolume(virStorageVolPtr vol) static int storageConnectNumOfStoragePools(virConnectPtr conn) { - size_t i; int nactive = 0; if (virConnectNumOfStoragePoolsEnsureACL(conn) < 0) return -1; storageDriverLock(); - for (i = 0; i < driver->pools.count; i++) { - virStoragePoolObjPtr obj = driver->pools.objs[i]; - virStoragePoolObjLock(obj); - if (virConnectNumOfStoragePoolsCheckACL(conn, obj->def) && - virStoragePoolObjIsActive(obj)) - nactive++; - virStoragePoolObjUnlock(obj); - } + nactive = virStoragePoolObjNumOfStoragePools(&driver->pools, conn, true, + virConnectNumOfStoragePoolsCheckACL); storageDriverUnlock(); return nactive; @@ -536,21 +529,14 @@ storageConnectListStoragePools(virConnectPtr conn, static int storageConnectNumOfDefinedStoragePools(virConnectPtr conn) { - size_t i; int nactive = 0; if (virConnectNumOfDefinedStoragePoolsEnsureACL(conn) < 0) return -1; storageDriverLock(); - for (i = 0; i < driver->pools.count; i++) { - virStoragePoolObjPtr obj = driver->pools.objs[i]; - virStoragePoolObjLock(obj); - if (virConnectNumOfDefinedStoragePoolsCheckACL(conn, obj->def) && - !virStoragePoolObjIsActive(obj)) - nactive++; - virStoragePoolObjUnlock(obj); - } + nactive = virStoragePoolObjNumOfStoragePools(&driver->pools, conn, false, + virConnectNumOfDefinedStoragePoolsCheckACL); storageDriverUnlock(); return nactive; diff --git a/src/test/test_driver.c b/src/test/test_driver.c index e0a58cc927..523d7efe4b 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -4102,17 +4102,16 @@ testStoragePoolLookupByVolume(virStorageVolPtr vol) return testStoragePoolLookupByName(vol->conn, vol->pool); } + static int testConnectNumOfStoragePools(virConnectPtr conn) { testDriverPtr privconn = conn->privateData; int numActive = 0; - size_t i; testDriverLock(privconn); - for (i = 0; i < privconn->pools.count; i++) - if (virStoragePoolObjIsActive(privconn->pools.objs[i])) - numActive++; + numActive = virStoragePoolObjNumOfStoragePools(&privconn->pools, conn, + true, NULL); testDriverUnlock(privconn); return numActive; @@ -4149,20 +4148,16 @@ testConnectListStoragePools(virConnectPtr conn, return -1; } + static int testConnectNumOfDefinedStoragePools(virConnectPtr conn) { testDriverPtr privconn = conn->privateData; int numInactive = 0; - size_t i; testDriverLock(privconn); - for (i = 0; i < privconn->pools.count; i++) { - virStoragePoolObjLock(privconn->pools.objs[i]); - if (!virStoragePoolObjIsActive(privconn->pools.objs[i])) - numInactive++; - virStoragePoolObjUnlock(privconn->pools.objs[i]); - } + numInactive = virStoragePoolObjNumOfStoragePools(&privconn->pools, conn, + false, NULL); testDriverUnlock(privconn); return numInactive;