Chao Yu
8253cc11ab
f2fs: fix to set/clear I_LINKABLE under i_lock
[ Upstream commit 46085f37fc9e12d5c3539fb768b5ad7951e72acf ]
fsstress + fault injection test case reports a warning message as
below:
WARNING: CPU: 13 PID: 6226 at fs/inode.c:361 inc_nlink+0x32/0x40
Call Trace:
f2fs_init_inode_metadata+0x25c/0x4a0 [f2fs]
f2fs_add_inline_entry+0x153/0x3b0 [f2fs]
f2fs_add_dentry+0x75/0x80 [f2fs]
f2fs_do_add_link+0x108/0x160 [f2fs]
f2fs_rename2+0x6ab/0x14f0 [f2fs]
vfs_rename+0x70c/0x940
do_renameat2+0x4d8/0x4f0
__x64_sys_renameat2+0x4b/0x60
do_syscall_64+0x33/0x80
entry_SYSCALL_64_after_hwframe+0x44/0xa9
Following race case can cause this:
Thread A Kworker
- f2fs_rename
- f2fs_create_whiteout
- __f2fs_tmpfile
- f2fs_i_links_write
- f2fs_mark_inode_dirty_sync
- mark_inode_dirty_sync
- writeback_single_inode
- __writeback_single_inode
- spin_lock(&inode->i_lock)
- inode->i_state |= I_LINKABLE
- inode->i_state &= ~dirty
- spin_unlock(&inode->i_lock)
- f2fs_add_link
- f2fs_do_add_link
- f2fs_add_dentry
- f2fs_add_inline_entry
- f2fs_init_inode_metadata
- f2fs_i_links_write
- inc_nlink
- WARN_ON(!(inode->i_state & I_LINKABLE))
Fix to add i_lock to avoid i_state update race condition.
Signed-off-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2021-03-07 12:20:46 +01:00
..
2019-05-08 21:23:11 -07:00
2018-09-12 13:07:10 -07:00
2021-01-06 14:48:40 +01:00
2021-03-04 10:26:24 +01:00
2021-01-06 14:48:40 +01:00
2020-11-05 11:43:13 +01:00
2019-07-02 15:40:40 -07:00
2021-01-06 14:48:40 +01:00
2021-03-04 10:26:50 +01:00
2020-10-01 13:17:21 +02:00
2018-09-12 13:07:10 -07:00
2019-08-23 07:57:13 -07:00
2021-03-04 10:26:24 +01:00
2020-01-04 19:16:31 +01:00
2019-09-16 08:38:48 -07:00
2019-08-12 19:33:51 -07:00
2021-03-07 12:20:46 +01:00
2021-01-06 14:48:40 +01:00
2021-01-06 14:48:40 +01:00
2020-09-03 11:26:45 +02:00
2020-11-05 11:43:14 +01:00
2021-03-07 12:20:46 +01:00
2021-01-06 14:48:40 +01:00
2021-01-06 14:48:38 +01:00
2020-10-29 09:57:52 +01:00
2019-03-05 19:58:06 -08:00
2018-09-12 13:07:10 -07:00
2019-08-12 19:33:51 -07:00
2020-04-29 16:32:55 +02:00
2019-08-12 19:33:51 -07:00