@@ -311,7 +311,7 @@ ssize_t copy_splice_read(struct file *in, loff_t *ppos,
311
311
struct kiocb kiocb ;
312
312
struct page * * pages ;
313
313
ssize_t ret ;
314
- size_t used , npages , chunk , remain , reclaim ;
314
+ size_t used , npages , chunk , remain , keep = 0 ;
315
315
int i ;
316
316
317
317
/* Work out how much data we can actually add into the pipe */
@@ -325,7 +325,7 @@ ssize_t copy_splice_read(struct file *in, loff_t *ppos,
325
325
if (!bv )
326
326
return - ENOMEM ;
327
327
328
- pages = (void * )(bv + npages );
328
+ pages = (struct page * * )(bv + npages );
329
329
npages = alloc_pages_bulk_array (GFP_USER , npages , pages );
330
330
if (!npages ) {
331
331
kfree (bv );
@@ -348,11 +348,8 @@ ssize_t copy_splice_read(struct file *in, loff_t *ppos,
348
348
kiocb .ki_pos = * ppos ;
349
349
ret = call_read_iter (in , & kiocb , & to );
350
350
351
- reclaim = npages * PAGE_SIZE ;
352
- remain = 0 ;
353
351
if (ret > 0 ) {
354
- reclaim -= ret ;
355
- remain = ret ;
352
+ keep = DIV_ROUND_UP (ret , PAGE_SIZE );
356
353
* ppos = kiocb .ki_pos ;
357
354
file_accessed (in );
358
355
} else if (ret < 0 ) {
@@ -365,14 +362,12 @@ ssize_t copy_splice_read(struct file *in, loff_t *ppos,
365
362
}
366
363
367
364
/* Free any pages that didn't get touched at all. */
368
- reclaim /= PAGE_SIZE ;
369
- if (reclaim ) {
370
- npages -= reclaim ;
371
- release_pages (pages + npages , reclaim );
372
- }
365
+ if (keep < npages )
366
+ release_pages (pages + keep , npages - keep );
373
367
374
368
/* Push the remaining pages into the pipe. */
375
- for (i = 0 ; i < npages ; i ++ ) {
369
+ remain = ret ;
370
+ for (i = 0 ; i < keep ; i ++ ) {
376
371
struct pipe_buffer * buf = pipe_head_buf (pipe );
377
372
378
373
chunk = min_t (size_t , remain , PAGE_SIZE );
0 commit comments