diff options
author | Dave Chinner <dchinner@redhat.com> | 2018-11-19 16:31:12 -0500 |
---|---|---|
committer | Darrick J. Wong <darrick.wong@oracle.com> | 2018-11-21 13:10:54 -0500 |
commit | 494633fac7896afc2bce6f83fe7319946270540b (patch) | |
tree | 86c87a32c846defd14da23cface9d4f6a8ee677e /fs/read_write.c | |
parent | 4721a6010990971440b4ffefbdf014976b8eda2f (diff) |
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>
Diffstat (limited to 'fs/read_write.c')
-rw-r--r-- | fs/read_write.c | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/fs/read_write.c b/fs/read_write.c index bfcb4ced5664..4dae0399c75a 100644 --- a/fs/read_write.c +++ b/fs/read_write.c | |||
@@ -2094,17 +2094,18 @@ int vfs_dedupe_file_range(struct file *file, struct file_dedupe_range *same) | |||
2094 | off = same->src_offset; | 2094 | off = same->src_offset; |
2095 | len = same->src_length; | 2095 | len = same->src_length; |
2096 | 2096 | ||
2097 | ret = -EISDIR; | ||
2098 | if (S_ISDIR(src->i_mode)) | 2097 | if (S_ISDIR(src->i_mode)) |
2099 | goto out; | 2098 | return -EISDIR; |
2100 | 2099 | ||
2101 | ret = -EINVAL; | ||
2102 | if (!S_ISREG(src->i_mode)) | 2100 | if (!S_ISREG(src->i_mode)) |
2103 | goto out; | 2101 | return -EINVAL; |
2102 | |||
2103 | if (!file->f_op->remap_file_range) | ||
2104 | return -EOPNOTSUPP; | ||
2104 | 2105 | ||
2105 | ret = remap_verify_area(file, off, len, false); | 2106 | ret = remap_verify_area(file, off, len, false); |
2106 | if (ret < 0) | 2107 | if (ret < 0) |
2107 | goto out; | 2108 | return ret; |
2108 | ret = 0; | 2109 | ret = 0; |
2109 | 2110 | ||
2110 | if (off + len > i_size_read(src)) | 2111 | if (off + len > i_size_read(src)) |
@@ -2147,10 +2148,8 @@ next_fdput: | |||
2147 | fdput(dst_fd); | 2148 | fdput(dst_fd); |
2148 | next_loop: | 2149 | next_loop: |
2149 | if (fatal_signal_pending(current)) | 2150 | if (fatal_signal_pending(current)) |
2150 | goto out; | 2151 | break; |
2151 | } | 2152 | } |
2152 | |||
2153 | out: | ||
2154 | return ret; | 2153 | return ret; |
2155 | } | 2154 | } |
2156 | EXPORT_SYMBOL(vfs_dedupe_file_range); | 2155 | EXPORT_SYMBOL(vfs_dedupe_file_range); |