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}()
This commit is contained in:
@ -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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
||||||
|
Reference in New Issue
Block a user