Have the fscache "objects" procfile also display the usage count for
the object to help track down refcounting issues.

Add a new object_usage operation that returns the value, add a new
field to the objects procfile and have fscache query it for the
object.

Signed-off-by: Jeff Layton <jlay...@kernel.org>
---
 fs/cachefiles/interface.c     | 12 ++++++++++++
 fs/fscache/object-list.c      |  9 +++++----
 include/linux/fscache-cache.h |  3 +++
 3 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/fs/cachefiles/interface.c b/fs/cachefiles/interface.c
index f6ccf25604b1..732639c764f8 100644
--- a/fs/cachefiles/interface.c
+++ b/fs/cachefiles/interface.c
@@ -366,6 +366,17 @@ static void cachefiles_put_object(struct fscache_object 
*_object,
        _leave("");
 }
 
+static int cachefiles_object_usage(struct fscache_object *_object)
+{
+       struct cachefiles_object *object;
+
+       ASSERT(_object);
+
+       object = container_of(_object, struct cachefiles_object, fscache);
+       return atomic_read(&object->usage);
+}
+
+
 /*
  * sync a cache
  */
@@ -554,6 +565,7 @@ const struct fscache_cache_ops cachefiles_cache_ops = {
        .invalidate_object      = cachefiles_invalidate_object,
        .drop_object            = cachefiles_drop_object,
        .put_object             = cachefiles_put_object,
+       .object_usage           = cachefiles_object_usage,
        .sync_cache             = cachefiles_sync_cache,
        .attr_changed           = cachefiles_attr_changed,
        .read_or_alloc_page     = cachefiles_read_or_alloc_page,
diff --git a/fs/fscache/object-list.c b/fs/fscache/object-list.c
index a64a67778714..c3549358570e 100644
--- a/fs/fscache/object-list.c
+++ b/fs/fscache/object-list.c
@@ -168,7 +168,7 @@ static int fscache_objlist_show(struct seq_file *m, void *v)
 
        if ((unsigned long) v == 1) {
                seq_puts(m, "OBJECT   PARENT   STAT CHLDN OPS OOP IPR EX READS"
-                        " EM EV FL S"
+                        " EM EV FL S U"
                         " | COOKIE   NETFS_COOKIE_DEF TY FL NETFS_DATA");
                if (config & (FSCACHE_OBJLIST_CONFIG_KEY |
                              FSCACHE_OBJLIST_CONFIG_AUX))
@@ -187,7 +187,7 @@ static int fscache_objlist_show(struct seq_file *m, void *v)
 
        if ((unsigned long) v == 2) {
                seq_puts(m, "======== ======== ==== ===== === === === == ====="
-                        " == == == ="
+                        " == == == = ="
                         " | ======== ================ == === 
================");
                if (config & (FSCACHE_OBJLIST_CONFIG_KEY |
                              FSCACHE_OBJLIST_CONFIG_AUX))
@@ -230,7 +230,7 @@ static int fscache_objlist_show(struct seq_file *m, void *v)
        }
 
        seq_printf(m,
-                  "%08x %08x %s %5u %3u %3u %3u %2u %5u %2lx %2lx %2lx %1x | ",
+                  "%08x %08x %s %5u %3u %3u %3u %2u %5u %2lx %2lx %2lx %1x %1x 
| ",
                   obj->debug_id,
                   obj->parent ? obj->parent->debug_id : UINT_MAX,
                   obj->state->short_name,
@@ -243,7 +243,8 @@ static int fscache_objlist_show(struct seq_file *m, void *v)
                   obj->event_mask,
                   obj->events,
                   obj->flags,
-                  work_busy(&obj->work));
+                  work_busy(&obj->work),
+                  obj->cache->ops->object_usage(obj));
 
        if (obj->cookie) {
                uint16_t keylen = 0, auxlen = 0;
diff --git a/include/linux/fscache-cache.h b/include/linux/fscache-cache.h
index 143b1594ac94..732b5a7e65c1 100644
--- a/include/linux/fscache-cache.h
+++ b/include/linux/fscache-cache.h
@@ -274,6 +274,9 @@ struct fscache_cache_ops {
        void (*put_object)(struct fscache_object *object,
                           enum fscache_obj_ref_trace why);
 
+       /* return current usage count of an object */
+       int (*object_usage)(struct fscache_object *object);
+
        /* sync a cache */
        void (*sync_cache)(struct fscache_cache *cache);
 
-- 
2.23.0

--
Linux-cachefs mailing list
Linux-cachefs@redhat.com
https://www.redhat.com/mailman/listinfo/linux-cachefs

Reply via email to