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

From: Jeff Layton
Date: Wed Dec 13 2023 - 10:19:44 EST


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@xxxxxxxxxx>
> cc: Jeff Layton <jlayton@xxxxxxxxxx>
> cc: Christian Brauner <christian@xxxxxxxxxx>
> cc: linux-fsdevel@xxxxxxxxxxxxxxx
> cc: linux-cachefs@xxxxxxxxxx
> ---
> 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@xxxxxxxxxx>