lkml.org 
[lkml]   [2023]   [May]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v21 19/30] f2fs: Provide a splice-read stub
    Date
    Provide a splice_read stub for f2fs.  This does some checks and tracing
    before calling filemap_splice_read() and will update the iostats
    afterwards. Direct I/O is handled by the caller.

    Signed-off-by: David Howells <dhowells@redhat.com>
    cc: Christoph Hellwig <hch@lst.de>
    cc: Al Viro <viro@zeniv.linux.org.uk>
    cc: Jens Axboe <axboe@kernel.dk>
    cc: Jaegeuk Kim <jaegeuk@kernel.org>
    cc: Chao Yu <chao@kernel.org>
    cc: linux-f2fs-devel@lists.sourceforge.net
    cc: linux-fsdevel@vger.kernel.org
    cc: linux-block@vger.kernel.org
    cc: linux-mm@kvack.org
    ---
    fs/f2fs/file.c | 43 +++++++++++++++++++++++++++++++++++--------
    1 file changed, 35 insertions(+), 8 deletions(-)

    diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
    index 5ac53d2627d2..3fce122997ca 100644
    --- a/fs/f2fs/file.c
    +++ b/fs/f2fs/file.c
    @@ -4367,22 +4367,23 @@ static ssize_t f2fs_dio_read_iter(struct kiocb *iocb, struct iov_iter *to)
    return ret;
    }

    -static void f2fs_trace_rw_file_path(struct kiocb *iocb, size_t count, int rw)
    +static void f2fs_trace_rw_file_path(struct file *file, loff_t pos, size_t count,
    + int rw)
    {
    - struct inode *inode = file_inode(iocb->ki_filp);
    + struct inode *inode = file_inode(file);
    char *buf, *path;

    buf = f2fs_getname(F2FS_I_SB(inode));
    if (!buf)
    return;
    - path = dentry_path_raw(file_dentry(iocb->ki_filp), buf, PATH_MAX);
    + path = dentry_path_raw(file_dentry(file), buf, PATH_MAX);
    if (IS_ERR(path))
    goto free_buf;
    if (rw == WRITE)
    - trace_f2fs_datawrite_start(inode, iocb->ki_pos, count,
    + trace_f2fs_datawrite_start(inode, pos, count,
    current->pid, path, current->comm);
    else
    - trace_f2fs_dataread_start(inode, iocb->ki_pos, count,
    + trace_f2fs_dataread_start(inode, pos, count,
    current->pid, path, current->comm);
    free_buf:
    f2fs_putname(buf);
    @@ -4398,7 +4399,8 @@ static ssize_t f2fs_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
    return -EOPNOTSUPP;

    if (trace_f2fs_dataread_start_enabled())
    - f2fs_trace_rw_file_path(iocb, iov_iter_count(to), READ);
    + f2fs_trace_rw_file_path(iocb->ki_filp, iocb->ki_pos,
    + iov_iter_count(to), READ);

    if (f2fs_should_use_dio(inode, iocb, to)) {
    ret = f2fs_dio_read_iter(iocb, to);
    @@ -4413,6 +4415,30 @@ static ssize_t f2fs_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
    return ret;
    }

    +static ssize_t f2fs_file_splice_read(struct file *in, loff_t *ppos,
    + struct pipe_inode_info *pipe,
    + size_t len, unsigned int flags)
    +{
    + struct inode *inode = file_inode(in);
    + const loff_t pos = *ppos;
    + ssize_t ret;
    +
    + if (!f2fs_is_compress_backend_ready(inode))
    + return -EOPNOTSUPP;
    +
    + if (trace_f2fs_dataread_start_enabled())
    + f2fs_trace_rw_file_path(in, pos, len, READ);
    +
    + ret = filemap_splice_read(in, ppos, pipe, len, flags);
    + if (ret > 0)
    + f2fs_update_iostat(F2FS_I_SB(inode), inode,
    + APP_BUFFERED_READ_IO, ret);
    +
    + if (trace_f2fs_dataread_end_enabled())
    + trace_f2fs_dataread_end(inode, pos, ret);
    + return ret;
    +}
    +
    static ssize_t f2fs_write_checks(struct kiocb *iocb, struct iov_iter *from)
    {
    struct file *file = iocb->ki_filp;
    @@ -4714,7 +4740,8 @@ static ssize_t f2fs_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
    ret = preallocated;
    } else {
    if (trace_f2fs_datawrite_start_enabled())
    - f2fs_trace_rw_file_path(iocb, orig_count, WRITE);
    + f2fs_trace_rw_file_path(iocb->ki_filp, iocb->ki_pos,
    + orig_count, WRITE);

    /* Do the actual write. */
    ret = dio ?
    @@ -4919,7 +4946,7 @@ const struct file_operations f2fs_file_operations = {
    #ifdef CONFIG_COMPAT
    .compat_ioctl = f2fs_compat_ioctl,
    #endif
    - .splice_read = generic_file_splice_read,
    + .splice_read = f2fs_file_splice_read,
    .splice_write = iter_file_splice_write,
    .fadvise = f2fs_file_fadvise,
    };
    \
     
     \ /
      Last update: 2023-05-20 02:05    [W:4.125 / U:0.244 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site