diff options
Diffstat (limited to 'fs/f2fs/file.c')
| -rw-r--r-- | fs/f2fs/file.c | 13 | 
1 files changed, 9 insertions, 4 deletions
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index 0e493f63ea41..47abb96098e4 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -2086,15 +2086,19 @@ static int f2fs_move_file_range(struct file *file_in, loff_t pos_in,  	if (unlikely(f2fs_readonly(src->i_sb)))  		return -EROFS; -	if (S_ISDIR(src->i_mode) || S_ISDIR(dst->i_mode)) -		return -EISDIR; +	if (!S_ISREG(src->i_mode) || !S_ISREG(dst->i_mode)) +		return -EINVAL;  	if (f2fs_encrypted_inode(src) || f2fs_encrypted_inode(dst))  		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;  }  |