f2fs: fix double lock in handle_failed_inode
In handle_failed_inode, there is a potential deadlock which can happen in below call path: - f2fs_create - f2fs_lock_op down_read(cp_rwsem) - f2fs_add_link - __f2fs_add_link - init_inode_metadata - f2fs_init_security failed - truncate_blocks failed - handle_failed_inode - f2fs_truncate - truncate_blocks(..,true) - write_checkpoint - block_operations - f2fs_lock_all down_write(cp_rwsem) - f2fs_lock_op down_read(cp_rwsem) So in this path, we pass parameter to f2fs_truncate to make sure cp_rwsem in truncate_blocks will not be locked again. Signed-off-by: Chao Yu <chao2.yu@samsung.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
@@ -343,7 +343,7 @@ void f2fs_evict_inode(struct inode *inode)
|
||||
i_size_write(inode, 0);
|
||||
|
||||
if (F2FS_HAS_BLOCKS(inode))
|
||||
f2fs_truncate(inode);
|
||||
f2fs_truncate(inode, true);
|
||||
|
||||
f2fs_lock_op(sbi);
|
||||
remove_inode_page(inode);
|
||||
@@ -385,7 +385,7 @@ void handle_failed_inode(struct inode *inode)
|
||||
|
||||
i_size_write(inode, 0);
|
||||
if (F2FS_HAS_BLOCKS(inode))
|
||||
f2fs_truncate(inode);
|
||||
f2fs_truncate(inode, false);
|
||||
|
||||
remove_inode_page(inode);
|
||||
|
||||
|
Reference in New Issue
Block a user