Commit 4f231228 authored by Jens Axboe's avatar Jens Axboe

splice: fix repeated kmap()'s in default_file_splice_read()

We cannot reliably map more than one page at the time, or we risk
deadlocking. Just allocate the pages from low mem instead.
Reported-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarJens Axboe <jens.axboe@oracle.com>
parent 2b1ccc0e
...@@ -580,13 +580,13 @@ ssize_t default_file_splice_read(struct file *in, loff_t *ppos, ...@@ -580,13 +580,13 @@ ssize_t default_file_splice_read(struct file *in, loff_t *ppos,
for (i = 0; i < nr_pages && i < PIPE_BUFFERS && len; i++) { for (i = 0; i < nr_pages && i < PIPE_BUFFERS && len; i++) {
struct page *page; struct page *page;
page = alloc_page(GFP_HIGHUSER); page = alloc_page(GFP_USER);
error = -ENOMEM; error = -ENOMEM;
if (!page) if (!page)
goto err; goto err;
this_len = min_t(size_t, len, PAGE_CACHE_SIZE - offset); this_len = min_t(size_t, len, PAGE_CACHE_SIZE - offset);
vec[i].iov_base = (void __user *) kmap(page); vec[i].iov_base = (void __user *) page_address(page);
vec[i].iov_len = this_len; vec[i].iov_len = this_len;
pages[i] = page; pages[i] = page;
spd.nr_pages++; spd.nr_pages++;
...@@ -604,7 +604,6 @@ ssize_t default_file_splice_read(struct file *in, loff_t *ppos, ...@@ -604,7 +604,6 @@ ssize_t default_file_splice_read(struct file *in, loff_t *ppos,
nr_freed = 0; nr_freed = 0;
for (i = 0; i < spd.nr_pages; i++) { for (i = 0; i < spd.nr_pages; i++) {
kunmap(pages[i]);
this_len = min_t(size_t, vec[i].iov_len, res); this_len = min_t(size_t, vec[i].iov_len, res);
partial[i].offset = 0; partial[i].offset = 0;
partial[i].len = this_len; partial[i].len = this_len;
...@@ -624,10 +623,9 @@ ssize_t default_file_splice_read(struct file *in, loff_t *ppos, ...@@ -624,10 +623,9 @@ ssize_t default_file_splice_read(struct file *in, loff_t *ppos,
return res; return res;
err: err:
for (i = 0; i < spd.nr_pages; i++) { for (i = 0; i < spd.nr_pages; i++)
kunmap(pages[i]);
__free_page(pages[i]); __free_page(pages[i]);
}
return error; return error;
} }
EXPORT_SYMBOL(default_file_splice_read); EXPORT_SYMBOL(default_file_splice_read);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment