diff options
| -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); |
