Lines Matching refs:spd
183 struct splice_pipe_desc *spd) in splice_to_pipe() argument
185 unsigned int spd_pages = spd->nr_pages; in splice_to_pipe()
209 buf->page = spd->pages[page_nr]; in splice_to_pipe()
210 buf->offset = spd->partial[page_nr].offset; in splice_to_pipe()
211 buf->len = spd->partial[page_nr].len; in splice_to_pipe()
212 buf->private = spd->partial[page_nr].private; in splice_to_pipe()
213 buf->ops = spd->ops; in splice_to_pipe()
214 if (spd->flags & SPLICE_F_GIFT) in splice_to_pipe()
224 if (!--spd->nr_pages) in splice_to_pipe()
232 if (spd->flags & SPLICE_F_NONBLOCK) { in splice_to_pipe()
263 spd->spd_release(spd, page_nr++); in splice_to_pipe()
269 void spd_release_page(struct splice_pipe_desc *spd, unsigned int i) in spd_release_page() argument
271 page_cache_release(spd->pages[i]); in spd_release_page()
278 int splice_grow_spd(const struct pipe_inode_info *pipe, struct splice_pipe_desc *spd) in splice_grow_spd() argument
282 spd->nr_pages_max = buffers; in splice_grow_spd()
286 spd->pages = kmalloc(buffers * sizeof(struct page *), GFP_KERNEL); in splice_grow_spd()
287 spd->partial = kmalloc(buffers * sizeof(struct partial_page), GFP_KERNEL); in splice_grow_spd()
289 if (spd->pages && spd->partial) in splice_grow_spd()
292 kfree(spd->pages); in splice_grow_spd()
293 kfree(spd->partial); in splice_grow_spd()
297 void splice_shrink_spd(struct splice_pipe_desc *spd) in splice_shrink_spd() argument
299 if (spd->nr_pages_max <= PIPE_DEF_BUFFERS) in splice_shrink_spd()
302 kfree(spd->pages); in splice_shrink_spd()
303 kfree(spd->partial); in splice_shrink_spd()
319 struct splice_pipe_desc spd = { in __generic_file_splice_read() local
328 if (splice_grow_spd(pipe, &spd)) in __generic_file_splice_read()
334 nr_pages = min(req_pages, spd.nr_pages_max); in __generic_file_splice_read()
339 spd.nr_pages = find_get_pages_contig(mapping, index, nr_pages, spd.pages); in __generic_file_splice_read()
340 index += spd.nr_pages; in __generic_file_splice_read()
346 if (spd.nr_pages < nr_pages) in __generic_file_splice_read()
348 index, req_pages - spd.nr_pages); in __generic_file_splice_read()
351 while (spd.nr_pages < nr_pages) { in __generic_file_splice_read()
380 spd.pages[spd.nr_pages++] = page; in __generic_file_splice_read()
389 nr_pages = spd.nr_pages; in __generic_file_splice_read()
390 spd.nr_pages = 0; in __generic_file_splice_read()
401 page = spd.pages[page_nr]; in __generic_file_splice_read()
428 page_cache_release(spd.pages[page_nr]); in __generic_file_splice_read()
429 spd.pages[page_nr] = page; in __generic_file_splice_read()
486 spd.partial[page_nr].offset = loff; in __generic_file_splice_read()
487 spd.partial[page_nr].len = this_len; in __generic_file_splice_read()
490 spd.nr_pages++; in __generic_file_splice_read()
499 page_cache_release(spd.pages[page_nr++]); in __generic_file_splice_read()
502 if (spd.nr_pages) in __generic_file_splice_read()
503 error = splice_to_pipe(pipe, &spd); in __generic_file_splice_read()
505 splice_shrink_spd(&spd); in __generic_file_splice_read()
621 struct splice_pipe_desc spd = { in default_file_splice_read() local
630 if (splice_grow_spd(pipe, &spd)) in default_file_splice_read()
635 if (spd.nr_pages_max > PIPE_DEF_BUFFERS) { in default_file_splice_read()
636 vec = kmalloc(spd.nr_pages_max * sizeof(struct iovec), GFP_KERNEL); in default_file_splice_read()
644 for (i = 0; i < nr_pages && i < spd.nr_pages_max && len; i++) { in default_file_splice_read()
655 spd.pages[i] = page; in default_file_splice_read()
656 spd.nr_pages++; in default_file_splice_read()
661 res = kernel_readv(in, vec, spd.nr_pages, *ppos); in default_file_splice_read()
672 for (i = 0; i < spd.nr_pages; i++) { in default_file_splice_read()
674 spd.partial[i].offset = 0; in default_file_splice_read()
675 spd.partial[i].len = this_len; in default_file_splice_read()
677 __free_page(spd.pages[i]); in default_file_splice_read()
678 spd.pages[i] = NULL; in default_file_splice_read()
683 spd.nr_pages -= nr_freed; in default_file_splice_read()
685 res = splice_to_pipe(pipe, &spd); in default_file_splice_read()
692 splice_shrink_spd(&spd); in default_file_splice_read()
696 for (i = 0; i < spd.nr_pages; i++) in default_file_splice_read()
697 __free_page(spd.pages[i]); in default_file_splice_read()
1598 struct splice_pipe_desc spd = { in vmsplice_to_pipe() local
1612 if (splice_grow_spd(pipe, &spd)) in vmsplice_to_pipe()
1615 spd.nr_pages = get_iovec_page_array(iov, nr_segs, spd.pages, in vmsplice_to_pipe()
1616 spd.partial, false, in vmsplice_to_pipe()
1617 spd.nr_pages_max); in vmsplice_to_pipe()
1618 if (spd.nr_pages <= 0) in vmsplice_to_pipe()
1619 ret = spd.nr_pages; in vmsplice_to_pipe()
1621 ret = splice_to_pipe(pipe, &spd); in vmsplice_to_pipe()
1623 splice_shrink_spd(&spd); in vmsplice_to_pipe()