summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/iov_iter.c8
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
196done: 198done:
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
277done: 281done:
278 if (skip == iov->iov_len) { 282 if (skip == iov->iov_len) {
279 iov++; 283 iov++;