diff --git a/src/conf/virstorageobj.c b/src/conf/virstorageobj.c index 34f2eb778c..5d92ab7063 100644 --- a/src/conf/virstorageobj.c +++ b/src/conf/virstorageobj.c @@ -195,6 +195,26 @@ virStorageVolDefFindByName(virStoragePoolObjPtr pool, } +int +virStoragePoolObjNumOfVolumes(virStorageVolDefListPtr volumes, + virConnectPtr conn, + virStoragePoolDefPtr pooldef, + virStoragePoolVolumeACLFilter aclfilter) +{ + int nvolumes = 0; + size_t i; + + for (i = 0; i < volumes->count; i++) { + virStorageVolDefPtr def = volumes->objs[i]; + if (aclfilter && !aclfilter(conn, pooldef, def)) + continue; + nvolumes++; + } + + return nvolumes; +} + + virStoragePoolObjPtr virStoragePoolObjAssignDef(virStoragePoolObjListPtr pools, virStoragePoolDefPtr def) diff --git a/src/conf/virstorageobj.h b/src/conf/virstorageobj.h index ecba94e43f..3effe7a784 100644 --- a/src/conf/virstorageobj.h +++ b/src/conf/virstorageobj.h @@ -108,6 +108,17 @@ virStorageVolDefFindByName(virStoragePoolObjPtr pool, void virStoragePoolObjClearVols(virStoragePoolObjPtr pool); +typedef bool +(*virStoragePoolVolumeACLFilter)(virConnectPtr conn, + virStoragePoolDefPtr pool, + virStorageVolDefPtr def); + +int +virStoragePoolObjNumOfVolumes(virStorageVolDefListPtr volumes, + virConnectPtr conn, + virStoragePoolDefPtr pooldef, + virStoragePoolVolumeACLFilter aclfilter); + virStoragePoolObjPtr virStoragePoolObjAssignDef(virStoragePoolObjListPtr pools, virStoragePoolDefPtr def); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 62bc36ac58..bcaa0f7a84 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1005,6 +1005,7 @@ virStoragePoolObjListFree; virStoragePoolObjLoadAllConfigs; virStoragePoolObjLoadAllState; virStoragePoolObjLock; +virStoragePoolObjNumOfVolumes; virStoragePoolObjRemove; virStoragePoolObjSaveDef; virStoragePoolObjSourceFindDuplicate; diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c index fea7698872..7d2f74d4ca 100644 --- a/src/storage/storage_driver.c +++ b/src/storage/storage_driver.c @@ -1390,7 +1390,6 @@ storagePoolNumOfVolumes(virStoragePoolPtr obj) { virStoragePoolObjPtr pool; int ret = -1; - size_t i; if (!(pool = virStoragePoolObjFromStoragePool(obj))) return -1; @@ -1403,12 +1402,9 @@ storagePoolNumOfVolumes(virStoragePoolPtr obj) _("storage pool '%s' is not active"), pool->def->name); goto cleanup; } - ret = 0; - for (i = 0; i < pool->volumes.count; i++) { - if (virStoragePoolNumOfVolumesCheckACL(obj->conn, pool->def, - pool->volumes.objs[i])) - ret++; - } + + ret = virStoragePoolObjNumOfVolumes(&pool->volumes, obj->conn, pool->def, + virStoragePoolNumOfVolumesCheckACL); cleanup: virStoragePoolObjUnlock(pool); diff --git a/src/test/test_driver.c b/src/test/test_driver.c index f9d9512032..dac87e30ad 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -4808,7 +4808,8 @@ testStoragePoolNumOfVolumes(virStoragePoolPtr pool) goto cleanup; } - ret = privpool->volumes.count; + ret = virStoragePoolObjNumOfVolumes(&privpool->volumes, pool->conn, + privpool->def, NULL); cleanup: if (privpool)