Commit e761be2a authored by Naohiro Aota's avatar Naohiro Aota Committed by David Sterba

btrfs: fix clear_dirty and writeback ordering in submit_one_sector()

This commit is a replay of commit 6252690f ("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 81891974 ("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: 81891974 ("btrfs: refactor __extent_writepage_io() to do sector-by-sector submission")
Reviewed-by: default avatarQu Wenruo <wqu@suse.com>
Reviewed-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: default avatarNaohiro Aota <naohiro.aota@wdc.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent fe4cd7ed
...@@ -1306,6 +1306,13 @@ static int submit_one_sector(struct btrfs_inode *inode, ...@@ -1306,6 +1306,13 @@ static int submit_one_sector(struct btrfs_inode *inode,
free_extent_map(em); free_extent_map(em);
em = NULL; 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); btrfs_set_range_writeback(inode, filepos, filepos + sectorsize - 1);
/* /*
* Above call should set the whole folio with writeback flag, even * Above call should set the whole folio with writeback flag, even
...@@ -1315,13 +1322,6 @@ static int submit_one_sector(struct btrfs_inode *inode, ...@@ -1315,13 +1322,6 @@ static int submit_one_sector(struct btrfs_inode *inode,
*/ */
ASSERT(folio_test_writeback(folio)); 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, submit_extent_folio(bio_ctrl, disk_bytenr, folio,
sectorsize, filepos - folio_pos(folio)); sectorsize, filepos - folio_pos(folio));
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment