xref: /openbmc/linux/fs/netfs/internal.h (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
13d3c9504SDavid Howells /* SPDX-License-Identifier: GPL-2.0-or-later */
23d3c9504SDavid Howells /* Internal definitions for network filesystem support
33d3c9504SDavid Howells  *
43d3c9504SDavid Howells  * Copyright (C) 2021 Red Hat, Inc. All Rights Reserved.
53d3c9504SDavid Howells  * Written by David Howells (dhowells@redhat.com)
63d3c9504SDavid Howells  */
73d3c9504SDavid Howells 
83a4a38e6SDavid Howells #include <linux/netfs.h>
9bc899ee1SDavid Howells #include <linux/fscache.h>
103a4a38e6SDavid Howells #include <trace/events/netfs.h>
113a4a38e6SDavid Howells 
123d3c9504SDavid Howells #ifdef pr_fmt
133d3c9504SDavid Howells #undef pr_fmt
143d3c9504SDavid Howells #endif
153d3c9504SDavid Howells 
163d3c9504SDavid Howells #define pr_fmt(fmt) "netfs: " fmt
173d3c9504SDavid Howells 
183d3c9504SDavid Howells /*
1993345c3bSDavid Howells  * buffered_read.c
2093345c3bSDavid Howells  */
2193345c3bSDavid Howells void netfs_rreq_unlock_folios(struct netfs_io_request *rreq);
2293345c3bSDavid Howells 
2393345c3bSDavid Howells /*
243be01750SDavid Howells  * io.c
253be01750SDavid Howells  */
263be01750SDavid Howells int netfs_begin_read(struct netfs_io_request *rreq, bool sync);
273be01750SDavid Howells 
283be01750SDavid Howells /*
29b900f4b8SDavid Howells  * main.c
30b900f4b8SDavid Howells  */
31b900f4b8SDavid Howells extern unsigned int netfs_debug;
32b900f4b8SDavid Howells 
33b900f4b8SDavid Howells /*
343a4a38e6SDavid Howells  * objects.c
353a4a38e6SDavid Howells  */
36663dfb65SDavid Howells struct netfs_io_request *netfs_alloc_request(struct address_space *mapping,
37663dfb65SDavid Howells 					     struct file *file,
38663dfb65SDavid Howells 					     loff_t start, size_t len,
39663dfb65SDavid Howells 					     enum netfs_io_origin origin);
40de74023bSDavid Howells void netfs_get_request(struct netfs_io_request *rreq, enum netfs_rreq_ref_trace what);
413a4a38e6SDavid Howells void netfs_clear_subrequests(struct netfs_io_request *rreq, bool was_async);
42de74023bSDavid Howells void netfs_put_request(struct netfs_io_request *rreq, bool was_async,
43de74023bSDavid Howells 		       enum netfs_rreq_ref_trace what);
443a4a38e6SDavid Howells struct netfs_io_subrequest *netfs_alloc_subrequest(struct netfs_io_request *rreq);
453a4a38e6SDavid Howells 
netfs_see_request(struct netfs_io_request * rreq,enum netfs_rreq_ref_trace what)46de74023bSDavid Howells static inline void netfs_see_request(struct netfs_io_request *rreq,
47de74023bSDavid Howells 				     enum netfs_rreq_ref_trace what)
48de74023bSDavid Howells {
49de74023bSDavid Howells 	trace_netfs_rreq_ref(rreq->debug_id, refcount_read(&rreq->ref), what);
50de74023bSDavid Howells }
51de74023bSDavid Howells 
523a4a38e6SDavid Howells /*
53289af54cSDavid Howells  * stats.c
54289af54cSDavid Howells  */
55289af54cSDavid Howells #ifdef CONFIG_NETFS_STATS
56289af54cSDavid Howells extern atomic_t netfs_n_rh_readahead;
57289af54cSDavid Howells extern atomic_t netfs_n_rh_readpage;
58289af54cSDavid Howells extern atomic_t netfs_n_rh_rreq;
59289af54cSDavid Howells extern atomic_t netfs_n_rh_sreq;
60289af54cSDavid Howells extern atomic_t netfs_n_rh_download;
61289af54cSDavid Howells extern atomic_t netfs_n_rh_download_done;
62289af54cSDavid Howells extern atomic_t netfs_n_rh_download_failed;
63289af54cSDavid Howells extern atomic_t netfs_n_rh_download_instead;
64289af54cSDavid Howells extern atomic_t netfs_n_rh_read;
65289af54cSDavid Howells extern atomic_t netfs_n_rh_read_done;
66289af54cSDavid Howells extern atomic_t netfs_n_rh_read_failed;
67289af54cSDavid Howells extern atomic_t netfs_n_rh_zero;
68289af54cSDavid Howells extern atomic_t netfs_n_rh_short_read;
69289af54cSDavid Howells extern atomic_t netfs_n_rh_write;
70e1b1240cSDavid Howells extern atomic_t netfs_n_rh_write_begin;
71289af54cSDavid Howells extern atomic_t netfs_n_rh_write_done;
72289af54cSDavid Howells extern atomic_t netfs_n_rh_write_failed;
73e1b1240cSDavid Howells extern atomic_t netfs_n_rh_write_zskip;
74289af54cSDavid Howells 
75289af54cSDavid Howells 
netfs_stat(atomic_t * stat)76289af54cSDavid Howells static inline void netfs_stat(atomic_t *stat)
77289af54cSDavid Howells {
78289af54cSDavid Howells 	atomic_inc(stat);
79289af54cSDavid Howells }
80289af54cSDavid Howells 
netfs_stat_d(atomic_t * stat)81289af54cSDavid Howells static inline void netfs_stat_d(atomic_t *stat)
82289af54cSDavid Howells {
83289af54cSDavid Howells 	atomic_dec(stat);
84289af54cSDavid Howells }
85289af54cSDavid Howells 
86289af54cSDavid Howells #else
873d3c9504SDavid Howells #define netfs_stat(x) do {} while(0)
883d3c9504SDavid Howells #define netfs_stat_d(x) do {} while(0)
89289af54cSDavid Howells #endif
903d3c9504SDavid Howells 
91bc899ee1SDavid Howells /*
92bc899ee1SDavid Howells  * Miscellaneous functions.
93bc899ee1SDavid Howells  */
netfs_is_cache_enabled(struct netfs_inode * ctx)94*874c8ca1SDavid Howells static inline bool netfs_is_cache_enabled(struct netfs_inode *ctx)
95bc899ee1SDavid Howells {
96bc899ee1SDavid Howells #if IS_ENABLED(CONFIG_FSCACHE)
97bc899ee1SDavid Howells 	struct fscache_cookie *cookie = ctx->cache;
98bc899ee1SDavid Howells 
99bc899ee1SDavid Howells 	return fscache_cookie_valid(cookie) && cookie->cache_priv &&
100bc899ee1SDavid Howells 		fscache_cookie_enabled(cookie);
101bc899ee1SDavid Howells #else
102bc899ee1SDavid Howells 	return false;
103bc899ee1SDavid Howells #endif
104bc899ee1SDavid Howells }
105bc899ee1SDavid Howells 
1063d3c9504SDavid Howells /*****************************************************************************/
1073d3c9504SDavid Howells /*
1083d3c9504SDavid Howells  * debug tracing
1093d3c9504SDavid Howells  */
1103d3c9504SDavid Howells #define dbgprintk(FMT, ...) \
1113d3c9504SDavid Howells 	printk("[%-6.6s] "FMT"\n", current->comm, ##__VA_ARGS__)
1123d3c9504SDavid Howells 
1133d3c9504SDavid Howells #define kenter(FMT, ...) dbgprintk("==> %s("FMT")", __func__, ##__VA_ARGS__)
1143d3c9504SDavid Howells #define kleave(FMT, ...) dbgprintk("<== %s()"FMT"", __func__, ##__VA_ARGS__)
1153d3c9504SDavid Howells #define kdebug(FMT, ...) dbgprintk(FMT, ##__VA_ARGS__)
1163d3c9504SDavid Howells 
1173d3c9504SDavid Howells #ifdef __KDEBUG
1183d3c9504SDavid Howells #define _enter(FMT, ...) kenter(FMT, ##__VA_ARGS__)
1193d3c9504SDavid Howells #define _leave(FMT, ...) kleave(FMT, ##__VA_ARGS__)
1203d3c9504SDavid Howells #define _debug(FMT, ...) kdebug(FMT, ##__VA_ARGS__)
1213d3c9504SDavid Howells 
1223d3c9504SDavid Howells #elif defined(CONFIG_NETFS_DEBUG)
1233d3c9504SDavid Howells #define _enter(FMT, ...)			\
1243d3c9504SDavid Howells do {						\
1253d3c9504SDavid Howells 	if (netfs_debug)			\
1263d3c9504SDavid Howells 		kenter(FMT, ##__VA_ARGS__);	\
1273d3c9504SDavid Howells } while (0)
1283d3c9504SDavid Howells 
1293d3c9504SDavid Howells #define _leave(FMT, ...)			\
1303d3c9504SDavid Howells do {						\
1313d3c9504SDavid Howells 	if (netfs_debug)			\
1323d3c9504SDavid Howells 		kleave(FMT, ##__VA_ARGS__);	\
1333d3c9504SDavid Howells } while (0)
1343d3c9504SDavid Howells 
1353d3c9504SDavid Howells #define _debug(FMT, ...)			\
1363d3c9504SDavid Howells do {						\
1373d3c9504SDavid Howells 	if (netfs_debug)			\
1383d3c9504SDavid Howells 		kdebug(FMT, ##__VA_ARGS__);	\
1393d3c9504SDavid Howells } while (0)
1403d3c9504SDavid Howells 
1413d3c9504SDavid Howells #else
1423d3c9504SDavid Howells #define _enter(FMT, ...) no_printk("==> %s("FMT")", __func__, ##__VA_ARGS__)
1433d3c9504SDavid Howells #define _leave(FMT, ...) no_printk("<== %s()"FMT"", __func__, ##__VA_ARGS__)
1443d3c9504SDavid Howells #define _debug(FMT, ...) no_printk(FMT, ##__VA_ARGS__)
1453d3c9504SDavid Howells #endif
146