1
2#ifndef LINUX_IOMAP_H
3#define LINUX_IOMAP_H 1
4
5#include <linux/atomic.h>
6#include <linux/bitmap.h>
7#include <linux/blk_types.h>
8#include <linux/mm.h>
9#include <linux/types.h>
10#include <linux/mm_types.h>
11#include <linux/blkdev.h>
12
13struct address_space;
14struct fiemap_extent_info;
15struct inode;
16struct iomap_writepage_ctx;
17struct iov_iter;
18struct kiocb;
19struct page;
20struct vm_area_struct;
21struct vm_fault;
22
23
24
25
26#define IOMAP_HOLE 0
27#define IOMAP_DELALLOC 1
28#define IOMAP_MAPPED 2
29#define IOMAP_UNWRITTEN 3
30#define IOMAP_INLINE 4
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52#define IOMAP_F_NEW 0x01
53#define IOMAP_F_DIRTY 0x02
54#define IOMAP_F_SHARED 0x04
55#define IOMAP_F_MERGED 0x08
56#define IOMAP_F_BUFFER_HEAD 0x10
57
58
59
60
61
62
63
64#define IOMAP_F_SIZE_CHANGED 0x100
65
66
67
68
69#define IOMAP_F_PRIVATE 0x1000
70
71
72
73
74
75#define IOMAP_NULL_ADDR -1ULL
76
77struct iomap_page_ops;
78
79struct iomap {
80 u64 addr;
81 loff_t offset;
82 u64 length;
83 u16 type;
84 u16 flags;
85 struct block_device *bdev;
86 struct dax_device *dax_dev;
87 void *inline_data;
88 void *private;
89 const struct iomap_page_ops *page_ops;
90};
91
92static inline sector_t
93iomap_sector(struct iomap *iomap, loff_t pos)
94{
95 return (iomap->addr + pos - iomap->offset) >> SECTOR_SHIFT;
96}
97
98
99
100
101
102
103
104
105
106
107
108struct iomap_page_ops {
109 int (*page_prepare)(struct inode *inode, loff_t pos, unsigned len,
110 struct iomap *iomap);
111 void (*page_done)(struct inode *inode, loff_t pos, unsigned copied,
112 struct page *page, struct iomap *iomap);
113};
114
115
116
117
118#define IOMAP_WRITE (1 << 0)
119#define IOMAP_ZERO (1 << 1)
120#define IOMAP_REPORT (1 << 2)
121#define IOMAP_FAULT (1 << 3)
122#define IOMAP_DIRECT (1 << 4)
123#define IOMAP_NOWAIT (1 << 5)
124
125struct iomap_ops {
126
127
128
129
130
131 int (*iomap_begin)(struct inode *inode, loff_t pos, loff_t length,
132 unsigned flags, struct iomap *iomap,
133 struct iomap *srcmap);
134
135
136
137
138
139
140
141 int (*iomap_end)(struct inode *inode, loff_t pos, loff_t length,
142 ssize_t written, unsigned flags, struct iomap *iomap);
143};
144
145
146
147
148typedef loff_t (*iomap_actor_t)(struct inode *inode, loff_t pos, loff_t len,
149 void *data, struct iomap *iomap, struct iomap *srcmap);
150
151loff_t iomap_apply(struct inode *inode, loff_t pos, loff_t length,
152 unsigned flags, const struct iomap_ops *ops, void *data,
153 iomap_actor_t actor);
154
155ssize_t iomap_file_buffered_write(struct kiocb *iocb, struct iov_iter *from,
156 const struct iomap_ops *ops);
157int iomap_readpage(struct page *page, const struct iomap_ops *ops);
158int iomap_readpages(struct address_space *mapping, struct list_head *pages,
159 unsigned nr_pages, const struct iomap_ops *ops);
160int iomap_set_page_dirty(struct page *page);
161int iomap_is_partially_uptodate(struct page *page, unsigned long from,
162 unsigned long count);
163int iomap_releasepage(struct page *page, gfp_t gfp_mask);
164void iomap_invalidatepage(struct page *page, unsigned int offset,
165 unsigned int len);
166#ifdef CONFIG_MIGRATION
167int iomap_migrate_page(struct address_space *mapping, struct page *newpage,
168 struct page *page, enum migrate_mode mode);
169#else
170#define iomap_migrate_page NULL
171#endif
172int iomap_file_unshare(struct inode *inode, loff_t pos, loff_t len,
173 const struct iomap_ops *ops);
174int iomap_zero_range(struct inode *inode, loff_t pos, loff_t len,
175 bool *did_zero, const struct iomap_ops *ops);
176int iomap_truncate_page(struct inode *inode, loff_t pos, bool *did_zero,
177 const struct iomap_ops *ops);
178vm_fault_t iomap_page_mkwrite(struct vm_fault *vmf,
179 const struct iomap_ops *ops);
180int iomap_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
181 loff_t start, loff_t len, const struct iomap_ops *ops);
182loff_t iomap_seek_hole(struct inode *inode, loff_t offset,
183 const struct iomap_ops *ops);
184loff_t iomap_seek_data(struct inode *inode, loff_t offset,
185 const struct iomap_ops *ops);
186sector_t iomap_bmap(struct address_space *mapping, sector_t bno,
187 const struct iomap_ops *ops);
188
189
190
191
192struct iomap_ioend {
193 struct list_head io_list;
194 u16 io_type;
195 u16 io_flags;
196 struct inode *io_inode;
197 size_t io_size;
198 loff_t io_offset;
199 void *io_private;
200 struct bio *io_bio;
201 struct bio io_inline_bio;
202};
203
204struct iomap_writeback_ops {
205
206
207
208
209 int (*map_blocks)(struct iomap_writepage_ctx *wpc, struct inode *inode,
210 loff_t offset);
211
212
213
214
215
216
217
218 int (*prepare_ioend)(struct iomap_ioend *ioend, int status);
219
220
221
222
223
224 void (*discard_page)(struct page *page);
225};
226
227struct iomap_writepage_ctx {
228 struct iomap iomap;
229 struct iomap_ioend *ioend;
230 const struct iomap_writeback_ops *ops;
231};
232
233void iomap_finish_ioends(struct iomap_ioend *ioend, int error);
234void iomap_ioend_try_merge(struct iomap_ioend *ioend,
235 struct list_head *more_ioends,
236 void (*merge_private)(struct iomap_ioend *ioend,
237 struct iomap_ioend *next));
238void iomap_sort_ioends(struct list_head *ioend_list);
239int iomap_writepage(struct page *page, struct writeback_control *wbc,
240 struct iomap_writepage_ctx *wpc,
241 const struct iomap_writeback_ops *ops);
242int iomap_writepages(struct address_space *mapping,
243 struct writeback_control *wbc, struct iomap_writepage_ctx *wpc,
244 const struct iomap_writeback_ops *ops);
245
246
247
248
249#define IOMAP_DIO_UNWRITTEN (1 << 0)
250#define IOMAP_DIO_COW (1 << 1)
251
252struct iomap_dio_ops {
253 int (*end_io)(struct kiocb *iocb, ssize_t size, int error,
254 unsigned flags);
255};
256
257ssize_t iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter,
258 const struct iomap_ops *ops, const struct iomap_dio_ops *dops,
259 bool wait_for_completion);
260int iomap_dio_iopoll(struct kiocb *kiocb, bool spin);
261
262#ifdef CONFIG_SWAP
263struct file;
264struct swap_info_struct;
265
266int iomap_swapfile_activate(struct swap_info_struct *sis,
267 struct file *swap_file, sector_t *pagespan,
268 const struct iomap_ops *ops);
269#else
270# define iomap_swapfile_activate(sis, swapfile, pagespan, ops) (-EIO)
271#endif
272
273#endif
274