mirror of
https://github.com/torvalds/linux.git
synced 2026-05-26 08:02:27 +02:00
btrfs: fix clear_dirty and writeback ordering in submit_one_sector()
This commit is a replay of commit6252690f7e("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 commit8189197425("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:8189197425("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>
This commit is contained in:
parent
fe4cd7ed12
commit
e761be2a07
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user