vfs: vfs_dedupe_file_range() doesn't return EOPNOTSUPP

It returns EINVAL when the operation is not supported by the
filesystem. Fix it to return EOPNOTSUPP to be consistent with
the man page and clone_file_range().

Clean up the inconsistent error return handling while I'm there.
(I know, lipstick on a pig, but every little bit helps...)

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
This commit is contained in:
Dave Chinner 2018-11-19 13:31:12 -08:00 committed by Darrick J. Wong
parent 4721a60109
commit 494633fac7

View File

@ -2094,17 +2094,18 @@ int vfs_dedupe_file_range(struct file *file, struct file_dedupe_range *same)
off = same->src_offset;
len = same->src_length;
ret = -EISDIR;
if (S_ISDIR(src->i_mode))
goto out;
return -EISDIR;
ret = -EINVAL;
if (!S_ISREG(src->i_mode))
goto out;
return -EINVAL;
if (!file->f_op->remap_file_range)
return -EOPNOTSUPP;
ret = remap_verify_area(file, off, len, false);
if (ret < 0)
goto out;
return ret;
ret = 0;
if (off + len > i_size_read(src))
@ -2147,10 +2148,8 @@ int vfs_dedupe_file_range(struct file *file, struct file_dedupe_range *same)
fdput(dst_fd);
next_loop:
if (fatal_signal_pending(current))
goto out;
break;
}
out:
return ret;
}
EXPORT_SYMBOL(vfs_dedupe_file_range);