1 // SPDX-License-Identifier: GPL-2.0
2
3 #include <linux/slab.h>
4 #include "messages.h"
5 #include "subpage.h"
6 #include "btrfs_inode.h"
7
8 /*
9 * Subpage (block size < folio size) support overview:
10 *
11 * Limitations:
12 *
13 * - Metadata must be fully aligned to node size
14 * So when nodesize <= page size, the metadata can never cross folio boundaries.
15 *
16 * - Only support blocks per folio <= min(BTRFS_MAX_FOLIO_SIZE / fs block size,
17 * BTRFS_MAX_BLOCKS_PER_FOLIO)
18 * This is to ensure we can afford an on-stack bitmap, without the need to allocate
19 * bitmap memory at runtime.
20 *
21 * Implementation:
22 *
23 * - Common
24 * Both metadata and data will use a new structure, btrfs_folio_state, to
25 * record the status of each sector inside a page. This provides the extra
26 * granularity needed.
27 *
28 * - Metadata
29 * Since we have multiple tree blocks inside one page, we can't rely on page
30 * locking anymore, or we will have greatly reduced concurrency or even
31 * deadlocks (hold one tree lock while trying to lock another tree lock in
32 * the same page).
33 *
34 * Thus for metadata locking, subpage support relies on io_tree locking only.
35 * This means a slightly higher tree locking latency.
36 */
37
btrfs_attach_folio_state(const struct btrfs_fs_info * fs_info,struct folio * folio,enum btrfs_folio_type type)38 int btrfs_attach_folio_state(const struct btrfs_fs_info *fs_info,
39 struct folio *folio, enum btrfs_folio_type type)
40 {
41 struct btrfs_folio_state *bfs;
42
43 /* For metadata we don't support large folio yet. */
44 if (type == BTRFS_SUBPAGE_METADATA)
45 ASSERT(!folio_test_large(folio));
46
47 /*
48 * We have cases like a dummy extent buffer page, which is not mapped
49 * and doesn't need to be locked.
50 */
51 if (folio->mapping)
52 ASSERT(folio_test_locked(folio));
53
54 /* Either not subpage, or the folio already has private attached. */
55 if (folio_test_private(folio))
56 return 0;
57 if (type == BTRFS_SUBPAGE_METADATA && !btrfs_meta_is_subpage(fs_info))
58 return 0;
59 if (type == BTRFS_SUBPAGE_DATA && !btrfs_is_subpage(fs_info, folio))
60 return 0;
61
62 bfs = btrfs_alloc_folio_state(fs_info, folio_size(folio), type, GFP_NOFS);
63 if (IS_ERR(bfs))
64 return PTR_ERR(bfs);
65
66 folio_attach_private(folio, bfs);
67 return 0;
68 }
69
btrfs_detach_folio_state(const struct btrfs_fs_info * fs_info,struct folio * folio,enum btrfs_folio_type type)70 void btrfs_detach_folio_state(const struct btrfs_fs_info *fs_info, struct folio *folio,
71 enum btrfs_folio_type type)
72 {
73 struct btrfs_folio_state *bfs;
74
75 /* Either not subpage, or the folio already has private attached. */
76 if (!folio_test_private(folio))
77 return;
78 if (type == BTRFS_SUBPAGE_METADATA && !btrfs_meta_is_subpage(fs_info))
79 return;
80 if (type == BTRFS_SUBPAGE_DATA && !btrfs_is_subpage(fs_info, folio))
81 return;
82
83 bfs = folio_detach_private(folio);
84 ASSERT(bfs);
85 btrfs_free_folio_state(bfs);
86 }
87
btrfs_alloc_folio_state(const struct btrfs_fs_info * fs_info,size_t fsize,enum btrfs_folio_type type,gfp_t gfp)88 struct btrfs_folio_state *btrfs_alloc_folio_state(const struct btrfs_fs_info *fs_info,
89 size_t fsize, enum btrfs_folio_type type,
90 gfp_t gfp)
91 {
92 struct btrfs_folio_state *ret;
93 unsigned int real_size;
94
95 ASSERT(fs_info->sectorsize < fsize);
96
97 real_size = struct_size(ret, bitmaps,
98 BITS_TO_LONGS(btrfs_bitmap_nr_max *
99 (fsize >> fs_info->sectorsize_bits)));
100 ret = kzalloc(real_size, gfp);
101 if (!ret)
102 return ERR_PTR(-ENOMEM);
103
104 spin_lock_init(&ret->lock);
105 if (type == BTRFS_SUBPAGE_METADATA)
106 atomic_set(&ret->eb_refs, 0);
107 else
108 atomic_set(&ret->nr_locked, 0);
109 return ret;
110 }
111
112 /*
113 * Increase the eb_refs of current subpage.
114 *
115 * This is important for eb allocation, to prevent race with last eb freeing
116 * of the same page.
117 * With the eb_refs increased before the eb inserted into radix tree,
118 * detach_extent_buffer_page() won't detach the folio private while we're still
119 * allocating the extent buffer.
120 */
btrfs_folio_inc_eb_refs(const struct btrfs_fs_info * fs_info,struct folio * folio)121 void btrfs_folio_inc_eb_refs(const struct btrfs_fs_info *fs_info, struct folio *folio)
122 {
123 struct btrfs_folio_state *bfs;
124
125 if (!btrfs_meta_is_subpage(fs_info))
126 return;
127
128 ASSERT(folio_test_private(folio) && folio->mapping);
129 lockdep_assert_held(&folio->mapping->i_private_lock);
130
131 bfs = folio_get_private(folio);
132 atomic_inc(&bfs->eb_refs);
133 }
134
btrfs_folio_dec_eb_refs(const struct btrfs_fs_info * fs_info,struct folio * folio)135 void btrfs_folio_dec_eb_refs(const struct btrfs_fs_info *fs_info, struct folio *folio)
136 {
137 struct btrfs_folio_state *bfs;
138
139 if (!btrfs_meta_is_subpage(fs_info))
140 return;
141
142 ASSERT(folio_test_private(folio) && folio->mapping);
143 lockdep_assert_held(&folio->mapping->i_private_lock);
144
145 bfs = folio_get_private(folio);
146 ASSERT(atomic_read(&bfs->eb_refs));
147 atomic_dec(&bfs->eb_refs);
148 }
149
btrfs_subpage_assert(const struct btrfs_fs_info * fs_info,struct folio * folio,u64 start,u32 len)150 static void btrfs_subpage_assert(const struct btrfs_fs_info *fs_info,
151 struct folio *folio, u64 start, u32 len)
152 {
153 /* Basic checks */
154 ASSERT(folio_test_private(folio) && folio_get_private(folio));
155 ASSERT(IS_ALIGNED(start, fs_info->sectorsize) &&
156 IS_ALIGNED(len, fs_info->sectorsize), "start=%llu len=%u", start, len);
157 /*
158 * The range check only works for mapped page, we can still have
159 * unmapped page like dummy extent buffer pages.
160 */
161 if (folio->mapping)
162 ASSERT(folio_pos(folio) <= start &&
163 start + len <= folio_next_pos(folio),
164 "start=%llu len=%u folio_pos=%llu folio_size=%zu",
165 start, len, folio_pos(folio), folio_size(folio));
166 }
167
168 #define subpage_calc_start_bit(fs_info, folio, name, start, len) \
169 ({ \
170 unsigned int __start_bit; \
171 const unsigned int __bpf = btrfs_blocks_per_folio(fs_info, folio); \
172 \
173 btrfs_subpage_assert(fs_info, folio, start, len); \
174 __start_bit = offset_in_folio(folio, start) >> fs_info->sectorsize_bits; \
175 __start_bit += __bpf * btrfs_bitmap_nr_##name; \
176 __start_bit; \
177 })
178
btrfs_subpage_clamp_range(struct folio * folio,u64 * start,u32 * len)179 static void btrfs_subpage_clamp_range(struct folio *folio, u64 *start, u32 *len)
180 {
181 u64 orig_start = *start;
182 u32 orig_len = *len;
183
184 *start = max_t(u64, folio_pos(folio), orig_start);
185 /*
186 * For certain call sites like btrfs_drop_pages(), we may have pages
187 * beyond the target range. In that case, just set @len to 0, subpage
188 * helpers can handle @len == 0 without any problem.
189 */
190 if (folio_pos(folio) >= orig_start + orig_len)
191 *len = 0;
192 else
193 *len = min_t(u64, folio_next_pos(folio), orig_start + orig_len) - *start;
194 }
195
btrfs_subpage_end_and_test_lock(const struct btrfs_fs_info * fs_info,struct folio * folio,u64 start,u32 len)196 static bool btrfs_subpage_end_and_test_lock(const struct btrfs_fs_info *fs_info,
197 struct folio *folio, u64 start, u32 len)
198 {
199 struct btrfs_folio_state *bfs = folio_get_private(folio);
200 const int nbits = (len >> fs_info->sectorsize_bits);
201 unsigned long flags;
202 bool last;
203
204 btrfs_subpage_assert(fs_info, folio, start, len);
205
206 spin_lock_irqsave(&bfs->lock, flags);
207 /*
208 * We have call sites passing @lock_page into
209 * extent_clear_unlock_delalloc() for compression path.
210 *
211 * This @locked_page is locked by plain lock_page(), thus its
212 * subpage::locked is 0. Handle them in a special way.
213 */
214 if (atomic_read(&bfs->nr_locked) == 0) {
215 spin_unlock_irqrestore(&bfs->lock, flags);
216 return true;
217 }
218 ASSERT(atomic_read(&bfs->nr_locked) >= nbits,
219 "atomic_read(&bfs->nr_locked)=%d nbits=%d",
220 atomic_read(&bfs->nr_locked), nbits);
221 last = atomic_sub_and_test(nbits, &bfs->nr_locked);
222 spin_unlock_irqrestore(&bfs->lock, flags);
223 return last;
224 }
225
226 /*
227 * Handle different locked folios:
228 *
229 * - Non-subpage folio
230 * Just unlock it.
231 *
232 * - folio locked but without any subpage locked
233 * This happens either before writepage_delalloc() or the delalloc range is
234 * already handled by previous folio.
235 * We can simple unlock it.
236 *
237 * - folio locked with subpage range locked.
238 * We go through the locked sectors inside the range and clear their locked
239 * bitmap, reduce the writer lock number, and unlock the page if that's
240 * the last locked range.
241 */
btrfs_folio_end_lock(const struct btrfs_fs_info * fs_info,struct folio * folio,u64 start,u32 len)242 void btrfs_folio_end_lock(const struct btrfs_fs_info *fs_info,
243 struct folio *folio, u64 start, u32 len)
244 {
245 struct btrfs_folio_state *bfs = folio_get_private(folio);
246
247 ASSERT(folio_test_locked(folio));
248
249 if (unlikely(!fs_info) || !btrfs_is_subpage(fs_info, folio)) {
250 folio_unlock(folio);
251 return;
252 }
253
254 /*
255 * For subpage case, there are two types of locked page. With or
256 * without locked number.
257 *
258 * Since we own the page lock, no one else could touch subpage::locked
259 * and we are safe to do several atomic operations without spinlock.
260 */
261 if (atomic_read(&bfs->nr_locked) == 0) {
262 /* No subpage lock, locked by plain lock_page(). */
263 folio_unlock(folio);
264 return;
265 }
266
267 btrfs_subpage_clamp_range(folio, &start, &len);
268 if (btrfs_subpage_end_and_test_lock(fs_info, folio, start, len))
269 folio_unlock(folio);
270 }
271
btrfs_folio_end_lock_bitmap(const struct btrfs_fs_info * fs_info,struct folio * folio,unsigned long * bitmap)272 void btrfs_folio_end_lock_bitmap(const struct btrfs_fs_info *fs_info,
273 struct folio *folio, unsigned long *bitmap)
274 {
275 struct btrfs_folio_state *bfs = folio_get_private(folio);
276 const unsigned int blocks_per_folio = btrfs_blocks_per_folio(fs_info, folio);
277 const unsigned int nbits = bitmap_weight(bitmap, blocks_per_folio);
278 unsigned long flags;
279 bool last = false;
280
281 if (!btrfs_is_subpage(fs_info, folio)) {
282 folio_unlock(folio);
283 return;
284 }
285
286 if (atomic_read(&bfs->nr_locked) == 0) {
287 /* No subpage lock, locked by plain lock_page(). */
288 folio_unlock(folio);
289 return;
290 }
291
292 spin_lock_irqsave(&bfs->lock, flags);
293 ASSERT(atomic_read(&bfs->nr_locked) >= nbits,
294 "atomic_read(&bfs->nr_locked)=%d nbits=%d",
295 atomic_read(&bfs->nr_locked), nbits);
296 last = atomic_sub_and_test(nbits, &bfs->nr_locked);
297 spin_unlock_irqrestore(&bfs->lock, flags);
298 if (last)
299 folio_unlock(folio);
300 }
301
302 #define subpage_test_bitmap_all_set(fs_info, folio, name) \
303 ({ \
304 struct btrfs_folio_state *__bfs = folio_get_private(folio); \
305 const unsigned int __bpf = btrfs_blocks_per_folio(fs_info, folio); \
306 \
307 bitmap_test_range_all_set(__bfs->bitmaps, \
308 __bpf * btrfs_bitmap_nr_##name, __bpf); \
309 })
310
311 #define subpage_test_bitmap_all_zero(fs_info, folio, name) \
312 ({ \
313 struct btrfs_folio_state *__bfs = folio_get_private(folio); \
314 const unsigned int __bpf = btrfs_blocks_per_folio(fs_info, folio); \
315 \
316 bitmap_test_range_all_zero(__bfs->bitmaps, \
317 __bpf * btrfs_bitmap_nr_##name, __bpf); \
318 })
319
btrfs_subpage_set_uptodate(const struct btrfs_fs_info * fs_info,struct folio * folio,u64 start,u32 len)320 void btrfs_subpage_set_uptodate(const struct btrfs_fs_info *fs_info,
321 struct folio *folio, u64 start, u32 len)
322 {
323 struct btrfs_folio_state *bfs = folio_get_private(folio);
324 unsigned int start_bit = subpage_calc_start_bit(fs_info, folio,
325 uptodate, start, len);
326 unsigned long flags;
327
328 spin_lock_irqsave(&bfs->lock, flags);
329 bitmap_set(bfs->bitmaps, start_bit, len >> fs_info->sectorsize_bits);
330 if (subpage_test_bitmap_all_set(fs_info, folio, uptodate))
331 folio_mark_uptodate(folio);
332 spin_unlock_irqrestore(&bfs->lock, flags);
333 }
334
btrfs_subpage_clear_uptodate(const struct btrfs_fs_info * fs_info,struct folio * folio,u64 start,u32 len)335 void btrfs_subpage_clear_uptodate(const struct btrfs_fs_info *fs_info,
336 struct folio *folio, u64 start, u32 len)
337 {
338 struct btrfs_folio_state *bfs = folio_get_private(folio);
339 unsigned int start_bit = subpage_calc_start_bit(fs_info, folio,
340 uptodate, start, len);
341 unsigned long flags;
342
343 spin_lock_irqsave(&bfs->lock, flags);
344 bitmap_clear(bfs->bitmaps, start_bit, len >> fs_info->sectorsize_bits);
345 folio_clear_uptodate(folio);
346 spin_unlock_irqrestore(&bfs->lock, flags);
347 }
348
349 /*
350 * folio_mark_dirty() for a folio we are dirtying with a space reservation.
351 *
352 * Dirtiers without a reservation use btrfs_data_dirty_folio().
353 */
btrfs_folio_mark_dirty(struct folio * folio)354 static void btrfs_folio_mark_dirty(struct folio *folio)
355 {
356 struct address_space *mapping = folio_mapping(folio);
357
358 if (!mapping || !mapping->host || !is_data_inode(BTRFS_I(mapping->host))) {
359 folio_mark_dirty(folio);
360 return;
361 }
362 if (folio_test_reclaim(folio))
363 folio_clear_reclaim(folio);
364 filemap_dirty_folio(mapping, folio);
365 }
366
367 /*
368 * The set helper of the dirty ops, so it only runs for folios without a
369 * fixup bitmap: for those the folio flag is the whole fixup state, and this
370 * reserving write covers the block, so retire it. Metadata never has the
371 * flag set and only pays the test.
372 */
btrfs_folio_mark_dirty_reserved(struct folio * folio)373 static void btrfs_folio_mark_dirty_reserved(struct folio *folio)
374 {
375 if (folio_test_fixup_pending(folio))
376 folio_clear_fixup_pending(folio);
377 btrfs_folio_mark_dirty(folio);
378 }
379
btrfs_subpage_set_dirty(const struct btrfs_fs_info * fs_info,struct folio * folio,u64 start,u32 len)380 void btrfs_subpage_set_dirty(const struct btrfs_fs_info *fs_info,
381 struct folio *folio, u64 start, u32 len)
382 {
383 struct btrfs_folio_state *bfs = folio_get_private(folio);
384 unsigned int dirty_bit = subpage_calc_start_bit(fs_info, folio,
385 dirty, start, len);
386 unsigned int fixup_bit = subpage_calc_start_bit(fs_info, folio,
387 fixup, start, len);
388 const unsigned int nbits = len >> fs_info->sectorsize_bits;
389 unsigned long flags;
390
391 spin_lock_irqsave(&bfs->lock, flags);
392 bitmap_set(bfs->bitmaps, dirty_bit, nbits);
393 /* Proper dirtying obviates the need for fixup. */
394 bitmap_clear(bfs->bitmaps, fixup_bit, nbits);
395 if (folio_test_fixup_pending(folio) &&
396 subpage_test_bitmap_all_zero(fs_info, folio, fixup))
397 folio_clear_fixup_pending(folio);
398 spin_unlock_irqrestore(&bfs->lock, flags);
399 btrfs_folio_mark_dirty(folio);
400 }
401
folio_clear_tags(struct folio * folio)402 static void folio_clear_tags(struct folio *folio)
403 {
404 struct address_space *mapping = folio_mapping(folio);
405 XA_STATE(xas, &mapping->i_pages, folio->index);
406 unsigned long flags;
407
408 ASSERT(folio_test_locked(folio));
409 ASSERT(mapping);
410 ASSERT(mapping_use_writeback_tags(mapping));
411
412 xas_lock_irqsave(&xas, flags);
413 xas_load(&xas);
414 xas_clear_mark(&xas, PAGECACHE_TAG_DIRTY);
415 xas_clear_mark(&xas, PAGECACHE_TAG_TOWRITE);
416 xas_unlock_irqrestore(&xas, flags);
417 }
418
419 /*
420 * Extra clear_and_test function for subpage dirty bitmap.
421 *
422 * Return true if we're the last bits in the dirty_bitmap and clear the
423 * dirty_bitmap.
424 * Return false otherwise.
425 *
426 * NOTE: Callers should manually clear page dirty for true case, as we have
427 * extra handling for tree blocks.
428 */
btrfs_subpage_clear_and_test_dirty(const struct btrfs_fs_info * fs_info,struct folio * folio,u64 start,u32 len)429 bool btrfs_subpage_clear_and_test_dirty(const struct btrfs_fs_info *fs_info,
430 struct folio *folio, u64 start, u32 len)
431 {
432 struct btrfs_folio_state *bfs = folio_get_private(folio);
433 unsigned int start_bit = subpage_calc_start_bit(fs_info, folio,
434 dirty, start, len);
435 unsigned long flags;
436 bool last = false;
437
438 spin_lock_irqsave(&bfs->lock, flags);
439 bitmap_clear(bfs->bitmaps, start_bit, len >> fs_info->sectorsize_bits);
440 if (subpage_test_bitmap_all_zero(fs_info, folio, dirty))
441 last = true;
442 spin_unlock_irqrestore(&bfs->lock, flags);
443 return last;
444 }
445
btrfs_subpage_clear_dirty(const struct btrfs_fs_info * fs_info,struct folio * folio,u64 start,u32 len)446 void btrfs_subpage_clear_dirty(const struct btrfs_fs_info *fs_info,
447 struct folio *folio, u64 start, u32 len)
448 {
449 bool last;
450
451 last = btrfs_subpage_clear_and_test_dirty(fs_info, folio, start, len);
452 if (last)
453 folio_clear_dirty_for_io(folio);
454 }
455
btrfs_subpage_set_writeback(const struct btrfs_fs_info * fs_info,struct folio * folio,u64 start,u32 len)456 void btrfs_subpage_set_writeback(const struct btrfs_fs_info *fs_info,
457 struct folio *folio, u64 start, u32 len)
458 {
459 struct btrfs_folio_state *bfs = folio_get_private(folio);
460 unsigned int start_bit = subpage_calc_start_bit(fs_info, folio,
461 writeback, start, len);
462 unsigned long flags;
463
464 spin_lock_irqsave(&bfs->lock, flags);
465 bitmap_set(bfs->bitmaps, start_bit, len >> fs_info->sectorsize_bits);
466
467 /*
468 * Don't clear the TOWRITE tag when starting writeback on a still-dirty
469 * folio. Doing so can cause WB_SYNC_ALL writepages() to overlook it,
470 * assume writeback is complete, and exit too early — violating sync
471 * ordering guarantees.
472 *
473 * Instead we manually clear the DIRTY and TOWRITE tags after the folio
474 * is no longer dirty.
475 */
476 if (!folio_test_writeback(folio))
477 __folio_start_writeback(folio, true);
478 if (!folio_test_dirty(folio))
479 folio_clear_tags(folio);
480 spin_unlock_irqrestore(&bfs->lock, flags);
481 }
482
btrfs_subpage_clear_writeback(const struct btrfs_fs_info * fs_info,struct folio * folio,u64 start,u32 len)483 void btrfs_subpage_clear_writeback(const struct btrfs_fs_info *fs_info,
484 struct folio *folio, u64 start, u32 len)
485 {
486 struct btrfs_folio_state *bfs = folio_get_private(folio);
487 unsigned int start_bit = subpage_calc_start_bit(fs_info, folio,
488 writeback, start, len);
489 unsigned long flags;
490
491 spin_lock_irqsave(&bfs->lock, flags);
492 bitmap_clear(bfs->bitmaps, start_bit, len >> fs_info->sectorsize_bits);
493 if (subpage_test_bitmap_all_zero(fs_info, folio, writeback)) {
494 ASSERT(folio_test_writeback(folio));
495 folio_end_writeback(folio);
496 }
497 spin_unlock_irqrestore(&bfs->lock, flags);
498 }
499
btrfs_subpage_clear_fixup(const struct btrfs_fs_info * fs_info,struct folio * folio,u64 start,u32 len)500 void btrfs_subpage_clear_fixup(const struct btrfs_fs_info *fs_info,
501 struct folio *folio, u64 start, u32 len)
502 {
503 struct btrfs_folio_state *bfs = folio_get_private(folio);
504 unsigned int start_bit = subpage_calc_start_bit(fs_info, folio,
505 fixup, start, len);
506 unsigned long flags;
507
508 spin_lock_irqsave(&bfs->lock, flags);
509 bitmap_clear(bfs->bitmaps, start_bit, len >> fs_info->sectorsize_bits);
510 if (subpage_test_bitmap_all_zero(fs_info, folio, fixup))
511 folio_clear_fixup_pending(folio);
512 spin_unlock_irqrestore(&bfs->lock, flags);
513 }
514
515 /*
516 * In one pass under bfs->lock, mark every block with a clear dirty bit in the
517 * range both dirty and needing fixup.
518 *
519 * Only called from the dirty_folio callback, which owns the folio-level
520 * dirty flag; calling folio_mark_dirty() here would recurse.
521 *
522 * The folio fixup flag and bits are both set under bfs->lock so that a
523 * writeback pass observing the new bits also observes the flag.
524 */
btrfs_subpage_set_fixup_dirty(const struct btrfs_fs_info * fs_info,struct folio * folio,u64 start,u32 len)525 static void btrfs_subpage_set_fixup_dirty(const struct btrfs_fs_info *fs_info,
526 struct folio *folio, u64 start, u32 len)
527 {
528 struct btrfs_folio_state *bfs = folio_get_private(folio);
529 unsigned int dirty_bit = subpage_calc_start_bit(fs_info, folio,
530 dirty, start, len);
531 unsigned int fixup_bit = subpage_calc_start_bit(fs_info, folio,
532 fixup, start, len);
533 const unsigned int nbits = len >> fs_info->sectorsize_bits;
534 unsigned long flags;
535 bool marked = false;
536
537 spin_lock_irqsave(&bfs->lock, flags);
538 for (unsigned int i = 0; i < nbits; i++) {
539 if (test_bit(dirty_bit + i, bfs->bitmaps))
540 continue;
541 set_bit(dirty_bit + i, bfs->bitmaps);
542 set_bit(fixup_bit + i, bfs->bitmaps);
543 marked = true;
544 }
545 if (marked)
546 folio_set_fixup_pending(folio);
547 spin_unlock_irqrestore(&bfs->lock, flags);
548 }
549
550 /*
551 * Mark the still-clean blocks of a folio dirty and needing fixup, for
552 * btrfs_data_dirty_folio().
553 *
554 * A subpage block size folio that is not uptodate is left alone: its clean
555 * blocks may hold content that was never read in, which must not be marked
556 * dirty.
557 */
btrfs_folio_set_fixup_dirty(const struct btrfs_fs_info * fs_info,struct folio * folio,u64 start,u32 len)558 void btrfs_folio_set_fixup_dirty(const struct btrfs_fs_info *fs_info,
559 struct folio *folio, u64 start, u32 len)
560 {
561 if (!btrfs_is_subpage(fs_info, folio)) {
562 if (!folio_test_dirty(folio))
563 folio_set_fixup_pending(folio);
564 return;
565 }
566 if (!folio_test_uptodate(folio))
567 return;
568 btrfs_subpage_set_fixup_dirty(fs_info, folio, start, len);
569 }
570
571 /*
572 * Drop the fixup blocks inside the range: clear both their fixup and dirty
573 * bits.
574 *
575 * Fixup blocks carry no space reservation, so their fixup and dirty bits
576 * must be dropped together. Clearing only the fixup bit would leave a
577 * dirty block without a reservation which is not a valid state.
578 *
579 * Returns true if the folio has no dirty blocks left.
580 */
btrfs_subpage_clear_fixup_dirty(const struct btrfs_fs_info * fs_info,struct folio * folio,u64 start,u32 len)581 static bool btrfs_subpage_clear_fixup_dirty(const struct btrfs_fs_info *fs_info,
582 struct folio *folio, u64 start, u32 len)
583 {
584 struct btrfs_folio_state *bfs = folio_get_private(folio);
585 unsigned int dirty_bit = subpage_calc_start_bit(fs_info, folio,
586 dirty, start, len);
587 unsigned int fixup_bit = subpage_calc_start_bit(fs_info, folio,
588 fixup, start, len);
589 const unsigned int nbits = len >> fs_info->sectorsize_bits;
590 unsigned long flags;
591 bool last;
592
593 spin_lock_irqsave(&bfs->lock, flags);
594 for (unsigned int i = 0; i < nbits; i++) {
595 if (!test_bit(fixup_bit + i, bfs->bitmaps))
596 continue;
597 clear_bit(fixup_bit + i, bfs->bitmaps);
598 clear_bit(dirty_bit + i, bfs->bitmaps);
599 }
600 if (subpage_test_bitmap_all_zero(fs_info, folio, fixup))
601 folio_clear_fixup_pending(folio);
602 last = subpage_test_bitmap_all_zero(fs_info, folio, dirty);
603 spin_unlock_irqrestore(&bfs->lock, flags);
604 return last;
605 }
606
607 /*
608 * Drop the fixup blocks inside the range, for callers discarding their data:
609 * btrfs_invalidate_folio() and the writepage fixup worker's error path.
610 *
611 * Callers that have just reserved space for a block want
612 * btrfs_folio_clear_fixup() instead - there the block stays dirty and gets
613 * written.
614 *
615 * The range can be byte-granular (an unaligned truncate through
616 * btrfs_invalidate_folio()); only blocks fully inside it are dropped, as a
617 * partially covered block still holds live data outside the range. For
618 * single-block folios the folio flag is the fixup state, so it is dropped
619 * only when the range covers the whole folio.
620 */
btrfs_folio_clear_fixup_dirty(const struct btrfs_fs_info * fs_info,struct folio * folio,u64 start,u32 len)621 void btrfs_folio_clear_fixup_dirty(const struct btrfs_fs_info *fs_info,
622 struct folio *folio, u64 start, u32 len)
623 {
624 u64 aligned_start;
625 u64 aligned_end;
626
627 /* The folio flag is set whenever any fixup bitmap bit is. */
628 if (!folio_test_fixup_pending(folio))
629 return;
630 if (!btrfs_is_subpage(fs_info, folio)) {
631 if (start <= folio_pos(folio) &&
632 start + len >= folio_next_pos(folio)) {
633 folio_clear_fixup_pending(folio);
634 folio_clear_dirty_for_io(folio);
635 }
636 return;
637 }
638 btrfs_subpage_clamp_range(folio, &start, &len);
639 aligned_start = round_up(start, fs_info->sectorsize);
640 aligned_end = round_down(start + len, fs_info->sectorsize);
641 if (aligned_end <= aligned_start)
642 return;
643 if (btrfs_subpage_clear_fixup_dirty(fs_info, folio, aligned_start,
644 aligned_end - aligned_start))
645 folio_clear_dirty_for_io(folio);
646 }
647
btrfs_folio_test_fixup(const struct btrfs_fs_info * fs_info,struct folio * folio,u64 start,u32 len)648 bool btrfs_folio_test_fixup(const struct btrfs_fs_info *fs_info,
649 struct folio *folio, u64 start, u32 len)
650 {
651 if (!btrfs_is_subpage(fs_info, folio))
652 return folio_test_fixup_pending(folio);
653 return btrfs_subpage_test_fixup(fs_info, folio, start, len);
654 }
655
btrfs_folio_clear_fixup(const struct btrfs_fs_info * fs_info,struct folio * folio,u64 start,u32 len)656 void btrfs_folio_clear_fixup(const struct btrfs_fs_info *fs_info,
657 struct folio *folio, u64 start, u32 len)
658 {
659 if (!btrfs_is_subpage(fs_info, folio)) {
660 folio_clear_fixup_pending(folio);
661 return;
662 }
663 btrfs_subpage_clear_fixup(fs_info, folio, start, len);
664 }
665
666 /*
667 * Unlike set/clear which is dependent on each page status, for test all bits
668 * are tested in the same way.
669 */
670 #define IMPLEMENT_BTRFS_SUBPAGE_TEST_OP(name) \
671 bool btrfs_subpage_test_##name(const struct btrfs_fs_info *fs_info, \
672 struct folio *folio, u64 start, u32 len) \
673 { \
674 struct btrfs_folio_state *bfs = folio_get_private(folio); \
675 unsigned int start_bit = subpage_calc_start_bit(fs_info, folio, \
676 name, start, len); \
677 unsigned long flags; \
678 bool ret; \
679 \
680 spin_lock_irqsave(&bfs->lock, flags); \
681 ret = bitmap_test_range_all_set(bfs->bitmaps, start_bit, \
682 len >> fs_info->sectorsize_bits); \
683 spin_unlock_irqrestore(&bfs->lock, flags); \
684 return ret; \
685 }
686 IMPLEMENT_BTRFS_SUBPAGE_TEST_OP(uptodate);
687 IMPLEMENT_BTRFS_SUBPAGE_TEST_OP(dirty);
688 IMPLEMENT_BTRFS_SUBPAGE_TEST_OP(writeback);
689 IMPLEMENT_BTRFS_SUBPAGE_TEST_OP(fixup);
690
691 /*
692 * Note that, in selftests (extent-io-tests), we can have empty fs_info passed
693 * in. We only test sectorsize == PAGE_SIZE cases so far, thus we can fall
694 * back to regular sectorsize branch.
695 */
696 #define IMPLEMENT_BTRFS_PAGE_OPS(name, folio_set_func, \
697 folio_clear_func, folio_test_func) \
698 void btrfs_folio_set_##name(const struct btrfs_fs_info *fs_info, \
699 struct folio *folio, u64 start, u32 len) \
700 { \
701 if (unlikely(!fs_info) || \
702 !btrfs_is_subpage(fs_info, folio)) { \
703 folio_set_func(folio); \
704 return; \
705 } \
706 btrfs_subpage_set_##name(fs_info, folio, start, len); \
707 } \
708 void btrfs_folio_clear_##name(const struct btrfs_fs_info *fs_info, \
709 struct folio *folio, u64 start, u32 len) \
710 { \
711 if (unlikely(!fs_info) || \
712 !btrfs_is_subpage(fs_info, folio)) { \
713 folio_clear_func(folio); \
714 return; \
715 } \
716 btrfs_subpage_clear_##name(fs_info, folio, start, len); \
717 } \
718 bool btrfs_folio_test_##name(const struct btrfs_fs_info *fs_info, \
719 struct folio *folio, u64 start, u32 len) \
720 { \
721 if (unlikely(!fs_info) || \
722 !btrfs_is_subpage(fs_info, folio)) \
723 return folio_test_func(folio); \
724 return btrfs_subpage_test_##name(fs_info, folio, start, len); \
725 } \
726 void btrfs_folio_clamp_set_##name(const struct btrfs_fs_info *fs_info, \
727 struct folio *folio, u64 start, u32 len) \
728 { \
729 if (unlikely(!fs_info) || \
730 !btrfs_is_subpage(fs_info, folio)) { \
731 folio_set_func(folio); \
732 return; \
733 } \
734 btrfs_subpage_clamp_range(folio, &start, &len); \
735 btrfs_subpage_set_##name(fs_info, folio, start, len); \
736 } \
737 void btrfs_folio_clamp_clear_##name(const struct btrfs_fs_info *fs_info, \
738 struct folio *folio, u64 start, u32 len) \
739 { \
740 if (unlikely(!fs_info) || \
741 !btrfs_is_subpage(fs_info, folio)) { \
742 folio_clear_func(folio); \
743 return; \
744 } \
745 btrfs_subpage_clamp_range(folio, &start, &len); \
746 btrfs_subpage_clear_##name(fs_info, folio, start, len); \
747 } \
748 bool btrfs_folio_clamp_test_##name(const struct btrfs_fs_info *fs_info, \
749 struct folio *folio, u64 start, u32 len) \
750 { \
751 if (unlikely(!fs_info) || \
752 !btrfs_is_subpage(fs_info, folio)) \
753 return folio_test_func(folio); \
754 btrfs_subpage_clamp_range(folio, &start, &len); \
755 return btrfs_subpage_test_##name(fs_info, folio, start, len); \
756 } \
757 void btrfs_meta_folio_set_##name(struct folio *folio, const struct extent_buffer *eb) \
758 { \
759 if (!btrfs_meta_is_subpage(eb->fs_info)) { \
760 folio_set_func(folio); \
761 return; \
762 } \
763 btrfs_subpage_set_##name(eb->fs_info, folio, eb->start, eb->len); \
764 } \
765 void btrfs_meta_folio_clear_##name(struct folio *folio, const struct extent_buffer *eb) \
766 { \
767 if (!btrfs_meta_is_subpage(eb->fs_info)) { \
768 folio_clear_func(folio); \
769 return; \
770 } \
771 btrfs_subpage_clear_##name(eb->fs_info, folio, eb->start, eb->len); \
772 } \
773 bool btrfs_meta_folio_test_##name(struct folio *folio, const struct extent_buffer *eb) \
774 { \
775 if (!btrfs_meta_is_subpage(eb->fs_info)) \
776 return folio_test_func(folio); \
777 return btrfs_subpage_test_##name(eb->fs_info, folio, eb->start, eb->len); \
778 }
779 IMPLEMENT_BTRFS_PAGE_OPS(uptodate, folio_mark_uptodate, folio_clear_uptodate,
780 folio_test_uptodate);
781 IMPLEMENT_BTRFS_PAGE_OPS(dirty, btrfs_folio_mark_dirty_reserved,
782 folio_clear_dirty_for_io, folio_test_dirty);
783 IMPLEMENT_BTRFS_PAGE_OPS(writeback, folio_start_writeback, folio_end_writeback,
784 folio_test_writeback);
785
786 #define DEFINE_GET_SUBPAGE_BITMAP(name) \
787 static inline unsigned long get_bitmap_value_##name( \
788 const struct btrfs_fs_info *fs_info, \
789 struct folio *folio) \
790 { \
791 const unsigned int __bpf = btrfs_blocks_per_folio(fs_info, folio); \
792 const struct btrfs_folio_state *__bfs = folio_get_private(folio); \
793 unsigned long value; \
794 \
795 ASSERT(__bpf <= BITS_PER_LONG); \
796 value = bitmap_read(__bfs->bitmaps, __bpf * btrfs_bitmap_nr_##name, \
797 __bpf); \
798 return value; \
799 } \
800 static inline const unsigned long *get_bitmap_pointer_##name( \
801 const struct btrfs_fs_info *fs_info, \
802 struct folio *folio) \
803 { \
804 const unsigned int __bpf = btrfs_blocks_per_folio(fs_info, folio); \
805 struct btrfs_folio_state *__bfs = folio_get_private(folio); \
806 unsigned long *pointer; \
807 \
808 ASSERT(__bpf >= BITS_PER_LONG); \
809 ASSERT(IS_ALIGNED(__bpf, BITS_PER_LONG)); \
810 pointer = __bfs->bitmaps + (BIT_WORD(__bpf) * btrfs_bitmap_nr_##name); \
811 return pointer; \
812 }
813
814 DEFINE_GET_SUBPAGE_BITMAP(uptodate);
815 DEFINE_GET_SUBPAGE_BITMAP(dirty);
816 DEFINE_GET_SUBPAGE_BITMAP(writeback);
817
818 #define SUBPAGE_DUMP_BITMAP(fs_info, folio, name, start, len) \
819 { \
820 const unsigned int __bpf = btrfs_blocks_per_folio(fs_info, folio); \
821 \
822 if (__bpf <= BITS_PER_LONG) { \
823 unsigned long bitmap = get_bitmap_value_##name(fs_info, folio); \
824 \
825 btrfs_warn(fs_info, \
826 "dumping bitmap start=%llu len=%u folio=%llu " #name "_bitmap=%*pbl", \
827 start, len, folio_pos(folio), __bpf, &bitmap); \
828 } else { \
829 btrfs_warn(fs_info, \
830 "dumping bitmap start=%llu len=%u folio=%llu " #name "_bitmap=%*pbl", \
831 start, len, folio_pos(folio), __bpf, \
832 get_bitmap_pointer_##name(fs_info, folio)); \
833 } \
834 }
835
836 /*
837 * Make sure not only the page dirty bit is cleared, but also subpage dirty bit
838 * is cleared.
839 */
btrfs_folio_assert_not_dirty(const struct btrfs_fs_info * fs_info,struct folio * folio,u64 start,u32 len)840 void btrfs_folio_assert_not_dirty(const struct btrfs_fs_info *fs_info,
841 struct folio *folio, u64 start, u32 len)
842 {
843 struct btrfs_folio_state *bfs;
844 unsigned int start_bit;
845 unsigned int nbits;
846 unsigned long flags;
847
848 if (!IS_ENABLED(CONFIG_BTRFS_ASSERT))
849 return;
850
851 if (!btrfs_is_subpage(fs_info, folio)) {
852 ASSERT(!folio_test_dirty(folio));
853 return;
854 }
855
856 start_bit = subpage_calc_start_bit(fs_info, folio, dirty, start, len);
857 nbits = len >> fs_info->sectorsize_bits;
858 bfs = folio_get_private(folio);
859 ASSERT(bfs);
860 spin_lock_irqsave(&bfs->lock, flags);
861 if (unlikely(!bitmap_test_range_all_zero(bfs->bitmaps, start_bit, nbits))) {
862 SUBPAGE_DUMP_BITMAP(fs_info, folio, dirty, start, len);
863 ASSERT(bitmap_test_range_all_zero(bfs->bitmaps, start_bit, nbits));
864 }
865 ASSERT(bitmap_test_range_all_zero(bfs->bitmaps, start_bit, nbits));
866 spin_unlock_irqrestore(&bfs->lock, flags);
867 }
868
869 /*
870 * This is for folio already locked by plain lock_page()/folio_lock(), which
871 * doesn't have any subpage awareness.
872 *
873 * This populates the involved subpage ranges so that subpage helpers can
874 * properly unlock them.
875 */
btrfs_folio_set_lock(const struct btrfs_fs_info * fs_info,struct folio * folio,u64 start,u32 len)876 void btrfs_folio_set_lock(const struct btrfs_fs_info *fs_info,
877 struct folio *folio, u64 start, u32 len)
878 {
879 struct btrfs_folio_state *bfs;
880 unsigned long flags;
881 unsigned int nbits;
882 int ret;
883
884 ASSERT(folio_test_locked(folio));
885 if (unlikely(!fs_info) || !btrfs_is_subpage(fs_info, folio))
886 return;
887
888 bfs = folio_get_private(folio);
889 nbits = len >> fs_info->sectorsize_bits;
890 spin_lock_irqsave(&bfs->lock, flags);
891 ret = atomic_add_return(nbits, &bfs->nr_locked);
892 ASSERT(ret <= btrfs_blocks_per_folio(fs_info, folio));
893 spin_unlock_irqrestore(&bfs->lock, flags);
894 }
895
896 /*
897 * Clear the dirty flag for the folio.
898 *
899 * If the affected folio is no longer dirty, return true. Otherwise return false.
900 */
btrfs_meta_folio_clear_and_test_dirty(struct folio * folio,const struct extent_buffer * eb)901 bool btrfs_meta_folio_clear_and_test_dirty(struct folio *folio, const struct extent_buffer *eb)
902 {
903 bool last;
904
905 if (!btrfs_meta_is_subpage(eb->fs_info)) {
906 folio_clear_dirty_for_io(folio);
907 return true;
908 }
909
910 last = btrfs_subpage_clear_and_test_dirty(eb->fs_info, folio, eb->start, eb->len);
911 if (last) {
912 folio_clear_dirty_for_io(folio);
913 return true;
914 }
915 return false;
916 }
917
btrfs_subpage_dump_bitmap(const struct btrfs_fs_info * fs_info,struct folio * folio,u64 start,u32 len)918 void __cold btrfs_subpage_dump_bitmap(const struct btrfs_fs_info *fs_info,
919 struct folio *folio, u64 start, u32 len)
920 {
921 struct btrfs_folio_state *bfs;
922 const unsigned int blocks_per_folio = btrfs_blocks_per_folio(fs_info, folio);
923 unsigned long flags;
924
925 ASSERT(folio_test_private(folio) && folio_get_private(folio));
926 ASSERT(blocks_per_folio > 1);
927 bfs = folio_get_private(folio);
928
929 dump_page(folio_page(folio, 0), "btrfs folio state dump");
930
931 if (blocks_per_folio <= BITS_PER_LONG) {
932 unsigned long uptodate;
933 unsigned long dirty;
934 unsigned long writeback;
935
936 spin_lock_irqsave(&bfs->lock, flags);
937 uptodate = get_bitmap_value_uptodate(fs_info, folio);
938 dirty = get_bitmap_value_dirty(fs_info, folio);
939 writeback = get_bitmap_value_writeback(fs_info, folio);
940
941 spin_unlock_irqrestore(&bfs->lock, flags);
942
943 btrfs_warn(fs_info,
944 "start=%llu len=%u page=%llu, bitmaps uptodate=%*pbl dirty=%*pbl writeback=%*pbl",
945 start, len, folio_pos(folio),
946 blocks_per_folio, &uptodate,
947 blocks_per_folio, &dirty,
948 blocks_per_folio, &writeback);
949 return;
950 }
951
952 spin_lock_irqsave(&bfs->lock, flags);
953 btrfs_warn(fs_info,
954 "start=%llu len=%u page=%llu, bitmaps uptodate=%*pbl dirty=%*pbl writeback=%*pbl",
955 start, len, folio_pos(folio),
956 blocks_per_folio, get_bitmap_pointer_uptodate(fs_info, folio),
957 blocks_per_folio, get_bitmap_pointer_dirty(fs_info, folio),
958 blocks_per_folio, get_bitmap_pointer_writeback(fs_info, folio));
959 spin_unlock_irqrestore(&bfs->lock, flags);
960 }
961
btrfs_copy_subpage_dirty_bitmap(struct btrfs_fs_info * fs_info,struct folio * folio,unsigned long * dst)962 void btrfs_copy_subpage_dirty_bitmap(struct btrfs_fs_info *fs_info,
963 struct folio *folio,
964 unsigned long *dst)
965 {
966 struct btrfs_folio_state *bfs;
967 const unsigned int blocks_per_folio = btrfs_blocks_per_folio(fs_info, folio);
968 unsigned long flags;
969 unsigned long value;
970
971 if (blocks_per_folio == 1) {
972 value = 1;
973 bitmap_copy(dst, &value, 1);
974 return;
975 }
976
977 ASSERT(folio_test_private(folio) && folio_get_private(folio));
978 ASSERT(blocks_per_folio > 1);
979 bfs = folio_get_private(folio);
980
981 if (blocks_per_folio <= BITS_PER_LONG) {
982 spin_lock_irqsave(&bfs->lock, flags);
983 value = bitmap_read(bfs->bitmaps, btrfs_bitmap_nr_dirty * blocks_per_folio,
984 blocks_per_folio);
985 spin_unlock_irqrestore(&bfs->lock, flags);
986 bitmap_copy(dst, &value, blocks_per_folio);
987 return;
988 }
989 spin_lock_irqsave(&bfs->lock, flags);
990 bitmap_copy(dst, get_bitmap_pointer_dirty(fs_info, folio),
991 blocks_per_folio);
992 spin_unlock_irqrestore(&bfs->lock, flags);
993 }
994