> 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(). Yes, I thunk it should go into filemap.c > + while (spliced < size && > + !pipe_full(pipe->head, pipe->tail, pipe->max_usage)) { > + struct pipe_buffer *buf = &pipe->bufs[pipe->head & (pipe->ring_size - 1)]; Can you please facto this calculation, that is also duplicated in patch one into a helper? static inline struct pipe_buffer *pipe_head_buf(struct pipe_inode_info *pipe) { return &pipe->bufs[pipe->head & (pipe->ring_size - 1)]; } > + struct folio_batch fbatch; > + size_t total_spliced = 0, used, npages; > + loff_t isize, end_offset; > + bool writably_mapped; > + int i, error = 0; > + > + struct kiocb iocb = { Why the empty line before this declaration? > + .ki_filp = in, > + .ki_pos = *ppos, > + }; Also why doesn't this use init_sync_kiocb? > if (in->f_flags & O_DIRECT) > return generic_file_direct_splice_read(in, ppos, pipe, len, flags); > + return generic_file_buffered_splice_read(in, ppos, pipe, len, flags); Btw, can we drop the verbose generic_file_ prefix here? generic_file_buffered_splice_read really should be filemap_splice_read and be in filemap.c. generic_file_direct_splice_read I'd just name direct_splice_read.