mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
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: 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 Link: https://lore.kernel.org/r/20230522135018.2742245-20-dhowells@redhat.com Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
fa6c46e7c2
commit
ceb11d0e2d
@ -4367,22 +4367,23 @@ out:
|
||||
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,
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user