xref: /linux/fs/btrfs/subpage.c (revision 50c44fea13ec339d0d457079b254e8c8420d6511)
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