Commit b0989159 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'pull-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs

Pull iov_iter fix from Al Viro:
 "ITER_XARRAY get_pages fix; now the return value is a lot saner (and
  more similar to logics for other flavours)"

* tag 'pull-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
  iov_iter: Fix iter_xarray_get_pages{,_alloc}()
parents a32e7ea3 6c776766
...@@ -1434,7 +1434,7 @@ static ssize_t iter_xarray_get_pages(struct iov_iter *i, ...@@ -1434,7 +1434,7 @@ static ssize_t iter_xarray_get_pages(struct iov_iter *i,
{ {
unsigned nr, offset; unsigned nr, offset;
pgoff_t index, count; pgoff_t index, count;
size_t size = maxsize, actual; size_t size = maxsize;
loff_t pos; loff_t pos;
if (!size || !maxpages) if (!size || !maxpages)
...@@ -1461,13 +1461,7 @@ static ssize_t iter_xarray_get_pages(struct iov_iter *i, ...@@ -1461,13 +1461,7 @@ static ssize_t iter_xarray_get_pages(struct iov_iter *i,
if (nr == 0) if (nr == 0)
return 0; return 0;
actual = PAGE_SIZE * nr; return min(nr * PAGE_SIZE - offset, maxsize);
actual -= offset;
if (nr == count && size > 0) {
unsigned last_offset = (nr > 1) ? 0 : offset;
actual -= PAGE_SIZE - (last_offset + size);
}
return actual;
} }
/* must be done on non-empty ITER_IOVEC one */ /* must be done on non-empty ITER_IOVEC one */
...@@ -1602,7 +1596,7 @@ static ssize_t iter_xarray_get_pages_alloc(struct iov_iter *i, ...@@ -1602,7 +1596,7 @@ static ssize_t iter_xarray_get_pages_alloc(struct iov_iter *i,
struct page **p; struct page **p;
unsigned nr, offset; unsigned nr, offset;
pgoff_t index, count; pgoff_t index, count;
size_t size = maxsize, actual; size_t size = maxsize;
loff_t pos; loff_t pos;
if (!size) if (!size)
...@@ -1631,13 +1625,7 @@ static ssize_t iter_xarray_get_pages_alloc(struct iov_iter *i, ...@@ -1631,13 +1625,7 @@ static ssize_t iter_xarray_get_pages_alloc(struct iov_iter *i,
if (nr == 0) if (nr == 0)
return 0; return 0;
actual = PAGE_SIZE * nr; return min(nr * PAGE_SIZE - offset, maxsize);
actual -= offset;
if (nr == count && size > 0) {
unsigned last_offset = (nr > 1) ? 0 : offset;
actual -= PAGE_SIZE - (last_offset + size);
}
return actual;
} }
ssize_t iov_iter_get_pages_alloc(struct iov_iter *i, ssize_t iov_iter_get_pages_alloc(struct iov_iter *i,
......
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