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:
Chao Yu 2016-08-04 20:13:03 +08:00 коммит произвёл Jaegeuk Kim
Родитель fe8494bfc8
Коммит 20a3d61d46
1 изменённых файлов: 7 добавлений и 2 удалений

Просмотреть файл

@ -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;
} }