Skip to content

Commit 4bc0a3c

Browse files
josefbacikkdave
authored andcommitted
btrfs: set DIRTY and WRITEBACK tags on the buffer_tree
In preparation for changing how we do writeout of extent buffers, start tagging the extent buffer xarray with DIRTY and WRITEBACK to make it easier to find extent buffers that are in either state. Reviewed-by: Filipe Manana <fdmanana@suse.com> Signed-off-by: Josef Bacik <josef@toxicpanda.com> Signed-off-by: David Sterba <dsterba@suse.com>
1 parent 19d7f65 commit 4bc0a3c

File tree

1 file changed

+37
-0
lines changed

1 file changed

+37
-0
lines changed

fs/btrfs/extent_io.c

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1774,8 +1774,18 @@ static noinline_for_stack bool lock_extent_buffer_for_io(struct extent_buffer *e
17741774
*/
17751775
spin_lock(&eb->refs_lock);
17761776
if (test_and_clear_bit(EXTENT_BUFFER_DIRTY, &eb->bflags)) {
1777+
XA_STATE(xas, &fs_info->buffer_tree, eb->start >> fs_info->sectorsize_bits);
1778+
unsigned long flags;
1779+
17771780
set_bit(EXTENT_BUFFER_WRITEBACK, &eb->bflags);
17781781
spin_unlock(&eb->refs_lock);
1782+
1783+
xas_lock_irqsave(&xas, flags);
1784+
xas_load(&xas);
1785+
xas_set_mark(&xas, PAGECACHE_TAG_WRITEBACK);
1786+
xas_clear_mark(&xas, PAGECACHE_TAG_DIRTY);
1787+
xas_unlock_irqrestore(&xas, flags);
1788+
17791789
btrfs_set_header_flag(eb, BTRFS_HEADER_FLAG_WRITTEN);
17801790
percpu_counter_add_batch(&fs_info->dirty_metadata_bytes,
17811791
-eb->len,
@@ -1861,6 +1871,30 @@ static void set_btree_ioerr(struct extent_buffer *eb)
18611871
}
18621872
}
18631873

1874+
static void buffer_tree_set_mark(const struct extent_buffer *eb, xa_mark_t mark)
1875+
{
1876+
struct btrfs_fs_info *fs_info = eb->fs_info;
1877+
XA_STATE(xas, &fs_info->buffer_tree, eb->start >> fs_info->sectorsize_bits);
1878+
unsigned long flags;
1879+
1880+
xas_lock_irqsave(&xas, flags);
1881+
xas_load(&xas);
1882+
xas_set_mark(&xas, mark);
1883+
xas_unlock_irqrestore(&xas, flags);
1884+
}
1885+
1886+
static void buffer_tree_clear_mark(const struct extent_buffer *eb, xa_mark_t mark)
1887+
{
1888+
struct btrfs_fs_info *fs_info = eb->fs_info;
1889+
XA_STATE(xas, &fs_info->buffer_tree, eb->start >> fs_info->sectorsize_bits);
1890+
unsigned long flags;
1891+
1892+
xas_lock_irqsave(&xas, flags);
1893+
xas_load(&xas);
1894+
xas_clear_mark(&xas, mark);
1895+
xas_unlock_irqrestore(&xas, flags);
1896+
}
1897+
18641898
/*
18651899
* The endio specific version which won't touch any unsafe spinlock in endio
18661900
* context.
@@ -1891,6 +1925,7 @@ static void end_bbio_meta_write(struct btrfs_bio *bbio)
18911925
btrfs_meta_folio_clear_writeback(fi.folio, eb);
18921926
}
18931927

1928+
buffer_tree_clear_mark(eb, PAGECACHE_TAG_WRITEBACK);
18941929
clear_bit(EXTENT_BUFFER_WRITEBACK, &eb->bflags);
18951930
smp_mb__after_atomic();
18961931
wake_up_bit(&eb->bflags, EXTENT_BUFFER_WRITEBACK);
@@ -3513,6 +3548,7 @@ void btrfs_clear_buffer_dirty(struct btrfs_trans_handle *trans,
35133548
if (!test_and_clear_bit(EXTENT_BUFFER_DIRTY, &eb->bflags))
35143549
return;
35153550

3551+
buffer_tree_clear_mark(eb, PAGECACHE_TAG_DIRTY);
35163552
percpu_counter_add_batch(&fs_info->dirty_metadata_bytes, -eb->len,
35173553
fs_info->dirty_metadata_batch);
35183554

@@ -3561,6 +3597,7 @@ void set_extent_buffer_dirty(struct extent_buffer *eb)
35613597
folio_lock(eb->folios[0]);
35623598
for (int i = 0; i < num_extent_folios(eb); i++)
35633599
btrfs_meta_folio_set_dirty(eb->folios[i], eb);
3600+
buffer_tree_set_mark(eb, PAGECACHE_TAG_DIRTY);
35643601
if (subpage)
35653602
folio_unlock(eb->folios[0]);
35663603
percpu_counter_add_batch(&eb->fs_info->dirty_metadata_bytes,

0 commit comments

Comments
 (0)