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: Chao Yu <yuchao0@huawei.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
Родитель
fe8494bfc8
Коммит
20a3d61d46
|
@ -2093,8 +2093,12 @@ static int f2fs_move_file_range(struct file *file_in, loff_t pos_in,
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
inode_lock(src);
|
inode_lock(src);
|
||||||
if (src != dst)
|
if (src != dst) {
|
||||||
inode_lock(dst);
|
if (!inode_trylock(dst)) {
|
||||||
|
ret = -EBUSY;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
if (pos_in + len > src->i_size || pos_in + len < pos_in)
|
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:
|
out_unlock:
|
||||||
if (src != dst)
|
if (src != dst)
|
||||||
inode_unlock(dst);
|
inode_unlock(dst);
|
||||||
|
out:
|
||||||
inode_unlock(src);
|
inode_unlock(src);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче