]> git.ipfire.org Git - thirdparty/linux.git/blob - fs/netfs/internal.h
netfs, fscache: Move fs/fscache/* into fs/netfs/
[thirdparty/linux.git] / fs / netfs / internal.h
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /* Internal definitions for network filesystem support
3 *
4 * Copyright (C) 2021 Red Hat, Inc. All Rights Reserved.
5 * Written by David Howells (dhowells@redhat.com)
6 */
7
8 #include <linux/slab.h>
9 #include <linux/seq_file.h>
10 #include <linux/netfs.h>
11 #include <linux/fscache.h>
12 #include <trace/events/netfs.h>
13 #include "fscache_internal.h"
14
15 #ifdef pr_fmt
16 #undef pr_fmt
17 #endif
18
19 #define pr_fmt(fmt) "netfs: " fmt
20
21 /*
22 * buffered_read.c
23 */
24 void netfs_rreq_unlock_folios(struct netfs_io_request *rreq);
25
26 /*
27 * io.c
28 */
29 int netfs_begin_read(struct netfs_io_request *rreq, bool sync);
30
31 /*
32 * main.c
33 */
34 extern unsigned int netfs_debug;
35
36 /*
37 * objects.c
38 */
39 struct netfs_io_request *netfs_alloc_request(struct address_space *mapping,
40 struct file *file,
41 loff_t start, size_t len,
42 enum netfs_io_origin origin);
43 void netfs_get_request(struct netfs_io_request *rreq, enum netfs_rreq_ref_trace what);
44 void netfs_clear_subrequests(struct netfs_io_request *rreq, bool was_async);
45 void netfs_put_request(struct netfs_io_request *rreq, bool was_async,
46 enum netfs_rreq_ref_trace what);
47 struct netfs_io_subrequest *netfs_alloc_subrequest(struct netfs_io_request *rreq);
48
49 static inline void netfs_see_request(struct netfs_io_request *rreq,
50 enum netfs_rreq_ref_trace what)
51 {
52 trace_netfs_rreq_ref(rreq->debug_id, refcount_read(&rreq->ref), what);
53 }
54
55 /*
56 * stats.c
57 */
58 #ifdef CONFIG_NETFS_STATS
59 extern atomic_t netfs_n_rh_readahead;
60 extern atomic_t netfs_n_rh_readpage;
61 extern atomic_t netfs_n_rh_rreq;
62 extern atomic_t netfs_n_rh_sreq;
63 extern atomic_t netfs_n_rh_download;
64 extern atomic_t netfs_n_rh_download_done;
65 extern atomic_t netfs_n_rh_download_failed;
66 extern atomic_t netfs_n_rh_download_instead;
67 extern atomic_t netfs_n_rh_read;
68 extern atomic_t netfs_n_rh_read_done;
69 extern atomic_t netfs_n_rh_read_failed;
70 extern atomic_t netfs_n_rh_zero;
71 extern atomic_t netfs_n_rh_short_read;
72 extern atomic_t netfs_n_rh_write;
73 extern atomic_t netfs_n_rh_write_begin;
74 extern atomic_t netfs_n_rh_write_done;
75 extern atomic_t netfs_n_rh_write_failed;
76 extern atomic_t netfs_n_rh_write_zskip;
77
78
79 static inline void netfs_stat(atomic_t *stat)
80 {
81 atomic_inc(stat);
82 }
83
84 static inline void netfs_stat_d(atomic_t *stat)
85 {
86 atomic_dec(stat);
87 }
88
89 #else
90 #define netfs_stat(x) do {} while(0)
91 #define netfs_stat_d(x) do {} while(0)
92 #endif
93
94 /*
95 * Miscellaneous functions.
96 */
97 static inline bool netfs_is_cache_enabled(struct netfs_inode *ctx)
98 {
99 #if IS_ENABLED(CONFIG_FSCACHE)
100 struct fscache_cookie *cookie = ctx->cache;
101
102 return fscache_cookie_valid(cookie) && cookie->cache_priv &&
103 fscache_cookie_enabled(cookie);
104 #else
105 return false;
106 #endif
107 }
108
109 /*****************************************************************************/
110 /*
111 * debug tracing
112 */
113 #if 0
114 #define dbgprintk(FMT, ...) \
115 printk("[%-6.6s] "FMT"\n", current->comm, ##__VA_ARGS__)
116
117 #define kenter(FMT, ...) dbgprintk("==> %s("FMT")", __func__, ##__VA_ARGS__)
118 #define kleave(FMT, ...) dbgprintk("<== %s()"FMT"", __func__, ##__VA_ARGS__)
119 #define kdebug(FMT, ...) dbgprintk(FMT, ##__VA_ARGS__)
120
121 #ifdef __KDEBUG
122 #define _enter(FMT, ...) kenter(FMT, ##__VA_ARGS__)
123 #define _leave(FMT, ...) kleave(FMT, ##__VA_ARGS__)
124 #define _debug(FMT, ...) kdebug(FMT, ##__VA_ARGS__)
125
126 #elif defined(CONFIG_NETFS_DEBUG)
127 #define _enter(FMT, ...) \
128 do { \
129 if (netfs_debug) \
130 kenter(FMT, ##__VA_ARGS__); \
131 } while (0)
132
133 #define _leave(FMT, ...) \
134 do { \
135 if (netfs_debug) \
136 kleave(FMT, ##__VA_ARGS__); \
137 } while (0)
138
139 #define _debug(FMT, ...) \
140 do { \
141 if (netfs_debug) \
142 kdebug(FMT, ##__VA_ARGS__); \
143 } while (0)
144
145 #else
146 #define _enter(FMT, ...) no_printk("==> %s("FMT")", __func__, ##__VA_ARGS__)
147 #define _leave(FMT, ...) no_printk("<== %s()"FMT"", __func__, ##__VA_ARGS__)
148 #define _debug(FMT, ...) no_printk(FMT, ##__VA_ARGS__)
149 #endif
150 #endif