splice: Add a func to do a splice from a buffered file without ITER_PIPE
authorDavid Howells <dhowells@redhat.com>
Tue, 14 Feb 2023 15:01:42 +0000 (15:01 +0000)
committerSteve French <stfrench@microsoft.com>
Mon, 20 Feb 2023 23:25:43 +0000 (17:25 -0600)
commit07073eb01c5f630344bc1c3e56b0e0d94aedf919
treec7580c7fd9e188c26bcb8b0d618a345036224639
parentdd5b9d003ebcb469de05f967af7164e6b9450ca2
splice: Add a func to do a splice from a buffered file without ITER_PIPE

Provide a function to do splice read from a buffered file, pulling the
folios out of the pagecache directly by calling filemap_get_pages() to do
any required reading and then pasting the returned folios into the pipe.

A helper function is provided to do the actual folio pasting and will
handle multipage folios by splicing as many of the relevant subpages as
will fit into the pipe.

The code is loosely based on filemap_read() and might belong in
mm/filemap.c with that as it needs to use filemap_get_pages().

Signed-off-by: David Howells <dhowells@redhat.com>
Reviewed-by: Jens Axboe <axboe@kernel.dk>
cc: Christoph Hellwig <hch@lst.de>
cc: Al Viro <viro@zeniv.linux.org.uk>
cc: David Hildenbrand <david@redhat.com>
cc: John Hubbard <jhubbard@nvidia.com>
cc: linux-mm@kvack.org
cc: linux-block@vger.kernel.org
cc: linux-fsdevel@vger.kernel.org
Signed-off-by: Steve French <stfrench@microsoft.com>
include/linux/fs.h
include/linux/pipe_fs_i.h
lib/iov_iter.c
mm/filemap.c
mm/internal.h