Commit 20a3d61d authored by Chao Yu's avatar Chao Yu Committed by Jaegeuk Kim

f2fs: avoid potential deadlock in f2fs_move_file_range

Thread A			Thread B
- inode_lock fileA
				- inode_lock fileB
				 - inode_lock fileA
 - inode_lock fileB

We may encounter above potential deadlock during moving file range in
concurrent scenario. This patch fixes the issue by using inode_trylock
instead.
Signed-off-by: default avatarChao Yu <yuchao0@huawei.com>
Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent fe8494bf
......@@ -2093,8 +2093,12 @@ static int f2fs_move_file_range(struct file *file_in, loff_t pos_in,
return -EOPNOTSUPP;
inode_lock(src);
if (src != dst)
inode_lock(dst);
if (src != dst) {
if (!inode_trylock(dst)) {
ret = -EBUSY;
goto out;
}
}
ret = -EINVAL;
if (pos_in + len > src->i_size || pos_in + len < pos_in)
......@@ -2152,6 +2156,7 @@ static int f2fs_move_file_range(struct file *file_in, loff_t pos_in,
out_unlock:
if (src != dst)
inode_unlock(dst);
out:
inode_unlock(src);
return ret;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment