generic_file_splice_read() does so little that it makes no sense to keep __generic_file_splice_read() a separate function. Signed-off-by: Miklos Szeredi <mszeredi@xxxxxxxxxx> --- fs/splice.c | 70 +++++++++++++++++++++++++------------------------------------ 1 file changed, 29 insertions(+), 41 deletions(-) diff --git a/fs/splice.c b/fs/splice.c index bee282803ccf..395cbb6b4926 100644 --- a/fs/splice.c +++ b/fs/splice.c @@ -260,17 +260,30 @@ void splice_shrink_spd(struct splice_pipe_desc *spd) kfree(spd->partial); } -static int -__generic_file_splice_read(struct file *in, loff_t *ppos, - struct pipe_inode_info *pipe, size_t len, - unsigned int flags) +/** + * generic_file_splice_read - splice data from file to a pipe + * @in: file to splice from + * @ppos: position in @in + * @pipe: pipe to splice to + * @len: number of bytes to splice + * @flags: splice modifier flags + * + * Description: + * Will read pages from given file and fill them into a pipe. Can be + * used as long as the address_space operations for the source implements + * a readpage() hook. + * + */ +ssize_t generic_file_splice_read(struct file *in, loff_t *ppos, + struct pipe_inode_info *pipe, size_t len, + unsigned int flags) { unsigned int loff, nr_pages, req_pages; struct page *pages[PIPE_DEF_BUFFERS]; struct partial_page partial[PIPE_DEF_BUFFERS]; struct page *page; pgoff_t index; - int error; + int ret = 0; struct splice_pipe_desc spd = { .pages = pages, .partial = partial, @@ -280,6 +293,9 @@ __generic_file_splice_read(struct file *in, loff_t *ppos, .spd_release = spd_release_page, }; + if (IS_DAX(in->f_mapping->host)) + return default_file_splice_read(in, ppos, pipe, len, flags); + if (splice_grow_spd(pipe, &spd)) return -ENOMEM; @@ -288,62 +304,34 @@ __generic_file_splice_read(struct file *in, loff_t *ppos, req_pages = (len + loff + PAGE_SIZE - 1) >> PAGE_SHIFT; nr_pages = min(req_pages, spd.nr_pages_max); - error = 0; while (spd.nr_pages < nr_pages && len) { - long ret; + int nr; - ret = get_page_for_read(in, loff, len, index, &page); - if (ret <= 0) { - error = ret; + nr = get_page_for_read(in, loff, len, index, &page); + if (nr <= 0) { + ret = nr; break; } spd.pages[spd.nr_pages] = page; spd.partial[spd.nr_pages].offset = loff; - spd.partial[spd.nr_pages].len = ret; + spd.partial[spd.nr_pages].len = nr; spd.nr_pages++; index++; - len -= ret; + len -= nr; loff = 0; } in->f_ra.prev_pos = (loff_t)index << PAGE_SHIFT; if (spd.nr_pages) - error = splice_to_pipe(pipe, &spd); - - splice_shrink_spd(&spd); - return error; -} - -/** - * generic_file_splice_read - splice data from file to a pipe - * @in: file to splice from - * @ppos: position in @in - * @pipe: pipe to splice to - * @len: number of bytes to splice - * @flags: splice modifier flags - * - * Description: - * Will read pages from given file and fill them into a pipe. Can be - * used as long as the address_space operations for the source implements - * a readpage() hook. - * - */ -ssize_t generic_file_splice_read(struct file *in, loff_t *ppos, - struct pipe_inode_info *pipe, size_t len, - unsigned int flags) -{ - int ret; - - if (IS_DAX(in->f_mapping->host)) - return default_file_splice_read(in, ppos, pipe, len, flags); + ret = splice_to_pipe(pipe, &spd); - ret = __generic_file_splice_read(in, ppos, pipe, len, flags); if (ret > 0) { *ppos += ret; file_accessed(in); } + splice_shrink_spd(&spd); return ret; } -- 2.5.5 -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html