[PATCH 12/23] cache: pass a private data pointer through cache_walk

Darrick J. Wong
2025-11-06T22:46:16Z

Allow cache_walk callers to pass a pointer to the callback function.

Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
---
lib/support/cache.h | 4 ++--
lib/support/cache.c | 10 ++++++----
2 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/lib/support/cache.h b/lib/support/cache.h
index 0168fdca027896..b18b6d3325e9ad 100644
--- a/lib/support/cache.h
+++ b/lib/support/cache.h
@@ -56,7 +56,7 @@ struct cache_node;

typedef void *cache_key_t;

-typedef void (*cache_walk_t)(struct cache *c, struct cache_node *cn);
+typedef void (*cache_walk_t)(struct cache *c, struct cache_node *cn, void *d);
typedef struct cache_node * (*cache_node_alloc_t)(struct cache *c, cache_key_t k);
typedef int (*cache_node_flush_t)(struct cache *c, struct cache_node *cn);
typedef void (*cache_node_relse_t)(struct cache *c, struct cache_node *cn);
@@ -130,7 +130,7 @@ static inline bool cache_initialized(const struct cache *cache)
int cache_init(int flags, unsigned int size,
const struct cache_operations *ops, struct cache *cache);
void cache_destroy(struct cache *cache);
-void cache_walk(struct cache *, cache_walk_t);
+void cache_walk(struct cache *cache, cache_walk_t fn, void *data);
void cache_purge(struct cache *);
void cache_flush(struct cache *);

diff --git a/lib/support/cache.c b/lib/support/cache.c
index 2e2e36ccc3ef78..606acd5453cf10 100644
--- a/lib/support/cache.c
+++ b/lib/support/cache.c
@@ -101,7 +101,8 @@ cache_expand(
void
cache_walk(
struct cache *cache,
- cache_walk_t visit)
+ cache_walk_t visit,
+ void *data)
{
struct cache_hash *hash;
struct cache_node *pos;
@@ -111,7 +112,7 @@ cache_walk(
hash = &cache->c_hash[i];
pthread_mutex_lock(&hash->ch_mutex);
list_for_each_entry(pos, &hash->ch_list, cn_hash)
- visit(cache, pos);
+ visit(cache, pos, data);
pthread_mutex_unlock(&hash->ch_mutex);
}
}
@@ -126,7 +127,8 @@ cache_walk(
static void
cache_zero_check(
struct cache *cache,
- struct cache_node *node)
+ struct cache_node *node,
+ void *data)
{
if (node->cn_count > 0) {
fprintf(stderr, "%s: refcount is %u, not zero (node=%p)\n",
@@ -134,7 +136,7 @@ cache_zero_check(
cache_abort();
}
}
-#define cache_destroy_check(c) cache_walk((c), cache_zero_check)
+#define cache_destroy_check(c) cache_walk((c), cache_zero_check, NULL)
#else
#define cache_destroy_check(c) do { } while (0)
#endif