1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /* Internal definitions for network filesystem support
4 * Copyright (C) 2021 Red Hat, Inc. All Rights Reserved.
5 * Written by David Howells (dhowells@redhat.com)
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"
19 #define pr_fmt(fmt) "netfs: " fmt
24 void netfs_rreq_unlock_folios(struct netfs_io_request
*rreq
);
29 int netfs_begin_read(struct netfs_io_request
*rreq
, bool sync
);
34 extern unsigned int netfs_debug
;
39 struct netfs_io_request
*netfs_alloc_request(struct address_space
*mapping
,
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
);
49 static inline void netfs_see_request(struct netfs_io_request
*rreq
,
50 enum netfs_rreq_ref_trace what
)
52 trace_netfs_rreq_ref(rreq
->debug_id
, refcount_read(&rreq
->ref
), what
);
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
;
79 static inline void netfs_stat(atomic_t
*stat
)
84 static inline void netfs_stat_d(atomic_t
*stat
)
90 #define netfs_stat(x) do {} while(0)
91 #define netfs_stat_d(x) do {} while(0)
95 * Miscellaneous functions.
97 static inline bool netfs_is_cache_enabled(struct netfs_inode
*ctx
)
99 #if IS_ENABLED(CONFIG_FSCACHE)
100 struct fscache_cookie
*cookie
= ctx
->cache
;
102 return fscache_cookie_valid(cookie
) && cookie
->cache_priv
&&
103 fscache_cookie_enabled(cookie
);
109 /*****************************************************************************/
114 #define dbgprintk(FMT, ...) \
115 printk("[%-6.6s] "FMT"\n", current->comm, ##__VA_ARGS__)
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__)
122 #define _enter(FMT, ...) kenter(FMT, ##__VA_ARGS__)
123 #define _leave(FMT, ...) kleave(FMT, ##__VA_ARGS__)
124 #define _debug(FMT, ...) kdebug(FMT, ##__VA_ARGS__)
126 #elif defined(CONFIG_NETFS_DEBUG)
127 #define _enter(FMT, ...) \
130 kenter(FMT, ##__VA_ARGS__); \
133 #define _leave(FMT, ...) \
136 kleave(FMT, ##__VA_ARGS__); \
139 #define _debug(FMT, ...) \
142 kdebug(FMT, ##__VA_ARGS__); \
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__)