diff options
Diffstat (limited to 'fs/btrfs/ioctl.c')
| -rw-r--r-- | fs/btrfs/ioctl.c | 5 | 
1 files changed, 5 insertions, 0 deletions
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index e84ef60ffe35..97a97839a867 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c @@ -1481,12 +1481,17 @@ static noinline long btrfs_ioctl_clone(struct file *file, unsigned long srcfd,  		ret = -EBADF;  		goto out_drop_write;  	} +  	src = src_file->f_dentry->d_inode;  	ret = -EINVAL;  	if (src == inode)  		goto out_fput; +	/* the src must be open for reading */ +	if (!(src_file->f_mode & FMODE_READ)) +		goto out_fput; +  	ret = -EISDIR;  	if (S_ISDIR(src->i_mode) || S_ISDIR(inode->i_mode))  		goto out_fput;  |