diff options
author | Jing Xia <jing.xia@unisoc.com> | 2022-05-10 05:35:14 +0300 |
---|---|---|
committer | Jan Kara <jack@suse.cz> | 2022-05-10 13:04:21 +0300 |
commit | 846a3351ddfe4a86eede4bb26a205c3f38ef84d3 (patch) | |
tree | fbf820bad4352c07bd24133d9e8bff82177a8475 /fs/udf/namei.c | |
parent | ceaf69f8eadcafb323392be88e7a5248c415d423 (diff) | |
download | linux-846a3351ddfe4a86eede4bb26a205c3f38ef84d3.tar.xz |
writeback: Avoid skipping inode writeback
We have run into an issue that a task gets stuck in
balance_dirty_pages_ratelimited() when perform I/O stress testing.
The reason we observed is that an I_DIRTY_PAGES inode with lots
of dirty pages is in b_dirty_time list and standard background
writeback cannot writeback the inode.
After studing the relevant code, the following scenario may lead
to the issue:
task1 task2
----- -----
fuse_flush
write_inode_now //in b_dirty_time
writeback_single_inode
__writeback_single_inode
fuse_write_end
filemap_dirty_folio
__xa_set_mark:PAGECACHE_TAG_DIRTY
lock inode->i_lock
if mapping tagged PAGECACHE_TAG_DIRTY
inode->i_state |= I_DIRTY_PAGES
unlock inode->i_lock
__mark_inode_dirty:I_DIRTY_PAGES
lock inode->i_lock
-was dirty,inode stays in
-b_dirty_time
unlock inode->i_lock
if(!(inode->i_state & I_DIRTY_All))
-not true,so nothing done
This patch moves the dirty inode to b_dirty list when the inode
currently is not queued in b_io or b_more_io list at the end of
writeback_single_inode.
Reviewed-by: Jan Kara <jack@suse.cz>
Reviewed-by: Christoph Hellwig <hch@lst.de>
CC: stable@vger.kernel.org
Fixes: 0ae45f63d4ef ("vfs: add support for a lazytime mount option")
Signed-off-by: Jing Xia <jing.xia@unisoc.com>
Signed-off-by: Jan Kara <jack@suse.cz>
Link: https://lore.kernel.org/r/20220510023514.27399-1-jing.xia@unisoc.com
Diffstat (limited to 'fs/udf/namei.c')
0 files changed, 0 insertions, 0 deletions