@@ -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