Commit ceb11d0e authored by David Howells's avatar David Howells Committed by Jens Axboe

f2fs: Provide a splice-read wrapper

Provide a splice_read wrapper 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: default avatarDavid 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
Link: https://lore.kernel.org/r/20230522135018.2742245-20-dhowells@redhat.comSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent fa6c46e7
...@@ -4367,22 +4367,23 @@ static ssize_t f2fs_dio_read_iter(struct kiocb *iocb, struct iov_iter *to) ...@@ -4367,22 +4367,23 @@ static ssize_t f2fs_dio_read_iter(struct kiocb *iocb, struct iov_iter *to)
return ret; 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; char *buf, *path;
buf = f2fs_getname(F2FS_I_SB(inode)); buf = f2fs_getname(F2FS_I_SB(inode));
if (!buf) if (!buf)
return; 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)) if (IS_ERR(path))
goto free_buf; goto free_buf;
if (rw == WRITE) if (rw == WRITE)
trace_f2fs_datawrite_start(inode, iocb->ki_pos, count, trace_f2fs_datawrite_start(inode, pos, count,
current->pid, path, current->comm); current->pid, path, current->comm);
else else
trace_f2fs_dataread_start(inode, iocb->ki_pos, count, trace_f2fs_dataread_start(inode, pos, count,
current->pid, path, current->comm); current->pid, path, current->comm);
free_buf: free_buf:
f2fs_putname(buf); f2fs_putname(buf);
...@@ -4398,7 +4399,8 @@ static ssize_t f2fs_file_read_iter(struct kiocb *iocb, struct iov_iter *to) ...@@ -4398,7 +4399,8 @@ static ssize_t f2fs_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
return -EOPNOTSUPP; return -EOPNOTSUPP;
if (trace_f2fs_dataread_start_enabled()) 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)) { if (f2fs_should_use_dio(inode, iocb, to)) {
ret = f2fs_dio_read_iter(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) ...@@ -4413,6 +4415,30 @@ static ssize_t f2fs_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
return ret; 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) static ssize_t f2fs_write_checks(struct kiocb *iocb, struct iov_iter *from)
{ {
struct file *file = iocb->ki_filp; struct file *file = iocb->ki_filp;
...@@ -4714,7 +4740,8 @@ static ssize_t f2fs_file_write_iter(struct kiocb *iocb, struct iov_iter *from) ...@@ -4714,7 +4740,8 @@ static ssize_t f2fs_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
ret = preallocated; ret = preallocated;
} else { } else {
if (trace_f2fs_datawrite_start_enabled()) 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. */ /* Do the actual write. */
ret = dio ? ret = dio ?
...@@ -4919,7 +4946,7 @@ const struct file_operations f2fs_file_operations = { ...@@ -4919,7 +4946,7 @@ const struct file_operations f2fs_file_operations = {
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
.compat_ioctl = f2fs_compat_ioctl, .compat_ioctl = f2fs_compat_ioctl,
#endif #endif
.splice_read = generic_file_splice_read, .splice_read = f2fs_file_splice_read,
.splice_write = iter_file_splice_write, .splice_write = iter_file_splice_write,
.fadvise = f2fs_file_fadvise, .fadvise = f2fs_file_fadvise,
}; };
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment