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.