f2fs: factor the read/write tracing logic into a helper
authorChristoph Hellwig <hch@lst.de>
Thu, 19 Jan 2023 06:36:21 +0000 (07:36 +0100)
committerJaegeuk Kim <jaegeuk@kernel.org>
Thu, 2 Feb 2023 21:37:16 +0000 (13:37 -0800)
Factor the logic to log a path for reads and writs into a helper
shared between the read_iter and write_iter methods.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/file.c

index eaae2ad..6519957 100644 (file)
@@ -4341,6 +4341,27 @@ out:
        return ret;
 }
 
+static void f2fs_trace_rw_file_path(struct kiocb *iocb, size_t count, int rw)
+{
+       struct inode *inode = file_inode(iocb->ki_filp);
+       char *buf, *path;
+
+       buf = f2fs_kmalloc(F2FS_I_SB(inode), PATH_MAX, GFP_KERNEL);
+       if (!buf)
+               return;
+       path = dentry_path_raw(file_dentry(iocb->ki_filp), buf, PATH_MAX);
+       if (IS_ERR(path))
+               goto free_buf;
+       if (rw == WRITE)
+               trace_f2fs_datawrite_start(inode, iocb->ki_pos, count,
+                               current->pid, path, current->comm);
+       else
+               trace_f2fs_dataread_start(inode, iocb->ki_pos, count,
+                               current->pid, path, current->comm);
+free_buf:
+       kfree(buf);
+}
+
 static ssize_t f2fs_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
 {
        struct inode *inode = file_inode(iocb->ki_filp);
@@ -4350,24 +4371,9 @@ static ssize_t f2fs_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
        if (!f2fs_is_compress_backend_ready(inode))
                return -EOPNOTSUPP;
 
-       if (trace_f2fs_dataread_start_enabled()) {
-               char *p = f2fs_kmalloc(F2FS_I_SB(inode), PATH_MAX, GFP_KERNEL);
-               char *path;
-
-               if (!p)
-                       goto skip_read_trace;
+       if (trace_f2fs_dataread_start_enabled())
+               f2fs_trace_rw_file_path(iocb, iov_iter_count(to), READ);
 
-               path = dentry_path_raw(file_dentry(iocb->ki_filp), p, PATH_MAX);
-               if (IS_ERR(path)) {
-                       kfree(p);
-                       goto skip_read_trace;
-               }
-
-               trace_f2fs_dataread_start(inode, pos, iov_iter_count(to),
-                                       current->pid, path, current->comm);
-               kfree(p);
-       }
-skip_read_trace:
        if (f2fs_should_use_dio(inode, iocb, to)) {
                ret = f2fs_dio_read_iter(iocb, to);
        } else {
@@ -4673,24 +4679,9 @@ static ssize_t f2fs_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
        if (preallocated < 0) {
                ret = preallocated;
        } else {
-               if (trace_f2fs_datawrite_start_enabled()) {
-                       char *p = f2fs_kmalloc(F2FS_I_SB(inode),
-                                               PATH_MAX, GFP_KERNEL);
-                       char *path;
-
-                       if (!p)
-                               goto skip_write_trace;
-                       path = dentry_path_raw(file_dentry(iocb->ki_filp),
-                                                               p, PATH_MAX);
-                       if (IS_ERR(path)) {
-                               kfree(p);
-                               goto skip_write_trace;
-                       }
-                       trace_f2fs_datawrite_start(inode, orig_pos, orig_count,
-                                       current->pid, path, current->comm);
-                       kfree(p);
-               }
-skip_write_trace:
+               if (trace_f2fs_datawrite_start_enabled())
+                       f2fs_trace_rw_file_path(iocb, orig_count, WRITE);
+
                /* Do the actual write. */
                ret = dio ?
                        f2fs_dio_write_iter(iocb, from, &may_need_sync) :