lkml.org 
[lkml]   [2023]   [Mar]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v19 07/15] splice: Do splice read from a file without using ITER_PIPE
    Date
    Make generic_file_splice_read() use filemap_splice_read() and
    direct_splice_read() rather than using an ITER_PIPE and call_read_iter().

    With this, ITER_PIPE is no longer used.

    Signed-off-by: David Howells <dhowells@redhat.com>
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    cc: Jens Axboe <axboe@kernel.dk>
    cc: Steve French <smfrench@gmail.com>
    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-cifs@vger.kernel.org
    cc: linux-fsdevel@vger.kernel.org
    ---

    Notes:
    ver #18)
    - Split out the change to cifs to make it use generic_file_splice_read().
    - Split out the unexport of filemap_splice_read() (still needed by cifs).

    fs/splice.c | 30 +++++++-----------------------
    1 file changed, 7 insertions(+), 23 deletions(-)

    diff --git a/fs/splice.c b/fs/splice.c
    index 90ccd3666dca..f46dd1fb367b 100644
    --- a/fs/splice.c
    +++ b/fs/splice.c
    @@ -387,29 +387,13 @@ ssize_t generic_file_splice_read(struct file *in, loff_t *ppos,
    struct pipe_inode_info *pipe, size_t len,
    unsigned int flags)
    {
    - struct iov_iter to;
    - struct kiocb kiocb;
    - int ret;
    -
    - iov_iter_pipe(&to, ITER_DEST, pipe, len);
    - init_sync_kiocb(&kiocb, in);
    - kiocb.ki_pos = *ppos;
    - ret = call_read_iter(in, &kiocb, &to);
    - if (ret > 0) {
    - *ppos = kiocb.ki_pos;
    - file_accessed(in);
    - } else if (ret < 0) {
    - /* free what was emitted */
    - pipe_discard_from(pipe, to.start_head);
    - /*
    - * callers of ->splice_read() expect -EAGAIN on
    - * "can't put anything in there", rather than -EFAULT.
    - */
    - if (ret == -EFAULT)
    - ret = -EAGAIN;
    - }
    -
    - return ret;
    + if (unlikely(*ppos >= file_inode(in)->i_sb->s_maxbytes))
    + return 0;
    + if (unlikely(!len))
    + return 0;
    + if (in->f_flags & O_DIRECT)
    + return direct_splice_read(in, ppos, pipe, len, flags);
    + return filemap_splice_read(in, ppos, pipe, len, flags);
    }
    EXPORT_SYMBOL(generic_file_splice_read);

    \
     
     \ /
      Last update: 2023-03-27 01:01    [W:2.807 / U:0.052 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site