Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
199a31c6 CH |
2 | #ifndef LINUX_IOMAP_H |
3 | #define LINUX_IOMAP_H 1 | |
4 | ||
5 | #include <linux/types.h> | |
6 | ||
89eb1906 | 7 | struct address_space; |
8be9f564 | 8 | struct fiemap_extent_info; |
ae259a9c CH |
9 | struct inode; |
10 | struct iov_iter; | |
11 | struct kiocb; | |
63899c6f | 12 | struct page; |
ae259a9c CH |
13 | struct vm_area_struct; |
14 | struct vm_fault; | |
15 | ||
16 | /* | |
17 | * Types of block ranges for iomap mappings: | |
18 | */ | |
199a31c6 CH |
19 | #define IOMAP_HOLE 0x01 /* no blocks allocated, need allocation */ |
20 | #define IOMAP_DELALLOC 0x02 /* delayed allocation blocks */ | |
19fe5f64 AG |
21 | #define IOMAP_MAPPED 0x03 /* blocks allocated at @addr */ |
22 | #define IOMAP_UNWRITTEN 0x04 /* blocks allocated at @addr in unwritten state */ | |
19319b53 | 23 | #define IOMAP_INLINE 0x05 /* data inline in the inode */ |
199a31c6 | 24 | |
17de0a9f | 25 | /* |
d33fd776 | 26 | * Flags for all iomap mappings: |
a3841f94 | 27 | * |
caa51d26 JK |
28 | * IOMAP_F_DIRTY indicates the inode has uncommitted metadata needed to access |
29 | * written data and requires fdatasync to commit them to persistent storage. | |
17de0a9f | 30 | */ |
3974320c | 31 | #define IOMAP_F_NEW 0x01 /* blocks have been newly allocated */ |
7ee66c03 | 32 | #define IOMAP_F_DIRTY 0x02 /* uncommitted metadata */ |
d33fd776 CH |
33 | |
34 | /* | |
35 | * Flags that only need to be reported for IOMAP_REPORT requests: | |
36 | */ | |
9ca250a5 AG |
37 | #define IOMAP_F_MERGED 0x10 /* contains multiple blocks/extents */ |
38 | #define IOMAP_F_SHARED 0x20 /* block shared with another file */ | |
17de0a9f | 39 | |
7ee66c03 CH |
40 | /* |
41 | * Flags from 0x1000 up are for file system specific usage: | |
42 | */ | |
43 | #define IOMAP_F_PRIVATE 0x1000 | |
44 | ||
45 | ||
ae259a9c | 46 | /* |
19fe5f64 | 47 | * Magic value for addr: |
ae259a9c | 48 | */ |
19fe5f64 | 49 | #define IOMAP_NULL_ADDR -1ULL /* addr is not valid */ |
199a31c6 CH |
50 | |
51 | struct iomap { | |
19fe5f64 | 52 | u64 addr; /* disk offset of mapping, bytes */ |
ae259a9c CH |
53 | loff_t offset; /* file offset of mapping, bytes */ |
54 | u64 length; /* length of mapping, bytes */ | |
17de0a9f CH |
55 | u16 type; /* type of mapping */ |
56 | u16 flags; /* flags for mapping */ | |
ae259a9c | 57 | struct block_device *bdev; /* block device for I/O */ |
fa5d932c | 58 | struct dax_device *dax_dev; /* dax_dev for dax operations */ |
19e0c58f | 59 | void *inline_data; |
e184fde6 | 60 | void *private; /* filesystem private */ |
63899c6f CH |
61 | |
62 | /* | |
63 | * Called when finished processing a page in the mapping returned in | |
64 | * this iomap. At least for now this is only supported in the buffered | |
65 | * write path. | |
66 | */ | |
67 | void (*page_done)(struct inode *inode, loff_t pos, unsigned copied, | |
68 | struct page *page, struct iomap *iomap); | |
ae259a9c CH |
69 | }; |
70 | ||
71 | /* | |
72 | * Flags for iomap_begin / iomap_end. No flag implies a read. | |
73 | */ | |
d33fd776 CH |
74 | #define IOMAP_WRITE (1 << 0) /* writing, must allocate blocks */ |
75 | #define IOMAP_ZERO (1 << 1) /* zeroing operation, may skip holes */ | |
76 | #define IOMAP_REPORT (1 << 2) /* report extent status, e.g. FIEMAP */ | |
9484ab1b | 77 | #define IOMAP_FAULT (1 << 3) /* mapping for page fault */ |
ff6a9292 | 78 | #define IOMAP_DIRECT (1 << 4) /* direct I/O */ |
9ecac0ef | 79 | #define IOMAP_NOWAIT (1 << 5) /* do not block */ |
ae259a9c CH |
80 | |
81 | struct iomap_ops { | |
82 | /* | |
83 | * Return the existing mapping at pos, or reserve space starting at | |
84 | * pos for up to length, as long as we can do it as a single mapping. | |
85 | * The actual length is returned in iomap->length. | |
86 | */ | |
87 | int (*iomap_begin)(struct inode *inode, loff_t pos, loff_t length, | |
88 | unsigned flags, struct iomap *iomap); | |
89 | ||
90 | /* | |
91 | * Commit and/or unreserve space previous allocated using iomap_begin. | |
92 | * Written indicates the length of the successful write operation which | |
93 | * needs to be commited, while the rest needs to be unreserved. | |
94 | * Written might be zero if no data was written. | |
95 | */ | |
96 | int (*iomap_end)(struct inode *inode, loff_t pos, loff_t length, | |
97 | ssize_t written, unsigned flags, struct iomap *iomap); | |
199a31c6 CH |
98 | }; |
99 | ||
ae259a9c | 100 | ssize_t iomap_file_buffered_write(struct kiocb *iocb, struct iov_iter *from, |
8ff6daa1 | 101 | const struct iomap_ops *ops); |
72b4daa2 CH |
102 | int iomap_readpage(struct page *page, const struct iomap_ops *ops); |
103 | int iomap_readpages(struct address_space *mapping, struct list_head *pages, | |
104 | unsigned nr_pages, const struct iomap_ops *ops); | |
5f4e5752 | 105 | int iomap_file_dirty(struct inode *inode, loff_t pos, loff_t len, |
8ff6daa1 | 106 | const struct iomap_ops *ops); |
ae259a9c | 107 | int iomap_zero_range(struct inode *inode, loff_t pos, loff_t len, |
8ff6daa1 | 108 | bool *did_zero, const struct iomap_ops *ops); |
ae259a9c | 109 | int iomap_truncate_page(struct inode *inode, loff_t pos, bool *did_zero, |
8ff6daa1 | 110 | const struct iomap_ops *ops); |
11bac800 | 111 | int iomap_page_mkwrite(struct vm_fault *vmf, const struct iomap_ops *ops); |
8be9f564 | 112 | int iomap_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, |
8ff6daa1 | 113 | loff_t start, loff_t len, const struct iomap_ops *ops); |
0ed3b0d4 AG |
114 | loff_t iomap_seek_hole(struct inode *inode, loff_t offset, |
115 | const struct iomap_ops *ops); | |
116 | loff_t iomap_seek_data(struct inode *inode, loff_t offset, | |
117 | const struct iomap_ops *ops); | |
89eb1906 CH |
118 | sector_t iomap_bmap(struct address_space *mapping, sector_t bno, |
119 | const struct iomap_ops *ops); | |
ae259a9c | 120 | |
ff6a9292 CH |
121 | /* |
122 | * Flags for direct I/O ->end_io: | |
123 | */ | |
124 | #define IOMAP_DIO_UNWRITTEN (1 << 0) /* covers unwritten extent(s) */ | |
125 | #define IOMAP_DIO_COW (1 << 1) /* covers COW extent(s) */ | |
126 | typedef int (iomap_dio_end_io_t)(struct kiocb *iocb, ssize_t ret, | |
127 | unsigned flags); | |
128 | ssize_t iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter, | |
8ff6daa1 | 129 | const struct iomap_ops *ops, iomap_dio_end_io_t end_io); |
ff6a9292 | 130 | |
67482129 DW |
131 | #ifdef CONFIG_SWAP |
132 | struct file; | |
133 | struct swap_info_struct; | |
134 | ||
135 | int iomap_swapfile_activate(struct swap_info_struct *sis, | |
136 | struct file *swap_file, sector_t *pagespan, | |
137 | const struct iomap_ops *ops); | |
138 | #else | |
139 | # define iomap_swapfile_activate(sis, swapfile, pagespan, ops) (-EIO) | |
140 | #endif /* CONFIG_SWAP */ | |
141 | ||
199a31c6 | 142 | #endif /* LINUX_IOMAP_H */ |