kernel_optimize_test/fs/f2fs
Chao Yu 3ef3bc75cd f2fs: fix to avoid potential deadlock
[ Upstream commit 344150999b7fc88502a65bbb147a47503eca2033 ]

Quoted from Jing Xia's report, there is a potential deadlock may happen
between kworker and checkpoint as below:

[T:writeback]				[T:checkpoint]
- wb_writeback
 - blk_start_plug
bio contains NodeA was plugged in writeback threads
					- do_writepages  -- sync write inodeB, inc wb_sync_req[DATA]
					 - f2fs_write_data_pages
					  - f2fs_write_single_data_page -- write last dirty page
					   - f2fs_do_write_data_page
					    - set_page_writeback  -- clear page dirty flag and
					    PAGECACHE_TAG_DIRTY tag in radix tree
					    - f2fs_outplace_write_data
					     - f2fs_update_data_blkaddr
					      - f2fs_wait_on_page_writeback -- wait NodeA to writeback here
					   - inode_dec_dirty_pages
 - writeback_sb_inodes
  - writeback_single_inode
   - do_writepages
    - f2fs_write_data_pages -- skip writepages due to wb_sync_req[DATA]
     - wbc->pages_skipped += get_dirty_pages() -- PAGECACHE_TAG_DIRTY is not set but get_dirty_pages() returns one
  - requeue_inode -- requeue inode to wb->b_dirty queue due to non-zero.pages_skipped
 - blk_finish_plug

Let's try to avoid deadlock condition by forcing unplugging previous bio via
blk_finish_plug(current->plug) once we'v skipped writeback in writepages()
due to valid sbi->wb_sync_req[DATA/NODE].

Fixes: 687de7f101 ("f2fs: avoid IO split due to mixed WB_SYNC_ALL and WB_SYNC_NONE")
Signed-off-by: Zhiguo Niu <zhiguo.niu@unisoc.com>
Signed-off-by: Jing Xia <jing.xia@unisoc.com>
Signed-off-by: Chao Yu <chao@kernel.org>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2022-04-08 14:40:04 +02:00
..
acl.c f2fs: clean up kvfree 2020-09-14 11:15:37 -07:00
acl.h
checkpoint.c f2fs: fix to do sanity check on .cp_pack_total_block_count 2022-04-08 14:39:51 +02:00
compress.c f2fs: compress: fix potential deadlock of compress file 2022-01-27 10:54:31 +01:00
data.c f2fs: fix to avoid potential deadlock 2022-04-08 14:40:04 +02:00
debug.c f2fs: avoid race condition for shrinker count 2021-01-06 14:56:54 +01:00
dir.c f2fs: reduce the scope of setting fsck tag when de->name_len is zero 2021-09-18 13:40:13 +02:00
extent_cache.c f2fs: support 64-bits key in f2fs rb-tree node entry 2020-09-10 14:03:30 -07:00
f2fs.h f2fs: fix to reserve space for IO align feature 2022-01-27 10:54:31 +01:00
file.c f2fs: fix to unmap pages from userspace process in punch_hole() 2021-09-18 13:40:16 +02:00
gc.c f2fs: fix to unlock page correctly in error path of is_alive() 2022-04-08 14:39:51 +02:00
gc.h f2fs: support age threshold based garbage collection 2020-09-11 11:11:15 -07:00
hash.c
inline.c f2fs: fix a redundant call to f2fs_balance_fs if an error occurs 2021-05-19 10:13:00 +02:00
inode.c f2fs: fix missing free nid in f2fs_handle_failed_inode 2022-04-08 14:40:04 +02:00
Kconfig
Makefile
namei.c f2fs: should use GFP_NOFS for directory inodes 2021-11-18 14:04:29 +01:00
node.c f2fs: fix to avoid potential deadlock 2022-04-08 14:40:04 +02:00
node.h f2fs: avoid race condition for shrinker count 2021-01-06 14:56:54 +01:00
recovery.c f2fs: fix to avoid racing on fsync_entry_slab by multi filesystem instances 2021-07-19 09:45:03 +02:00
segment.c f2fs: fix to avoid accessing invalid fio in f2fs_allocate_data_block() 2021-05-19 10:13:02 +02:00
segment.h f2fs: fix to reserve space for IO align feature 2022-01-27 10:54:31 +01:00
shrinker.c f2fs: avoid race condition for shrinker count 2021-01-06 14:56:54 +01:00
super.c f2fs: quota: fix loop condition at f2fs_quota_sync() 2022-04-08 14:39:51 +02:00
sysfs.c f2fs: fix to enable ATGC correctly via gc_idle sysfs interface 2022-04-08 14:40:03 +02:00
trace.c
trace.h
verity.c f2fs: fix error handling in f2fs_end_enable_verity() 2021-05-11 14:47:34 +02:00
xattr.c f2fs: fix to do sanity check on last xattr entry in __f2fs_setxattr() 2021-12-29 12:26:05 +01:00
xattr.h