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>