Skip to content

Commit 746de1f

Browse files
author
Al Viro
committed
pipe_get_pages(): switch to append_pipe()
now that we are advancing the iterator, there's no need to treat the first page separately - just call append_pipe() in a loop. Signed-off-by: Al Viro <[email protected]>
1 parent eba2d3d commit 746de1f

File tree

1 file changed

+6
-29
lines changed

1 file changed

+6
-29
lines changed

lib/iov_iter.c

Lines changed: 6 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1304,10 +1304,9 @@ static ssize_t pipe_get_pages(struct iov_iter *i,
13041304
struct page ***pages, size_t maxsize, unsigned maxpages,
13051305
size_t *start)
13061306
{
1307-
struct pipe_inode_info *pipe = i->pipe;
1308-
unsigned int npages, off, count;
1307+
unsigned int npages, count, off, chunk;
13091308
struct page **p;
1310-
ssize_t left;
1309+
size_t left;
13111310

13121311
if (!sanity(i))
13131312
return -EFAULT;
@@ -1319,38 +1318,16 @@ static ssize_t pipe_get_pages(struct iov_iter *i,
13191318
if (!count)
13201319
return -ENOMEM;
13211320
p = *pages;
1322-
left = maxsize;
1323-
npages = 0;
1324-
if (off) {
1325-
struct pipe_buffer *buf = pipe_buf(pipe, pipe->head - 1);
1326-
1327-
get_page(*p++ = buf->page);
1328-
left -= PAGE_SIZE - off;
1329-
if (left <= 0) {
1330-
buf->len += maxsize;
1331-
iov_iter_advance(i, maxsize);
1332-
return maxsize;
1333-
}
1334-
buf->len = PAGE_SIZE;
1335-
npages = 1;
1336-
}
1337-
for ( ; npages < count; npages++) {
1338-
struct page *page;
1339-
unsigned int size = min_t(ssize_t, left, PAGE_SIZE);
1340-
1341-
if (pipe_full(pipe->head, pipe->tail, pipe->max_usage))
1342-
break;
1343-
page = push_anon(pipe, size);
1321+
for (npages = 0, left = maxsize ; npages < count; npages++, left -= chunk) {
1322+
struct page *page = append_pipe(i, left, &off);
13441323
if (!page)
13451324
break;
1325+
chunk = min_t(size_t, left, PAGE_SIZE - off);
13461326
get_page(*p++ = page);
1347-
left -= size;
13481327
}
13491328
if (!npages)
13501329
return -EFAULT;
1351-
maxsize -= left;
1352-
iov_iter_advance(i, maxsize);
1353-
return maxsize;
1330+
return maxsize - left;
13541331
}
13551332

13561333
static ssize_t iter_xarray_populate_pages(struct page **pages, struct xarray *xa,

0 commit comments

Comments
 (0)