Allow the cache to add information in /proc/fs/fscache/objects instead of
displaying cookie key and aux data - which can be seen in the cookies file.

Signed-off-by: David Howells <dhowe...@redhat.com>
---

 fs/cachefiles/content-map.c   |   41 +++++++++++++++++++++++++++++++++++++++++
 fs/cachefiles/interface.c     |    1 +
 fs/cachefiles/internal.h      |    1 +
 fs/fscache/object-list.c      |   33 +++------------------------------
 include/linux/fscache-cache.h |    4 ++++
 5 files changed, 50 insertions(+), 30 deletions(-)

diff --git a/fs/cachefiles/content-map.c b/fs/cachefiles/content-map.c
index dea28948f006..02236b24f914 100644
--- a/fs/cachefiles/content-map.c
+++ b/fs/cachefiles/content-map.c
@@ -408,3 +408,44 @@ void cachefiles_save_content_map(struct cachefiles_object 
*object)
 
        _leave(" = %zd", ret);
 }
+
+/*
+ * Display object information in proc.
+ */
+int cachefiles_display_object(struct seq_file *m, struct fscache_object 
*_object)
+{
+       struct cachefiles_object *object =
+               container_of(_object, struct cachefiles_object, fscache);
+
+       if (object->fscache.cookie->type == FSCACHE_COOKIE_TYPE_INDEX) {
+               if (object->content_info != CACHEFILES_CONTENT_NO_DATA)
+                       seq_printf(m, " ???%u???", object->content_info);
+       } else {
+               switch (object->content_info) {
+               case CACHEFILES_CONTENT_NO_DATA:
+                       seq_puts(m, " <n>");
+                       break;
+               case CACHEFILES_CONTENT_SINGLE:
+                       seq_puts(m, " <s>");
+                       break;
+               case CACHEFILES_CONTENT_ALL:
+                       seq_puts(m, " <a>");
+                       break;
+               case CACHEFILES_CONTENT_MAP:
+                       read_lock_bh(&object->content_map_lock);
+                       if (object->content_map) {
+                               seq_printf(m, " %*phN",
+                                          object->content_map_size,
+                                          object->content_map);
+                       }
+                       read_unlock_bh(&object->content_map_lock);
+                       break;
+               default:
+                       seq_printf(m, " <%u>", object->content_info);
+                       break;
+               }
+       }
+
+       seq_putc(m, '\n');
+       return 0;
+}
diff --git a/fs/cachefiles/interface.c b/fs/cachefiles/interface.c
index feff39dff0f5..4fcbd788d3b2 100644
--- a/fs/cachefiles/interface.c
+++ b/fs/cachefiles/interface.c
@@ -495,4 +495,5 @@ const struct fscache_cache_ops cachefiles_cache_ops = {
        .shape_extent           = cachefiles_shape_extent,
        .read                   = cachefiles_read,
        .write                  = cachefiles_write,
+       .display_object         = cachefiles_display_object,
 };
diff --git a/fs/cachefiles/internal.h b/fs/cachefiles/internal.h
index 43f8e71136dd..32cb55319a7d 100644
--- a/fs/cachefiles/internal.h
+++ b/fs/cachefiles/internal.h
@@ -133,6 +133,7 @@ extern void cachefiles_expand_content_map(struct 
cachefiles_object *object, loff
 extern void cachefiles_shorten_content_map(struct cachefiles_object *object, 
loff_t new_size);
 extern bool cachefiles_load_content_map(struct cachefiles_object *object);
 extern void cachefiles_save_content_map(struct cachefiles_object *object);
+extern int cachefiles_display_object(struct seq_file *m, struct fscache_object 
*object);
 
 /*
  * daemon.c
diff --git a/fs/fscache/object-list.c b/fs/fscache/object-list.c
index 5777f909d31a..361610e124bd 100644
--- a/fs/fscache/object-list.c
+++ b/fs/fscache/object-list.c
@@ -155,7 +155,6 @@ static int fscache_objlist_show(struct seq_file *m, void *v)
        struct fscache_cookie *cookie;
        unsigned long config = data->config;
        char _type[3], *type;
-       u8 *p;
 
        if ((unsigned long) v == 1) {
                seq_puts(m, "OBJECT   PARENT   USE CHLDN OPS FL  S"
@@ -201,8 +200,6 @@ static int fscache_objlist_show(struct seq_file *m, void *v)
                   obj->stage);
 
        if (obj->cookie) {
-               uint16_t keylen = 0, auxlen = 0;
-
                switch (cookie->type) {
                case 0:
                        type = "IX";
@@ -211,8 +208,7 @@ static int fscache_objlist_show(struct seq_file *m, void *v)
                        type = "DT";
                        break;
                default:
-                       snprintf(_type, sizeof(_type), "%02u",
-                                cookie->type);
+                       snprintf(_type, sizeof(_type), "%02x", cookie->type);
                        type = _type;
                        break;
                }
@@ -223,34 +219,11 @@ static int fscache_objlist_show(struct seq_file *m, void 
*v)
                           type,
                           cookie->stage,
                           cookie->flags);
-
-               if (config & FSCACHE_OBJLIST_CONFIG_KEY)
-                       keylen = cookie->key_len;
-
-               if (config & FSCACHE_OBJLIST_CONFIG_AUX)
-                       auxlen = cookie->aux_len;
-
-               if (keylen > 0 || auxlen > 0) {
-                       seq_puts(m, " ");
-                       p = keylen <= sizeof(cookie->inline_key) ?
-                               cookie->inline_key : cookie->key;
-                       for (; keylen > 0; keylen--)
-                               seq_printf(m, "%02x", *p++);
-                       if (auxlen > 0) {
-                               if (config & FSCACHE_OBJLIST_CONFIG_KEY)
-                                       seq_puts(m, ", ");
-                               p = auxlen <= sizeof(cookie->inline_aux) ?
-                                       cookie->inline_aux : cookie->aux;
-                               for (; auxlen > 0; auxlen--)
-                                       seq_printf(m, "%02x", *p++);
-                       }
-               }
-
-               seq_puts(m, "\n");
        } else {
                seq_puts(m, "<no_netfs>\n");
        }
-       return 0;
+
+       return obj->cache->ops->display_object(m, obj);
 }
 
 static const struct seq_operations fscache_objlist_ops = {
diff --git a/include/linux/fscache-cache.h b/include/linux/fscache-cache.h
index 1d235072239d..f82c998917e0 100644
--- a/include/linux/fscache-cache.h
+++ b/include/linux/fscache-cache.h
@@ -19,6 +19,7 @@
 
 #define NR_MAXCACHES BITS_PER_LONG
 
+struct seq_file;
 struct fscache_cache;
 struct fscache_cache_ops;
 struct fscache_object;
@@ -152,6 +153,9 @@ struct fscache_cache_ops {
        int (*write)(struct fscache_object *object,
                     struct fscache_io_request *req,
                     struct iov_iter *iter);
+
+       /* Display object info in /proc/fs/fscache/objects */
+       int (*display_object)(struct seq_file *m, struct fscache_object 
*object);
 };
 
 extern struct fscache_cookie fscache_fsdef_index;


Reply via email to