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