~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/fs/btrfs/extent_io.h

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /* SPDX-License-Identifier: GPL-2.0 */
  2 
  3 #ifndef BTRFS_EXTENT_IO_H
  4 #define BTRFS_EXTENT_IO_H
  5 
  6 #include <linux/rbtree.h>
  7 #include <linux/refcount.h>
  8 #include <linux/fiemap.h>
  9 #include <linux/btrfs_tree.h>
 10 #include <linux/spinlock.h>
 11 #include <linux/atomic.h>
 12 #include <linux/rwsem.h>
 13 #include <linux/list.h>
 14 #include <linux/slab.h>
 15 #include "compression.h"
 16 #include "messages.h"
 17 #include "ulist.h"
 18 #include "misc.h"
 19 
 20 struct page;
 21 struct file;
 22 struct folio;
 23 struct inode;
 24 struct fiemap_extent_info;
 25 struct readahead_control;
 26 struct address_space;
 27 struct writeback_control;
 28 struct extent_io_tree;
 29 struct extent_map_tree;
 30 struct extent_state;
 31 struct btrfs_block_group;
 32 struct btrfs_fs_info;
 33 struct btrfs_inode;
 34 struct btrfs_root;
 35 struct btrfs_trans_handle;
 36 struct btrfs_tree_parent_check;
 37 
 38 enum {
 39         EXTENT_BUFFER_UPTODATE,
 40         EXTENT_BUFFER_DIRTY,
 41         EXTENT_BUFFER_CORRUPT,
 42         /* this got triggered by readahead */
 43         EXTENT_BUFFER_READAHEAD,
 44         EXTENT_BUFFER_TREE_REF,
 45         EXTENT_BUFFER_STALE,
 46         EXTENT_BUFFER_WRITEBACK,
 47         /* read IO error */
 48         EXTENT_BUFFER_READ_ERR,
 49         EXTENT_BUFFER_UNMAPPED,
 50         EXTENT_BUFFER_IN_TREE,
 51         /* write IO error */
 52         EXTENT_BUFFER_WRITE_ERR,
 53         /* Indicate the extent buffer is written zeroed out (for zoned) */
 54         EXTENT_BUFFER_ZONED_ZEROOUT,
 55         /* Indicate that extent buffer pages a being read */
 56         EXTENT_BUFFER_READING,
 57 };
 58 
 59 /* these are flags for __process_pages_contig */
 60 enum {
 61         ENUM_BIT(PAGE_UNLOCK),
 62         /* Page starts writeback, clear dirty bit and set writeback bit */
 63         ENUM_BIT(PAGE_START_WRITEBACK),
 64         ENUM_BIT(PAGE_END_WRITEBACK),
 65         ENUM_BIT(PAGE_SET_ORDERED),
 66 };
 67 
 68 /*
 69  * Folio private values.  Every page that is controlled by the extent map has
 70  * folio private set to this value.
 71  */
 72 #define EXTENT_FOLIO_PRIVATE                    1
 73 
 74 /*
 75  * The extent buffer bitmap operations are done with byte granularity instead of
 76  * word granularity for two reasons:
 77  * 1. The bitmaps must be little-endian on disk.
 78  * 2. Bitmap items are not guaranteed to be aligned to a word and therefore a
 79  *    single word in a bitmap may straddle two pages in the extent buffer.
 80  */
 81 #define BIT_BYTE(nr) ((nr) / BITS_PER_BYTE)
 82 #define BYTE_MASK ((1 << BITS_PER_BYTE) - 1)
 83 #define BITMAP_FIRST_BYTE_MASK(start) \
 84         ((BYTE_MASK << ((start) & (BITS_PER_BYTE - 1))) & BYTE_MASK)
 85 #define BITMAP_LAST_BYTE_MASK(nbits) \
 86         (BYTE_MASK >> (-(nbits) & (BITS_PER_BYTE - 1)))
 87 
 88 
 89 int __init extent_buffer_init_cachep(void);
 90 void __cold extent_buffer_free_cachep(void);
 91 
 92 #define INLINE_EXTENT_BUFFER_PAGES     (BTRFS_MAX_METADATA_BLOCKSIZE / PAGE_SIZE)
 93 struct extent_buffer {
 94         u64 start;
 95         u32 len;
 96         u32 folio_size;
 97         unsigned long bflags;
 98         struct btrfs_fs_info *fs_info;
 99 
100         /*
101          * The address where the eb can be accessed without any cross-page handling.
102          * This can be NULL if not possible.
103          */
104         void *addr;
105 
106         spinlock_t refs_lock;
107         atomic_t refs;
108         int read_mirror;
109         /* >= 0 if eb belongs to a log tree, -1 otherwise */
110         s8 log_index;
111         u8 folio_shift;
112         struct rcu_head rcu_head;
113 
114         struct rw_semaphore lock;
115 
116         /*
117          * Pointers to all the folios of the extent buffer.
118          *
119          * For now the folio is always order 0 (aka, a single page).
120          */
121         struct folio *folios[INLINE_EXTENT_BUFFER_PAGES];
122 #ifdef CONFIG_BTRFS_DEBUG
123         struct list_head leak_list;
124         pid_t lock_owner;
125 #endif
126 };
127 
128 struct btrfs_eb_write_context {
129         struct writeback_control *wbc;
130         struct extent_buffer *eb;
131         /* Block group @eb resides in. Only used for zoned mode. */
132         struct btrfs_block_group *zoned_bg;
133 };
134 
135 static inline unsigned long offset_in_eb_folio(const struct extent_buffer *eb,
136                                                u64 start)
137 {
138         ASSERT(eb->folio_size);
139         return start & (eb->folio_size - 1);
140 }
141 
142 /*
143  * Get the correct offset inside the page of extent buffer.
144  *
145  * @eb:         target extent buffer
146  * @start:      offset inside the extent buffer
147  *
148  * Will handle both sectorsize == PAGE_SIZE and sectorsize < PAGE_SIZE cases.
149  */
150 static inline size_t get_eb_offset_in_folio(const struct extent_buffer *eb,
151                                             unsigned long offset)
152 {
153         /*
154          * 1) sectorsize == PAGE_SIZE and nodesize >= PAGE_SIZE case
155          *    1.1) One large folio covering the whole eb
156          *         The eb->start is aligned to folio size, thus adding it
157          *         won't cause any difference.
158          *    1.2) Several page sized folios
159          *         The eb->start is aligned to folio (page) size, thus
160          *         adding it won't cause any difference.
161          *
162          * 2) sectorsize < PAGE_SIZE and nodesize < PAGE_SIZE case
163          *    In this case there would only be one page sized folio, and there
164          *    may be several different extent buffers in the page/folio.
165          *    We need to add eb->start to properly access the offset inside
166          *    that eb.
167          */
168         return offset_in_folio(eb->folios[0], offset + eb->start);
169 }
170 
171 static inline unsigned long get_eb_folio_index(const struct extent_buffer *eb,
172                                                unsigned long offset)
173 {
174         /*
175          * 1) sectorsize == PAGE_SIZE and nodesize >= PAGE_SIZE case
176          *    1.1) One large folio covering the whole eb.
177          *         the folio_shift would be large enough to always make us
178          *         return 0 as index.
179          *    1.2) Several page sized folios
180          *         The folio_shift would be PAGE_SHIFT, giving us the correct
181          *         index.
182          *
183          * 2) sectorsize < PAGE_SIZE and nodesize < PAGE_SIZE case
184          *    The folio would only be page sized, and always give us 0 as index.
185          */
186         return offset >> eb->folio_shift;
187 }
188 
189 /*
190  * Structure to record how many bytes and which ranges are set/cleared
191  */
192 struct extent_changeset {
193         /* How many bytes are set/cleared in this operation */
194         u64 bytes_changed;
195 
196         /* Changed ranges */
197         struct ulist range_changed;
198 };
199 
200 static inline void extent_changeset_init(struct extent_changeset *changeset)
201 {
202         changeset->bytes_changed = 0;
203         ulist_init(&changeset->range_changed);
204 }
205 
206 static inline struct extent_changeset *extent_changeset_alloc(void)
207 {
208         struct extent_changeset *ret;
209 
210         ret = kmalloc(sizeof(*ret), GFP_KERNEL);
211         if (!ret)
212                 return NULL;
213 
214         extent_changeset_init(ret);
215         return ret;
216 }
217 
218 static inline void extent_changeset_prealloc(struct extent_changeset *changeset, gfp_t gfp_mask)
219 {
220         ulist_prealloc(&changeset->range_changed, gfp_mask);
221 }
222 
223 static inline void extent_changeset_release(struct extent_changeset *changeset)
224 {
225         if (!changeset)
226                 return;
227         changeset->bytes_changed = 0;
228         ulist_release(&changeset->range_changed);
229 }
230 
231 static inline void extent_changeset_free(struct extent_changeset *changeset)
232 {
233         if (!changeset)
234                 return;
235         extent_changeset_release(changeset);
236         kfree(changeset);
237 }
238 
239 bool try_release_extent_mapping(struct page *page, gfp_t mask);
240 int try_release_extent_buffer(struct page *page);
241 
242 int btrfs_read_folio(struct file *file, struct folio *folio);
243 void extent_write_locked_range(struct inode *inode, const struct page *locked_page,
244                                u64 start, u64 end, struct writeback_control *wbc,
245                                bool pages_dirty);
246 int btrfs_writepages(struct address_space *mapping, struct writeback_control *wbc);
247 int btree_write_cache_pages(struct address_space *mapping,
248                             struct writeback_control *wbc);
249 void btrfs_readahead(struct readahead_control *rac);
250 int set_folio_extent_mapped(struct folio *folio);
251 int set_page_extent_mapped(struct page *page);
252 void clear_page_extent_mapped(struct page *page);
253 
254 struct extent_buffer *alloc_extent_buffer(struct btrfs_fs_info *fs_info,
255                                           u64 start, u64 owner_root, int level);
256 struct extent_buffer *__alloc_dummy_extent_buffer(struct btrfs_fs_info *fs_info,
257                                                   u64 start, unsigned long len);
258 struct extent_buffer *alloc_dummy_extent_buffer(struct btrfs_fs_info *fs_info,
259                                                 u64 start);
260 struct extent_buffer *btrfs_clone_extent_buffer(const struct extent_buffer *src);
261 struct extent_buffer *find_extent_buffer(struct btrfs_fs_info *fs_info,
262                                          u64 start);
263 void free_extent_buffer(struct extent_buffer *eb);
264 void free_extent_buffer_stale(struct extent_buffer *eb);
265 #define WAIT_NONE       0
266 #define WAIT_COMPLETE   1
267 #define WAIT_PAGE_LOCK  2
268 int read_extent_buffer_pages(struct extent_buffer *eb, int wait, int mirror_num,
269                              const struct btrfs_tree_parent_check *parent_check);
270 void wait_on_extent_buffer_writeback(struct extent_buffer *eb);
271 void btrfs_readahead_tree_block(struct btrfs_fs_info *fs_info,
272                                 u64 bytenr, u64 owner_root, u64 gen, int level);
273 void btrfs_readahead_node_child(struct extent_buffer *node, int slot);
274 
275 static inline int num_extent_pages(const struct extent_buffer *eb)
276 {
277         /*
278          * For sectorsize == PAGE_SIZE case, since nodesize is always aligned to
279          * sectorsize, it's just eb->len >> PAGE_SHIFT.
280          *
281          * For sectorsize < PAGE_SIZE case, we could have nodesize < PAGE_SIZE,
282          * thus have to ensure we get at least one page.
283          */
284         return (eb->len >> PAGE_SHIFT) ?: 1;
285 }
286 
287 /*
288  * This can only be determined at runtime by checking eb::folios[0].
289  *
290  * As we can have either one large folio covering the whole eb
291  * (either nodesize <= PAGE_SIZE, or high order folio), or multiple
292  * single-paged folios.
293  */
294 static inline int num_extent_folios(const struct extent_buffer *eb)
295 {
296         if (folio_order(eb->folios[0]))
297                 return 1;
298         return num_extent_pages(eb);
299 }
300 
301 static inline int extent_buffer_uptodate(const struct extent_buffer *eb)
302 {
303         return test_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags);
304 }
305 
306 int memcmp_extent_buffer(const struct extent_buffer *eb, const void *ptrv,
307                          unsigned long start, unsigned long len);
308 void read_extent_buffer(const struct extent_buffer *eb, void *dst,
309                         unsigned long start,
310                         unsigned long len);
311 int read_extent_buffer_to_user_nofault(const struct extent_buffer *eb,
312                                        void __user *dst, unsigned long start,
313                                        unsigned long len);
314 void write_extent_buffer(const struct extent_buffer *eb, const void *src,
315                          unsigned long start, unsigned long len);
316 
317 static inline void write_extent_buffer_chunk_tree_uuid(
318                 const struct extent_buffer *eb, const void *chunk_tree_uuid)
319 {
320         write_extent_buffer(eb, chunk_tree_uuid,
321                             offsetof(struct btrfs_header, chunk_tree_uuid),
322                             BTRFS_FSID_SIZE);
323 }
324 
325 static inline void write_extent_buffer_fsid(const struct extent_buffer *eb,
326                                             const void *fsid)
327 {
328         write_extent_buffer(eb, fsid, offsetof(struct btrfs_header, fsid),
329                             BTRFS_FSID_SIZE);
330 }
331 
332 void copy_extent_buffer_full(const struct extent_buffer *dst,
333                              const struct extent_buffer *src);
334 void copy_extent_buffer(const struct extent_buffer *dst,
335                         const struct extent_buffer *src,
336                         unsigned long dst_offset, unsigned long src_offset,
337                         unsigned long len);
338 void memcpy_extent_buffer(const struct extent_buffer *dst,
339                           unsigned long dst_offset, unsigned long src_offset,
340                           unsigned long len);
341 void memmove_extent_buffer(const struct extent_buffer *dst,
342                            unsigned long dst_offset, unsigned long src_offset,
343                            unsigned long len);
344 void memzero_extent_buffer(const struct extent_buffer *eb, unsigned long start,
345                            unsigned long len);
346 int extent_buffer_test_bit(const struct extent_buffer *eb, unsigned long start,
347                            unsigned long pos);
348 void extent_buffer_bitmap_set(const struct extent_buffer *eb, unsigned long start,
349                               unsigned long pos, unsigned long len);
350 void extent_buffer_bitmap_clear(const struct extent_buffer *eb,
351                                 unsigned long start, unsigned long pos,
352                                 unsigned long len);
353 void set_extent_buffer_dirty(struct extent_buffer *eb);
354 void set_extent_buffer_uptodate(struct extent_buffer *eb);
355 void clear_extent_buffer_uptodate(struct extent_buffer *eb);
356 void extent_clear_unlock_delalloc(struct btrfs_inode *inode, u64 start, u64 end,
357                                   const struct page *locked_page,
358                                   struct extent_state **cached,
359                                   u32 bits_to_clear, unsigned long page_ops);
360 int extent_invalidate_folio(struct extent_io_tree *tree,
361                             struct folio *folio, size_t offset);
362 void btrfs_clear_buffer_dirty(struct btrfs_trans_handle *trans,
363                               struct extent_buffer *buf);
364 
365 int btrfs_alloc_page_array(unsigned int nr_pages, struct page **page_array,
366                            bool nofail);
367 int btrfs_alloc_folio_array(unsigned int nr_folios, struct folio **folio_array);
368 
369 #ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS
370 bool find_lock_delalloc_range(struct inode *inode,
371                              struct page *locked_page, u64 *start,
372                              u64 *end);
373 #endif
374 struct extent_buffer *alloc_test_extent_buffer(struct btrfs_fs_info *fs_info,
375                                                u64 start);
376 
377 #ifdef CONFIG_BTRFS_DEBUG
378 void btrfs_extent_buffer_leak_debug_check(struct btrfs_fs_info *fs_info);
379 #else
380 #define btrfs_extent_buffer_leak_debug_check(fs_info)   do {} while (0)
381 #endif
382 
383 #endif
384 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php