btrfs: simplify parameters of metadata folio helpers

Unlike folio helpers for date the ones for metadata always take the
extent buffer start and length, so they can be simplified to take the
eb only.  The fs_info can be obtained from eb too so it can be dropped
as parameter.

Added in patch "btrfs: use metadata specific helpers to simplify extent
buffer helpers".

Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
David Sterba
2025-02-25 17:16:48 +01:00
parent 6207687043
commit b7226ce6c4
4 changed files with 27 additions and 46 deletions

View File

@@ -284,8 +284,7 @@ blk_status_t btree_csum_one_bio(struct btrfs_bio *bbio)
if (WARN_ON_ONCE(found_start != eb->start))
return BLK_STS_IOERR;
if (WARN_ON(!btrfs_meta_folio_test_uptodate(fs_info, eb->folios[0],
eb->start, eb->len)))
if (WARN_ON(!btrfs_meta_folio_test_uptodate(eb->folios[0], eb)))
return BLK_STS_IOERR;
ASSERT(memcmp_extent_buffer(eb, fs_info->fs_devices->metadata_uuid,

View File

@@ -1730,16 +1730,13 @@ static struct extent_buffer *find_extent_buffer_nolock(
static void end_bbio_meta_write(struct btrfs_bio *bbio)
{
struct extent_buffer *eb = bbio->private;
struct btrfs_fs_info *fs_info = eb->fs_info;
struct folio_iter fi;
if (bbio->bio.bi_status != BLK_STS_OK)
set_btree_ioerr(eb);
bio_for_each_folio_all(fi, &bbio->bio) {
struct folio *folio = fi.folio;
btrfs_meta_folio_clear_writeback(fs_info, folio, eb->start, eb->len);
btrfs_meta_folio_clear_writeback(fi.folio, eb);
}
clear_bit(EXTENT_BUFFER_WRITEBACK, &eb->bflags);
@@ -1801,8 +1798,8 @@ static noinline_for_stack void write_one_eb(struct extent_buffer *eb,
eb->start + eb->len) - range_start;
folio_lock(folio);
btrfs_meta_folio_clear_dirty(fs_info, folio, eb->start, eb->len);
btrfs_meta_folio_set_writeback(fs_info, folio, eb->start, eb->len);
btrfs_meta_folio_clear_dirty(folio, eb);
btrfs_meta_folio_set_writeback(folio, eb);
if (!folio_test_dirty(folio))
wbc->nr_to_write -= folio_nr_pages(folio);
bio_add_folio_nofail(&bbio->bio, folio, range_len,
@@ -3124,7 +3121,7 @@ struct extent_buffer *alloc_extent_buffer(struct btrfs_fs_info *fs_info,
* and free the allocated page.
*/
folio = eb->folios[i];
WARN_ON(btrfs_meta_folio_test_dirty(fs_info, folio, eb->start, eb->len));
WARN_ON(btrfs_meta_folio_test_dirty(folio, eb));
/*
* Check if the current page is physically contiguous with previous eb
@@ -3135,7 +3132,7 @@ struct extent_buffer *alloc_extent_buffer(struct btrfs_fs_info *fs_info,
if (i && folio_page(eb->folios[i - 1], 0) + 1 != folio_page(folio, 0))
page_contig = false;
if (!btrfs_meta_folio_test_uptodate(fs_info, folio, eb->start, eb->len))
if (!btrfs_meta_folio_test_uptodate(folio, eb))
uptodate = 0;
/*
@@ -3358,8 +3355,7 @@ void btrfs_clear_buffer_dirty(struct btrfs_trans_handle *trans,
if (!folio_test_dirty(folio))
continue;
folio_lock(folio);
last = btrfs_meta_folio_clear_and_test_dirty(fs_info, folio,
eb->start, eb->len);
last = btrfs_meta_folio_clear_and_test_dirty(folio, eb);
if (last)
btree_clear_folio_dirty_tag(folio);
folio_unlock(folio);
@@ -3398,8 +3394,7 @@ void set_extent_buffer_dirty(struct extent_buffer *eb)
if (subpage)
folio_lock(eb->folios[0]);
for (int i = 0; i < num_folios; i++)
btrfs_meta_folio_set_dirty(eb->fs_info, eb->folios[i],
eb->start, eb->len);
btrfs_meta_folio_set_dirty(eb->folios[i], eb);
if (subpage)
folio_unlock(eb->folios[0]);
percpu_counter_add_batch(&eb->fs_info->dirty_metadata_bytes,
@@ -3414,7 +3409,6 @@ void set_extent_buffer_dirty(struct extent_buffer *eb)
void clear_extent_buffer_uptodate(struct extent_buffer *eb)
{
struct btrfs_fs_info *fs_info = eb->fs_info;
int num_folios = num_extent_folios(eb);
clear_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags);
@@ -3424,21 +3418,17 @@ void clear_extent_buffer_uptodate(struct extent_buffer *eb)
if (!folio)
continue;
btrfs_meta_folio_clear_uptodate(fs_info, folio, eb->start, eb->len);
btrfs_meta_folio_clear_uptodate(folio, eb);
}
}
void set_extent_buffer_uptodate(struct extent_buffer *eb)
{
struct btrfs_fs_info *fs_info = eb->fs_info;
int num_folios = num_extent_folios(eb);
set_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags);
for (int i = 0; i < num_folios; i++) {
struct folio *folio = eb->folios[i];
btrfs_meta_folio_set_uptodate(fs_info, folio, eb->start, eb->len);
}
for (int i = 0; i < num_folios; i++)
btrfs_meta_folio_set_uptodate(eb->folios[i], eb);
}
static void clear_extent_buffer_reading(struct extent_buffer *eb)

View File

@@ -627,30 +627,27 @@ bool btrfs_folio_clamp_test_##name(const struct btrfs_fs_info *fs_info, \
btrfs_subpage_clamp_range(folio, &start, &len); \
return btrfs_subpage_test_##name(fs_info, folio, start, len); \
} \
void btrfs_meta_folio_set_##name(const struct btrfs_fs_info *fs_info, \
struct folio *folio, u64 start, u32 len) \
void btrfs_meta_folio_set_##name(struct folio *folio, const struct extent_buffer *eb) \
{ \
if (!btrfs_meta_is_subpage(fs_info)) { \
if (!btrfs_meta_is_subpage(eb->fs_info)) { \
folio_set_func(folio); \
return; \
} \
btrfs_subpage_set_##name(fs_info, folio, start, len); \
btrfs_subpage_set_##name(eb->fs_info, folio, eb->start, eb->len); \
} \
void btrfs_meta_folio_clear_##name(const struct btrfs_fs_info *fs_info, \
struct folio *folio, u64 start, u32 len) \
void btrfs_meta_folio_clear_##name(struct folio *folio, const struct extent_buffer *eb) \
{ \
if (!btrfs_meta_is_subpage(fs_info)) { \
if (!btrfs_meta_is_subpage(eb->fs_info)) { \
folio_clear_func(folio); \
return; \
} \
btrfs_subpage_clear_##name(fs_info, folio, start, len); \
btrfs_subpage_clear_##name(eb->fs_info, folio, eb->start, eb->len); \
} \
bool btrfs_meta_folio_test_##name(const struct btrfs_fs_info *fs_info, \
struct folio *folio, u64 start, u32 len) \
bool btrfs_meta_folio_test_##name(struct folio *folio, const struct extent_buffer *eb) \
{ \
if (!btrfs_meta_is_subpage(fs_info)) \
if (!btrfs_meta_is_subpage(eb->fs_info)) \
return folio_test_func(folio); \
return btrfs_subpage_test_##name(fs_info, folio, start, len); \
return btrfs_subpage_test_##name(eb->fs_info, folio, eb->start, eb->len); \
}
IMPLEMENT_BTRFS_PAGE_OPS(uptodate, folio_mark_uptodate, folio_clear_uptodate,
folio_test_uptodate);
@@ -761,17 +758,16 @@ void btrfs_folio_set_lock(const struct btrfs_fs_info *fs_info,
*
* If the affected folio is no longer dirty, return true. Otherwise return false.
*/
bool btrfs_meta_folio_clear_and_test_dirty(const struct btrfs_fs_info *fs_info,
struct folio *folio, u64 start, u32 len)
bool btrfs_meta_folio_clear_and_test_dirty(struct folio *folio, const struct extent_buffer *eb)
{
bool last;
if (!btrfs_meta_is_subpage(fs_info)) {
if (!btrfs_meta_is_subpage(eb->fs_info)) {
folio_clear_dirty_for_io(folio);
return true;
}
last = btrfs_subpage_clear_and_test_dirty(fs_info, folio, start, len);
last = btrfs_subpage_clear_and_test_dirty(eb->fs_info, folio, eb->start, eb->len);
if (last) {
folio_clear_dirty_for_io(folio);
return true;

View File

@@ -164,12 +164,9 @@ void btrfs_folio_clamp_clear_##name(const struct btrfs_fs_info *fs_info, \
struct folio *folio, u64 start, u32 len); \
bool btrfs_folio_clamp_test_##name(const struct btrfs_fs_info *fs_info, \
struct folio *folio, u64 start, u32 len); \
void btrfs_meta_folio_set_##name(const struct btrfs_fs_info *fs_info, \
struct folio *folio, u64 start, u32 len); \
void btrfs_meta_folio_clear_##name(const struct btrfs_fs_info *fs_info, \
struct folio *folio, u64 start, u32 len); \
bool btrfs_meta_folio_test_##name(const struct btrfs_fs_info *fs_info, \
struct folio *folio, u64 start, u32 len); \
void btrfs_meta_folio_set_##name(struct folio *folio, const struct extent_buffer *eb); \
void btrfs_meta_folio_clear_##name(struct folio *folio, const struct extent_buffer *eb); \
bool btrfs_meta_folio_test_##name(struct folio *folio, const struct extent_buffer *eb);
DECLARE_BTRFS_SUBPAGE_OPS(uptodate);
DECLARE_BTRFS_SUBPAGE_OPS(dirty);
@@ -195,8 +192,7 @@ bool btrfs_subpage_clear_and_test_dirty(const struct btrfs_fs_info *fs_info,
void btrfs_folio_assert_not_dirty(const struct btrfs_fs_info *fs_info,
struct folio *folio, u64 start, u32 len);
bool btrfs_meta_folio_clear_and_test_dirty(const struct btrfs_fs_info *fs_info,
struct folio *folio, u64 start, u32 len);
bool btrfs_meta_folio_clear_and_test_dirty(struct folio *folio, const struct extent_buffer *eb);
void btrfs_get_subpage_dirty_bitmap(struct btrfs_fs_info *fs_info,
struct folio *folio,
unsigned long *ret_bitmap);