Re: [PATCH v13 03/12] splice: Do splice read from a buffered file without using ITER_PIPE
From: Christoph Hellwig
Date: Mon Feb 13 2023 - 03:28:33 EST
> 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.