Lines Matching full:page

13  * - Only support 64K page size for now
14 * This is to make metadata handling easier, as 64K page would ensure
15 * all nodesize would fit inside one page, thus we don't need to handle
21 * - Metadata can't cross 64K page boundary
31 * needed range, other unrelated range in the same page will not be touched.
34 * The writeback is still for the full page, but we will only submit
35 * the dirty extent buffers in the page.
37 * This means, if we have a metadata page like this:
39 * Page offset
53 * record the status of each sector inside a page. This provides the extra
57 * Since we have multiple tree blocks inside one page, we can't rely on page
60 * the same page).
67 struct page *page, enum btrfs_subpage_type type) in btrfs_attach_subpage() argument
73 * We have cases like a dummy extent buffer page, which is not mappped in btrfs_attach_subpage()
76 if (page->mapping) in btrfs_attach_subpage()
77 ASSERT(PageLocked(page)); in btrfs_attach_subpage()
78 /* Either not subpage, or the page already has private attached */ in btrfs_attach_subpage()
79 if (fs_info->sectorsize == PAGE_SIZE || PagePrivate(page)) in btrfs_attach_subpage()
85 attach_page_private(page, subpage); in btrfs_attach_subpage()
90 struct page *page) in btrfs_detach_subpage() argument
95 if (fs_info->sectorsize == PAGE_SIZE || !PagePrivate(page)) in btrfs_detach_subpage()
98 subpage = (struct btrfs_subpage *)detach_page_private(page); in btrfs_detach_subpage()
132 * of the same page.
134 * detach_extent_buffer_page() won't detach the page private while we're still
138 struct page *page) in btrfs_page_inc_eb_refs() argument
145 ASSERT(PagePrivate(page) && page->mapping); in btrfs_page_inc_eb_refs()
146 lockdep_assert_held(&page->mapping->private_lock); in btrfs_page_inc_eb_refs()
148 subpage = (struct btrfs_subpage *)page->private; in btrfs_page_inc_eb_refs()
153 struct page *page) in btrfs_page_dec_eb_refs() argument
160 ASSERT(PagePrivate(page) && page->mapping); in btrfs_page_dec_eb_refs()
161 lockdep_assert_held(&page->mapping->private_lock); in btrfs_page_dec_eb_refs()
163 subpage = (struct btrfs_subpage *)page->private; in btrfs_page_dec_eb_refs()
169 struct page *page, u64 start, u32 len) in btrfs_subpage_assert() argument
172 ASSERT(PagePrivate(page) && page->private); in btrfs_subpage_assert()
176 * The range check only works for mapped page, we can still have in btrfs_subpage_assert()
177 * unmapped page like dummy extent buffer pages. in btrfs_subpage_assert()
179 if (page->mapping) in btrfs_subpage_assert()
180 ASSERT(page_offset(page) <= start && in btrfs_subpage_assert()
181 start + len <= page_offset(page) + PAGE_SIZE); in btrfs_subpage_assert()
185 struct page *page, u64 start, u32 len) in btrfs_subpage_start_reader() argument
187 struct btrfs_subpage *subpage = (struct btrfs_subpage *)page->private; in btrfs_subpage_start_reader()
190 btrfs_subpage_assert(fs_info, page, start, len); in btrfs_subpage_start_reader()
196 struct page *page, u64 start, u32 len) in btrfs_subpage_end_reader() argument
198 struct btrfs_subpage *subpage = (struct btrfs_subpage *)page->private; in btrfs_subpage_end_reader()
203 btrfs_subpage_assert(fs_info, page, start, len); in btrfs_subpage_end_reader()
204 is_data = is_data_inode(page->mapping->host); in btrfs_subpage_end_reader()
209 * For data we need to unlock the page if the last read has finished. in btrfs_subpage_end_reader()
216 unlock_page(page); in btrfs_subpage_end_reader()
219 static void btrfs_subpage_clamp_range(struct page *page, u64 *start, u32 *len) in btrfs_subpage_clamp_range() argument
224 *start = max_t(u64, page_offset(page), orig_start); in btrfs_subpage_clamp_range()
225 *len = min_t(u64, page_offset(page) + PAGE_SIZE, in btrfs_subpage_clamp_range()
230 struct page *page, u64 start, u32 len) in btrfs_subpage_start_writer() argument
232 struct btrfs_subpage *subpage = (struct btrfs_subpage *)page->private; in btrfs_subpage_start_writer()
236 btrfs_subpage_assert(fs_info, page, start, len); in btrfs_subpage_start_writer()
244 struct page *page, u64 start, u32 len) in btrfs_subpage_end_and_test_writer() argument
246 struct btrfs_subpage *subpage = (struct btrfs_subpage *)page->private; in btrfs_subpage_end_and_test_writer()
249 btrfs_subpage_assert(fs_info, page, start, len); in btrfs_subpage_end_and_test_writer()
256 * Lock a page for delalloc page writeback.
258 * Return -EAGAIN if the page is not properly initialized.
259 * Return 0 with the page locked, and writer counter updated.
261 * Even with 0 returned, the page still need extra check to make sure
262 * it's really the correct page, as the caller is using
263 * find_get_pages_contig(), which can race with page invalidating.
266 struct page *page, u64 start, u32 len) in btrfs_page_start_writer_lock() argument
269 lock_page(page); in btrfs_page_start_writer_lock()
272 lock_page(page); in btrfs_page_start_writer_lock()
273 if (!PagePrivate(page) || !page->private) { in btrfs_page_start_writer_lock()
274 unlock_page(page); in btrfs_page_start_writer_lock()
277 btrfs_subpage_clamp_range(page, &start, &len); in btrfs_page_start_writer_lock()
278 btrfs_subpage_start_writer(fs_info, page, start, len); in btrfs_page_start_writer_lock()
283 struct page *page, u64 start, u32 len) in btrfs_page_end_writer_lock() argument
286 return unlock_page(page); in btrfs_page_end_writer_lock()
287 btrfs_subpage_clamp_range(page, &start, &len); in btrfs_page_end_writer_lock()
288 if (btrfs_subpage_end_and_test_writer(fs_info, page, start, len)) in btrfs_page_end_writer_lock()
289 unlock_page(page); in btrfs_page_end_writer_lock()
298 struct page *page, u64 start, u32 len) in btrfs_subpage_calc_bitmap() argument
303 btrfs_subpage_assert(fs_info, page, start, len); in btrfs_subpage_calc_bitmap()
314 struct page *page, u64 start, u32 len) in btrfs_subpage_set_uptodate() argument
316 struct btrfs_subpage *subpage = (struct btrfs_subpage *)page->private; in btrfs_subpage_set_uptodate()
317 const u16 tmp = btrfs_subpage_calc_bitmap(fs_info, page, start, len); in btrfs_subpage_set_uptodate()
323 SetPageUptodate(page); in btrfs_subpage_set_uptodate()
328 struct page *page, u64 start, u32 len) in btrfs_subpage_clear_uptodate() argument
330 struct btrfs_subpage *subpage = (struct btrfs_subpage *)page->private; in btrfs_subpage_clear_uptodate()
331 const u16 tmp = btrfs_subpage_calc_bitmap(fs_info, page, start, len); in btrfs_subpage_clear_uptodate()
336 ClearPageUptodate(page); in btrfs_subpage_clear_uptodate()
341 struct page *page, u64 start, u32 len) in btrfs_subpage_set_error() argument
343 struct btrfs_subpage *subpage = (struct btrfs_subpage *)page->private; in btrfs_subpage_set_error()
344 const u16 tmp = btrfs_subpage_calc_bitmap(fs_info, page, start, len); in btrfs_subpage_set_error()
349 SetPageError(page); in btrfs_subpage_set_error()
354 struct page *page, u64 start, u32 len) in btrfs_subpage_clear_error() argument
356 struct btrfs_subpage *subpage = (struct btrfs_subpage *)page->private; in btrfs_subpage_clear_error()
357 const u16 tmp = btrfs_subpage_calc_bitmap(fs_info, page, start, len); in btrfs_subpage_clear_error()
363 ClearPageError(page); in btrfs_subpage_clear_error()
368 struct page *page, u64 start, u32 len) in btrfs_subpage_set_dirty() argument
370 struct btrfs_subpage *subpage = (struct btrfs_subpage *)page->private; in btrfs_subpage_set_dirty()
371 u16 tmp = btrfs_subpage_calc_bitmap(fs_info, page, start, len); in btrfs_subpage_set_dirty()
377 set_page_dirty(page); in btrfs_subpage_set_dirty()
387 * NOTE: Callers should manually clear page dirty for true case, as we have
391 struct page *page, u64 start, u32 len) in btrfs_subpage_clear_and_test_dirty() argument
393 struct btrfs_subpage *subpage = (struct btrfs_subpage *)page->private; in btrfs_subpage_clear_and_test_dirty()
394 u16 tmp = btrfs_subpage_calc_bitmap(fs_info, page, start, len); in btrfs_subpage_clear_and_test_dirty()
407 struct page *page, u64 start, u32 len) in btrfs_subpage_clear_dirty() argument
411 last = btrfs_subpage_clear_and_test_dirty(fs_info, page, start, len); in btrfs_subpage_clear_dirty()
413 clear_page_dirty_for_io(page); in btrfs_subpage_clear_dirty()
417 struct page *page, u64 start, u32 len) in btrfs_subpage_set_writeback() argument
419 struct btrfs_subpage *subpage = (struct btrfs_subpage *)page->private; in btrfs_subpage_set_writeback()
420 u16 tmp = btrfs_subpage_calc_bitmap(fs_info, page, start, len); in btrfs_subpage_set_writeback()
425 set_page_writeback(page); in btrfs_subpage_set_writeback()
430 struct page *page, u64 start, u32 len) in btrfs_subpage_clear_writeback() argument
432 struct btrfs_subpage *subpage = (struct btrfs_subpage *)page->private; in btrfs_subpage_clear_writeback()
433 u16 tmp = btrfs_subpage_calc_bitmap(fs_info, page, start, len); in btrfs_subpage_clear_writeback()
439 ASSERT(PageWriteback(page)); in btrfs_subpage_clear_writeback()
440 end_page_writeback(page); in btrfs_subpage_clear_writeback()
446 struct page *page, u64 start, u32 len) in btrfs_subpage_set_ordered() argument
448 struct btrfs_subpage *subpage = (struct btrfs_subpage *)page->private; in btrfs_subpage_set_ordered()
449 const u16 tmp = btrfs_subpage_calc_bitmap(fs_info, page, start, len); in btrfs_subpage_set_ordered()
454 SetPageOrdered(page); in btrfs_subpage_set_ordered()
459 struct page *page, u64 start, u32 len) in btrfs_subpage_clear_ordered() argument
461 struct btrfs_subpage *subpage = (struct btrfs_subpage *)page->private; in btrfs_subpage_clear_ordered()
462 const u16 tmp = btrfs_subpage_calc_bitmap(fs_info, page, start, len); in btrfs_subpage_clear_ordered()
468 ClearPageOrdered(page); in btrfs_subpage_clear_ordered()
472 * Unlike set/clear which is dependent on each page status, for test all bits
477 struct page *page, u64 start, u32 len) \
479 struct btrfs_subpage *subpage = (struct btrfs_subpage *)page->private; \
480 const u16 tmp = btrfs_subpage_calc_bitmap(fs_info, page, start, len); \
503 struct page *page, u64 start, u32 len) \
506 set_page_func(page); \
509 btrfs_subpage_set_##name(fs_info, page, start, len); \
512 struct page *page, u64 start, u32 len) \
515 clear_page_func(page); \
518 btrfs_subpage_clear_##name(fs_info, page, start, len); \
521 struct page *page, u64 start, u32 len) \
524 return test_page_func(page); \
525 return btrfs_subpage_test_##name(fs_info, page, start, len); \
528 struct page *page, u64 start, u32 len) \
531 set_page_func(page); \
534 btrfs_subpage_clamp_range(page, &start, &len); \
535 btrfs_subpage_set_##name(fs_info, page, start, len); \
538 struct page *page, u64 start, u32 len) \
541 clear_page_func(page); \
544 btrfs_subpage_clamp_range(page, &start, &len); \
545 btrfs_subpage_clear_##name(fs_info, page, start, len); \
548 struct page *page, u64 start, u32 len) \
551 return test_page_func(page); \
552 btrfs_subpage_clamp_range(page, &start, &len); \
553 return btrfs_subpage_test_##name(fs_info, page, start, len); \
566 * Make sure not only the page dirty bit is cleared, but also subpage dirty bit
570 struct page *page) in btrfs_page_assert_not_dirty() argument
572 struct btrfs_subpage *subpage = (struct btrfs_subpage *)page->private; in btrfs_page_assert_not_dirty()
577 ASSERT(!PageDirty(page)); in btrfs_page_assert_not_dirty()
581 ASSERT(PagePrivate(page) && page->private); in btrfs_page_assert_not_dirty()