[PATCH v3 04/59] netfs, fscache: Move /proc/fs/fscache to /proc/fs/netfs and put in a symlink

Jeff Layton jlayton at kernel.org
Wed Dec 13 07:19:35 PST 2023


On Thu, 2023-12-07 at 21:21 +0000, David Howells wrote:
> Rename /proc/fs/fscache to "netfs" and make a symlink from fscache to that.
> 
> Signed-off-by: David Howells <dhowells at redhat.com>
> cc: Jeff Layton <jlayton at kernel.org>
> cc: Christian Brauner <christian at brauner.io>
> cc: linux-fsdevel at vger.kernel.org
> cc: linux-cachefs at redhat.com
> ---
>  fs/netfs/fscache_main.c  |  8 ++------
>  fs/netfs/fscache_proc.c  | 23 ++++++++---------------
>  fs/netfs/fscache_stats.c |  4 +---
>  fs/netfs/internal.h      | 12 +++++++++++-
>  fs/netfs/main.c          | 34 ++++++++++++++++++++++++++++++++++
>  fs/netfs/stats.c         | 13 +++++++------
>  include/linux/netfs.h    |  1 -
>  7 files changed, 63 insertions(+), 32 deletions(-)
> 
> diff --git a/fs/netfs/fscache_main.c b/fs/netfs/fscache_main.c
> index 00600a4d9ce5..42e98bb523e3 100644
> --- a/fs/netfs/fscache_main.c
> +++ b/fs/netfs/fscache_main.c
> @@ -62,7 +62,7 @@ unsigned int fscache_hash(unsigned int salt, const void *data, size_t len)
>  /*
>   * initialise the fs caching module
>   */
> -static int __init fscache_init(void)
> +int __init fscache_init(void)
>  {
>  int ret = -ENOMEM;
>  
> @@ -94,12 +94,10 @@ static int __init fscache_init(void)
>  return ret;
>  }
>  
> -fs_initcall(fscache_init);
> -
>  /*
>   * clean up on module removal
>   */
> -static void __exit fscache_exit(void)
> +void __exit fscache_exit(void)
>  {
>  _enter("");
>  
> @@ -108,5 +106,3 @@ static void __exit fscache_exit(void)
>  destroy_workqueue(fscache_wq);
>  pr_notice("FS-Cache unloaded\n");
>  }
> -
> -module_exit(fscache_exit);
> diff --git a/fs/netfs/fscache_proc.c b/fs/netfs/fscache_proc.c
> index dc3b0e9c8cce..ecd0d1edafaa 100644
> --- a/fs/netfs/fscache_proc.c
> +++ b/fs/netfs/fscache_proc.c
> @@ -12,41 +12,34 @@
>  #include "internal.h"
>  
>  /*
> - * initialise the /proc/fs/fscache/ directory
> + * Add files to /proc/fs/netfs/.
>   */
>  int __init fscache_proc_init(void)
>  {
> - if (!proc_mkdir("fs/fscache", NULL))
> - goto error_dir;
> + if (!proc_symlink("fs/fscache", NULL, "../netfs"))
> + goto error_sym;
>  

   1. Are there known userland tools that rely on this path? I suppose
      this is harmless either way though, and /proc is supposedly part
      of the ABI.

> - if (!proc_create_seq("fs/fscache/caches", S_IFREG | 0444, NULL,
> + if (!proc_create_seq("fs/netfs/caches", S_IFREG | 0444, NULL,
>  &fscache_caches_seq_ops))
>  goto error;
>  
> - if (!proc_create_seq("fs/fscache/volumes", S_IFREG | 0444, NULL,
> + if (!proc_create_seq("fs/netfs/volumes", S_IFREG | 0444, NULL,
>  &fscache_volumes_seq_ops))
>  goto error;
>  
> - if (!proc_create_seq("fs/fscache/cookies", S_IFREG | 0444, NULL,
> + if (!proc_create_seq("fs/netfs/cookies", S_IFREG | 0444, NULL,
>  &fscache_cookies_seq_ops))
>  goto error;
> -
> -#ifdef CONFIG_FSCACHE_STATS
> - if (!proc_create_single("fs/fscache/stats", S_IFREG | 0444, NULL,
> - fscache_stats_show))
> - goto error;
> -#endif
> -
>  return 0;
>  
>  error:
>  remove_proc_entry("fs/fscache", NULL);
> -error_dir:
> +error_sym:
>  return -ENOMEM;
>  }
>  
>  /*
> - * clean up the /proc/fs/fscache/ directory
> + * Clean up the /proc/fs/fscache symlink.
>   */
>  void fscache_proc_cleanup(void)
>  {
> diff --git a/fs/netfs/fscache_stats.c b/fs/netfs/fscache_stats.c
> index fc94e5e79f1c..aad812ead398 100644
> --- a/fs/netfs/fscache_stats.c
> +++ b/fs/netfs/fscache_stats.c
> @@ -52,7 +52,7 @@ EXPORT_SYMBOL(fscache_n_culled);
>  /*
>   * display the general statistics
>   */
> -int fscache_stats_show(struct seq_file *m, void *v)
> +int fscache_stats_show(struct seq_file *m)
>  {
>  seq_puts(m, "FS-Cache statistics\n");
>  seq_printf(m, "Cookies: n=%d v=%d vcol=%u voom=%u\n",
> @@ -96,7 +96,5 @@ int fscache_stats_show(struct seq_file *m, void *v)
>  seq_printf(m, "IO : rd=%u wr=%u\n",
>  atomic_read(&fscache_n_read),
>  atomic_read(&fscache_n_write));
> -
> - netfs_stats_show(m);
>  return 0;
>  }
> diff --git a/fs/netfs/internal.h b/fs/netfs/internal.h
> index dc764b98c7f0..3e6e6a2c0375 100644
> --- a/fs/netfs/internal.h
> +++ b/fs/netfs/internal.h
> @@ -76,6 +76,7 @@ extern atomic_t netfs_n_rh_write_done;
>  extern atomic_t netfs_n_rh_write_failed;
>  extern atomic_t netfs_n_rh_write_zskip;
>  
> +int netfs_stats_show(struct seq_file *m, void *v);
>  
>  static inline void netfs_stat(atomic_t *stat)
>  {
> @@ -168,6 +169,13 @@ static inline void fscache_see_cookie(struct fscache_cookie *cookie,
>  extern unsigned fscache_debug;
>  
>  extern unsigned int fscache_hash(unsigned int salt, const void *data, size_t len);
> +#ifdef CONFIG_PROC_FS
> +int __init fscache_init(void);
> +void __exit fscache_exit(void);
> +#else
> +static inline int fscache_init(void) { return 0; }
> +static inline void fscache_exit(void) {}
> +#endif
>  
>  /*
>   * fscache-proc.c
> @@ -218,12 +226,14 @@ static inline void fscache_stat_d(atomic_t *stat)
>  
>  #define __fscache_stat(stat) (stat)
>  
> -int fscache_stats_show(struct seq_file *m, void *v);
> +int fscache_stats_show(struct seq_file *m);
>  #else
>  
>  #define __fscache_stat(stat) (NULL)
>  #define fscache_stat(stat) do {} while (0)
>  #define fscache_stat_d(stat) do {} while (0)
> +
> +static inline int fscache_stats_show(struct seq_file *m) { return 0; }
>  #endif
>  
>  /*
> diff --git a/fs/netfs/main.c b/fs/netfs/main.c
> index 068568702957..c9af6e0896d3 100644
> --- a/fs/netfs/main.c
> +++ b/fs/netfs/main.c
> @@ -7,6 +7,8 @@
>  
>  #include <linux/module.h>
>  #include <linux/export.h>
> +#include <linux/proc_fs.h>
> +#include <linux/seq_file.h>
>  #include "internal.h"
>  #define CREATE_TRACE_POINTS
>  #include <trace/events/netfs.h>
> @@ -18,3 +20,35 @@ MODULE_LICENSE("GPL");
>  unsigned netfs_debug;
>  module_param_named(debug, netfs_debug, uint, S_IWUSR | S_IRUGO);
>  MODULE_PARM_DESC(netfs_debug, "Netfs support debugging mask");
> +
> +static int __init netfs_init(void)
> +{
> + int ret = -ENOMEM;
> +
> + if (!proc_mkdir("fs/netfs", NULL))
> + goto error;
> +
> +#ifdef CONFIG_FSCACHE_STATS
> + if (!proc_create_single("fs/netfs/stats", S_IFREG | 0444, NULL,
> + netfs_stats_show))
> + goto error_proc;
> +#endif
> +
> + ret = fscache_init();
> + if (ret < 0)
> + goto error_proc;
> + return 0;
> +
> +error_proc:
> + remove_proc_entry("fs/netfs", NULL);
> +error:
> + return ret;
> +}
> +fs_initcall(netfs_init);
> +
> +static void __exit netfs_exit(void)
> +{
> + fscache_exit();
> + remove_proc_entry("fs/netfs", NULL);
> +}
> +module_exit(netfs_exit);
> diff --git a/fs/netfs/stats.c b/fs/netfs/stats.c
> index 5510a7a14a40..6025dc485f7e 100644
> --- a/fs/netfs/stats.c
> +++ b/fs/netfs/stats.c
> @@ -28,31 +28,32 @@ atomic_t netfs_n_rh_write_done;
>  atomic_t netfs_n_rh_write_failed;
>  atomic_t netfs_n_rh_write_zskip;
>  
> -void netfs_stats_show(struct seq_file *m)
> +int netfs_stats_show(struct seq_file *m, void *v)
>  {
> - seq_printf(m, "RdHelp : RA=%u RP=%u WB=%u WBZ=%u rr=%u sr=%u\n",
> + seq_printf(m, "Netfs : RA=%u RP=%u WB=%u WBZ=%u rr=%u sr=%u\n",
>  atomic_read(&netfs_n_rh_readahead),
>  atomic_read(&netfs_n_rh_readpage),
>  atomic_read(&netfs_n_rh_write_begin),
>  atomic_read(&netfs_n_rh_write_zskip),
>  atomic_read(&netfs_n_rh_rreq),
>  atomic_read(&netfs_n_rh_sreq));
> - seq_printf(m, "RdHelp : ZR=%u sh=%u sk=%u\n",
> + seq_printf(m, "Netfs : ZR=%u sh=%u sk=%u\n",
>  atomic_read(&netfs_n_rh_zero),
>  atomic_read(&netfs_n_rh_short_read),
>  atomic_read(&netfs_n_rh_write_zskip));
> - seq_printf(m, "RdHelp : DL=%u ds=%u df=%u di=%u\n",
> + seq_printf(m, "Netfs : DL=%u ds=%u df=%u di=%u\n",
>  atomic_read(&netfs_n_rh_download),
>  atomic_read(&netfs_n_rh_download_done),
>  atomic_read(&netfs_n_rh_download_failed),
>  atomic_read(&netfs_n_rh_download_instead));
> - seq_printf(m, "RdHelp : RD=%u rs=%u rf=%u\n",
> + seq_printf(m, "Netfs : RD=%u rs=%u rf=%u\n",
>  atomic_read(&netfs_n_rh_read),
>  atomic_read(&netfs_n_rh_read_done),
>  atomic_read(&netfs_n_rh_read_failed));
> - seq_printf(m, "RdHelp : WR=%u ws=%u wf=%u\n",
> + seq_printf(m, "Netfs : WR=%u ws=%u wf=%u\n",
>  atomic_read(&netfs_n_rh_write),
>  atomic_read(&netfs_n_rh_write_done),
>  atomic_read(&netfs_n_rh_write_failed));
> + return fscache_stats_show(m);
>  }
>  EXPORT_SYMBOL(netfs_stats_show);
> diff --git a/include/linux/netfs.h b/include/linux/netfs.h
> index d294ff8f9ae4..9bd91cd615d5 100644
> --- a/include/linux/netfs.h
> +++ b/include/linux/netfs.h
> @@ -294,7 +294,6 @@ void netfs_get_subrequest(struct netfs_io_subrequest *subreq,
>  enum netfs_sreq_ref_trace what);
>  void netfs_put_subrequest(struct netfs_io_subrequest *subreq,
>  bool was_async, enum netfs_sreq_ref_trace what);
> -void netfs_stats_show(struct seq_file *);
>  ssize_t netfs_extract_user_iter(struct iov_iter *orig, size_t orig_len,
>  struct iov_iter *new,
>  iov_iter_extraction_t extraction_flags);
> 

-- 
Jeff Layton <jlayton at kernel.org>



More information about the linux-afs mailing list