diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/iov_iter.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/lib/iov_iter.c b/lib/iov_iter.c index d67c8288d95d..9e8c7386b3a0 100644 --- a/lib/iov_iter.c +++ b/lib/iov_iter.c | |||
@@ -144,7 +144,7 @@ static size_t copy_page_to_iter_iovec(struct page *page, size_t offset, size_t b | |||
144 | buf = iov->iov_base + skip; | 144 | buf = iov->iov_base + skip; |
145 | copy = min(bytes, iov->iov_len - skip); | 145 | copy = min(bytes, iov->iov_len - skip); |
146 | 146 | ||
147 | if (!fault_in_pages_writeable(buf, copy)) { | 147 | if (IS_ENABLED(CONFIG_HIGHMEM) && !fault_in_pages_writeable(buf, copy)) { |
148 | kaddr = kmap_atomic(page); | 148 | kaddr = kmap_atomic(page); |
149 | from = kaddr + offset; | 149 | from = kaddr + offset; |
150 | 150 | ||
@@ -175,6 +175,7 @@ static size_t copy_page_to_iter_iovec(struct page *page, size_t offset, size_t b | |||
175 | copy = min(bytes, iov->iov_len - skip); | 175 | copy = min(bytes, iov->iov_len - skip); |
176 | } | 176 | } |
177 | /* Too bad - revert to non-atomic kmap */ | 177 | /* Too bad - revert to non-atomic kmap */ |
178 | |||
178 | kaddr = kmap(page); | 179 | kaddr = kmap(page); |
179 | from = kaddr + offset; | 180 | from = kaddr + offset; |
180 | left = __copy_to_user(buf, from, copy); | 181 | left = __copy_to_user(buf, from, copy); |
@@ -193,6 +194,7 @@ static size_t copy_page_to_iter_iovec(struct page *page, size_t offset, size_t b | |||
193 | bytes -= copy; | 194 | bytes -= copy; |
194 | } | 195 | } |
195 | kunmap(page); | 196 | kunmap(page); |
197 | |||
196 | done: | 198 | done: |
197 | if (skip == iov->iov_len) { | 199 | if (skip == iov->iov_len) { |
198 | iov++; | 200 | iov++; |
@@ -225,7 +227,7 @@ static size_t copy_page_from_iter_iovec(struct page *page, size_t offset, size_t | |||
225 | buf = iov->iov_base + skip; | 227 | buf = iov->iov_base + skip; |
226 | copy = min(bytes, iov->iov_len - skip); | 228 | copy = min(bytes, iov->iov_len - skip); |
227 | 229 | ||
228 | if (!fault_in_pages_readable(buf, copy)) { | 230 | if (IS_ENABLED(CONFIG_HIGHMEM) && !fault_in_pages_readable(buf, copy)) { |
229 | kaddr = kmap_atomic(page); | 231 | kaddr = kmap_atomic(page); |
230 | to = kaddr + offset; | 232 | to = kaddr + offset; |
231 | 233 | ||
@@ -256,6 +258,7 @@ static size_t copy_page_from_iter_iovec(struct page *page, size_t offset, size_t | |||
256 | copy = min(bytes, iov->iov_len - skip); | 258 | copy = min(bytes, iov->iov_len - skip); |
257 | } | 259 | } |
258 | /* Too bad - revert to non-atomic kmap */ | 260 | /* Too bad - revert to non-atomic kmap */ |
261 | |||
259 | kaddr = kmap(page); | 262 | kaddr = kmap(page); |
260 | to = kaddr + offset; | 263 | to = kaddr + offset; |
261 | left = __copy_from_user(to, buf, copy); | 264 | left = __copy_from_user(to, buf, copy); |
@@ -274,6 +277,7 @@ static size_t copy_page_from_iter_iovec(struct page *page, size_t offset, size_t | |||
274 | bytes -= copy; | 277 | bytes -= copy; |
275 | } | 278 | } |
276 | kunmap(page); | 279 | kunmap(page); |
280 | |||
277 | done: | 281 | done: |
278 | if (skip == iov->iov_len) { | 282 | if (skip == iov->iov_len) { |
279 | iov++; | 283 | iov++; |