]> www.infradead.org Git - users/hch/misc.git/commitdiff
btrfs: fix clear_dirty and writeback ordering in submit_one_sector()
authorNaohiro Aota <naohiro.aota@wdc.com>
Fri, 4 Oct 2024 04:53:35 +0000 (13:53 +0900)
committerDavid Sterba <dsterba@suse.com>
Wed, 9 Oct 2024 11:23:51 +0000 (13:23 +0200)
This commit is a replay of commit 6252690f7e1b ("btrfs: fix invalid
mapping of extent xarray state"). We need to call
btrfs_folio_clear_dirty() before btrfs_set_range_writeback(), so that
xarray DIRTY tag is cleared.

With a refactoring commit 8189197425e7 ("btrfs: refactor
__extent_writepage_io() to do sector-by-sector submission"), it screwed
up and the order is reversed and causing the same hang. Fix the ordering
now in submit_one_sector().

Fixes: 8189197425e7 ("btrfs: refactor __extent_writepage_io() to do sector-by-sector submission")
Reviewed-by: Qu Wenruo <wqu@suse.com>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: Naohiro Aota <naohiro.aota@wdc.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/extent_io.c

index 39c9677c47d5a8155d545ec00baf7444d5c6a6df..309a8ae4843454289608d4a683c491caf2701e1a 100644 (file)
@@ -1306,6 +1306,13 @@ static int submit_one_sector(struct btrfs_inode *inode,
        free_extent_map(em);
        em = NULL;
 
+       /*
+        * Although the PageDirty bit is cleared before entering this
+        * function, subpage dirty bit is not cleared.
+        * So clear subpage dirty bit here so next time we won't submit
+        * a folio for a range already written to disk.
+        */
+       btrfs_folio_clear_dirty(fs_info, folio, filepos, sectorsize);
        btrfs_set_range_writeback(inode, filepos, filepos + sectorsize - 1);
        /*
         * Above call should set the whole folio with writeback flag, even
@@ -1315,13 +1322,6 @@ static int submit_one_sector(struct btrfs_inode *inode,
         */
        ASSERT(folio_test_writeback(folio));
 
-       /*
-        * Although the PageDirty bit is cleared before entering this
-        * function, subpage dirty bit is not cleared.
-        * So clear subpage dirty bit here so next time we won't submit
-        * folio for range already written to disk.
-        */
-       btrfs_folio_clear_dirty(fs_info, folio, filepos, sectorsize);
        submit_extent_folio(bio_ctrl, disk_bytenr, folio,
                            sectorsize, filepos - folio_pos(folio));
        return 0;