Message ID | 20231207212206.1379128-5-dhowells@redhat.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | netfs, afs, 9p, cifs: Delegate high-level I/O to netfslib | expand |
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@redhat.com> > cc: Jeff Layton <jlayton@kernel.org> > cc: Christian Brauner <christian@brauner.io> > cc: linux-fsdevel@vger.kernel.org > cc: linux-cachefs@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@kernel.org> wrote: > > 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. I know various people have sent copies of the file in case of crashes, so it feels like it should still be accessible by the old path. David
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; - 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);
Rename /proc/fs/fscache to "netfs" and make a symlink from fscache to that. Signed-off-by: David Howells <dhowells@redhat.com> cc: Jeff Layton <jlayton@kernel.org> cc: Christian Brauner <christian@brauner.io> cc: linux-fsdevel@vger.kernel.org cc: linux-cachefs@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(-)