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