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/mm.h>
8#include <linux/types.h>
9#include <linux/mm_types.h>
10
11struct address_space;
12struct fiemap_extent_info;
13struct inode;
14struct iov_iter;
15struct kiocb;
16struct page;
17struct vm_area_struct;
18struct vm_fault;
19
20
21
22
23#define IOMAP_HOLE 0x01
24#define IOMAP_DELALLOC 0x02
25#define IOMAP_MAPPED 0x03
26#define IOMAP_UNWRITTEN 0x04
27#define IOMAP_INLINE 0x05
28
29
30
31
32
33
34
35#define IOMAP_F_NEW 0x01
36#define IOMAP_F_DIRTY 0x02
37#define IOMAP_F_BUFFER_HEAD 0x04
38
39
40
41
42#define IOMAP_F_MERGED 0x10
43#define IOMAP_F_SHARED 0x20
44
45
46
47
48#define IOMAP_F_PRIVATE 0x1000
49
50
51
52
53
54#define IOMAP_NULL_ADDR -1ULL
55
56struct iomap_page_ops;
57
58struct iomap {
59 u64 addr;
60 loff_t offset;
61 u64 length;
62 u16 type;
63 u16 flags;
64 struct block_device *bdev;
65 struct dax_device *dax_dev;
66 void *inline_data;
67 void *private;
68 const struct iomap_page_ops *page_ops;
69};
70
71
72
73
74
75
76
77
78
79
80
81struct iomap_page_ops {
82 int (*page_prepare)(struct inode *inode, loff_t pos, unsigned len,
83 struct iomap *iomap);
84 void (*page_done)(struct inode *inode, loff_t pos, unsigned copied,
85 struct page *page, struct iomap *iomap);
86};
87
88
89
90
91#define IOMAP_WRITE (1 << 0)
92#define IOMAP_ZERO (1 << 1)
93#define IOMAP_REPORT (1 << 2)
94#define IOMAP_FAULT (1 << 3)
95#define IOMAP_DIRECT (1 << 4)
96#define IOMAP_NOWAIT (1 << 5)
97
98struct iomap_ops {
99
100
101
102
103
104 int (*iomap_begin)(struct inode *inode, loff_t pos, loff_t length,
105 unsigned flags, struct iomap *iomap);
106
107
108
109
110
111
112
113 int (*iomap_end)(struct inode *inode, loff_t pos, loff_t length,
114 ssize_t written, unsigned flags, struct iomap *iomap);
115};
116
117
118
119
120
121struct iomap_page {
122 atomic_t read_count;
123 atomic_t write_count;
124 DECLARE_BITMAP(uptodate, PAGE_SIZE / 512);
125};
126
127static inline struct iomap_page *to_iomap_page(struct page *page)
128{
129 if (page_has_private(page))
130 return (struct iomap_page *)page_private(page);
131 return NULL;
132}
133
134ssize_t iomap_file_buffered_write(struct kiocb *iocb, struct iov_iter *from,
135 const struct iomap_ops *ops);
136int iomap_readpage(struct page *page, const struct iomap_ops *ops);
137int iomap_readpages(struct address_space *mapping, struct list_head *pages,
138 unsigned nr_pages, const struct iomap_ops *ops);
139int iomap_set_page_dirty(struct page *page);
140int iomap_is_partially_uptodate(struct page *page, unsigned long from,
141 unsigned long count);
142int iomap_releasepage(struct page *page, gfp_t gfp_mask);
143void iomap_invalidatepage(struct page *page, unsigned int offset,
144 unsigned int len);
145#ifdef CONFIG_MIGRATION
146int iomap_migrate_page(struct address_space *mapping, struct page *newpage,
147 struct page *page, enum migrate_mode mode);
148#else
149#define iomap_migrate_page NULL
150#endif
151int iomap_file_dirty(struct inode *inode, loff_t pos, loff_t len,
152 const struct iomap_ops *ops);
153int iomap_zero_range(struct inode *inode, loff_t pos, loff_t len,
154 bool *did_zero, const struct iomap_ops *ops);
155int iomap_truncate_page(struct inode *inode, loff_t pos, bool *did_zero,
156 const struct iomap_ops *ops);
157vm_fault_t iomap_page_mkwrite(struct vm_fault *vmf,
158 const struct iomap_ops *ops);
159int iomap_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
160 loff_t start, loff_t len, const struct iomap_ops *ops);
161loff_t iomap_seek_hole(struct inode *inode, loff_t offset,
162 const struct iomap_ops *ops);
163loff_t iomap_seek_data(struct inode *inode, loff_t offset,
164 const struct iomap_ops *ops);
165sector_t iomap_bmap(struct address_space *mapping, sector_t bno,
166 const struct iomap_ops *ops);
167
168
169
170
171#define IOMAP_DIO_UNWRITTEN (1 << 0)
172#define IOMAP_DIO_COW (1 << 1)
173typedef int (iomap_dio_end_io_t)(struct kiocb *iocb, ssize_t ret,
174 unsigned flags);
175ssize_t iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter,
176 const struct iomap_ops *ops, iomap_dio_end_io_t end_io);
177int iomap_dio_iopoll(struct kiocb *kiocb, bool spin);
178
179#ifdef CONFIG_SWAP
180struct file;
181struct swap_info_struct;
182
183int iomap_swapfile_activate(struct swap_info_struct *sis,
184 struct file *swap_file, sector_t *pagespan,
185 const struct iomap_ops *ops);
186#else
187# define iomap_swapfile_activate(sis, swapfile, pagespan, ops) (-EIO)
188#endif
189
190#endif
191