1
2
3
4
5
6
7
8
9
10
11
12
13
14#ifndef _LINUX_NETFS_H
15#define _LINUX_NETFS_H
16
17#include <linux/workqueue.h>
18#include <linux/fs.h>
19#include <linux/pagemap.h>
20
21
22
23
24
25#define PageFsCache(page) PagePrivate2((page))
26#define SetPageFsCache(page) SetPagePrivate2((page))
27#define ClearPageFsCache(page) ClearPagePrivate2((page))
28#define TestSetPageFsCache(page) TestSetPagePrivate2((page))
29#define TestClearPageFsCache(page) TestClearPagePrivate2((page))
30
31
32
33
34
35
36
37
38
39
40static inline void set_page_fscache(struct page *page)
41{
42 set_page_private_2(page);
43}
44
45
46
47
48
49
50
51
52
53
54
55
56static inline void end_page_fscache(struct page *page)
57{
58 end_page_private_2(page);
59}
60
61
62
63
64
65
66
67static inline void wait_on_page_fscache(struct page *page)
68{
69 wait_on_page_private_2(page);
70}
71
72
73
74
75
76
77
78
79
80
81
82
83static inline int wait_on_page_fscache_killable(struct page *page)
84{
85 return wait_on_page_private_2_killable(page);
86}
87
88enum netfs_read_source {
89 NETFS_FILL_WITH_ZEROES,
90 NETFS_DOWNLOAD_FROM_SERVER,
91 NETFS_READ_FROM_CACHE,
92 NETFS_INVALID_READ,
93} __mode(byte);
94
95typedef void (*netfs_io_terminated_t)(void *priv, ssize_t transferred_or_error,
96 bool was_async);
97
98
99
100
101struct netfs_cache_resources {
102 const struct netfs_cache_ops *ops;
103 void *cache_priv;
104 void *cache_priv2;
105 unsigned int debug_id;
106};
107
108
109
110
111struct netfs_read_subrequest {
112 struct netfs_read_request *rreq;
113 struct list_head rreq_link;
114 loff_t start;
115 size_t len;
116 size_t transferred;
117 refcount_t usage;
118 short error;
119 unsigned short debug_index;
120 enum netfs_read_source source;
121 unsigned long flags;
122#define NETFS_SREQ_WRITE_TO_CACHE 0
123#define NETFS_SREQ_CLEAR_TAIL 1
124#define NETFS_SREQ_SHORT_READ 2
125#define NETFS_SREQ_SEEK_DATA_READ 3
126#define NETFS_SREQ_NO_PROGRESS 4
127};
128
129
130
131
132
133struct netfs_read_request {
134 struct work_struct work;
135 struct inode *inode;
136 struct address_space *mapping;
137 struct netfs_cache_resources cache_resources;
138 struct list_head subrequests;
139 void *netfs_priv;
140 unsigned int debug_id;
141 atomic_t nr_rd_ops;
142 atomic_t nr_wr_ops;
143 size_t submitted;
144 size_t len;
145 short error;
146 loff_t i_size;
147 loff_t start;
148 pgoff_t no_unlock_page;
149 refcount_t usage;
150 unsigned long flags;
151#define NETFS_RREQ_INCOMPLETE_IO 0
152#define NETFS_RREQ_WRITE_TO_CACHE 1
153#define NETFS_RREQ_NO_UNLOCK_PAGE 2
154#define NETFS_RREQ_DONT_UNLOCK_PAGES 3
155#define NETFS_RREQ_FAILED 4
156#define NETFS_RREQ_IN_PROGRESS 5
157 const struct netfs_read_request_ops *netfs_ops;
158};
159
160
161
162
163struct netfs_read_request_ops {
164 bool (*is_cache_enabled)(struct inode *inode);
165 void (*init_rreq)(struct netfs_read_request *rreq, struct file *file);
166 int (*begin_cache_operation)(struct netfs_read_request *rreq);
167 void (*expand_readahead)(struct netfs_read_request *rreq);
168 bool (*clamp_length)(struct netfs_read_subrequest *subreq);
169 void (*issue_op)(struct netfs_read_subrequest *subreq);
170 bool (*is_still_valid)(struct netfs_read_request *rreq);
171 int (*check_write_begin)(struct file *file, loff_t pos, unsigned len,
172 struct page *page, void **_fsdata);
173 void (*done)(struct netfs_read_request *rreq);
174 void (*cleanup)(struct address_space *mapping, void *netfs_priv);
175};
176
177
178
179
180
181struct netfs_cache_ops {
182
183 void (*end_operation)(struct netfs_cache_resources *cres);
184
185
186 int (*read)(struct netfs_cache_resources *cres,
187 loff_t start_pos,
188 struct iov_iter *iter,
189 bool seek_data,
190 netfs_io_terminated_t term_func,
191 void *term_func_priv);
192
193
194 int (*write)(struct netfs_cache_resources *cres,
195 loff_t start_pos,
196 struct iov_iter *iter,
197 netfs_io_terminated_t term_func,
198 void *term_func_priv);
199
200
201 void (*expand_readahead)(struct netfs_cache_resources *cres,
202 loff_t *_start, size_t *_len, loff_t i_size);
203
204
205
206
207 enum netfs_read_source (*prepare_read)(struct netfs_read_subrequest *subreq,
208 loff_t i_size);
209
210
211
212
213 int (*prepare_write)(struct netfs_cache_resources *cres,
214 loff_t *_start, size_t *_len, loff_t i_size);
215};
216
217struct readahead_control;
218extern void netfs_readahead(struct readahead_control *,
219 const struct netfs_read_request_ops *,
220 void *);
221extern int netfs_readpage(struct file *,
222 struct page *,
223 const struct netfs_read_request_ops *,
224 void *);
225extern int netfs_write_begin(struct file *, struct address_space *,
226 loff_t, unsigned int, unsigned int, struct page **,
227 void **,
228 const struct netfs_read_request_ops *,
229 void *);
230
231extern void netfs_subreq_terminated(struct netfs_read_subrequest *, ssize_t, bool);
232extern void netfs_stats_show(struct seq_file *);
233
234#endif
235