OSDN Git Service

cifs: Add tracepoints for errors on flush or fsync
authorSteve French <stfrench@microsoft.com>
Thu, 6 Feb 2020 00:22:37 +0000 (18:22 -0600)
committerSteve French <stfrench@microsoft.com>
Thu, 6 Feb 2020 00:24:19 +0000 (18:24 -0600)
Makes it easier to debug errors on writeback that happen later,
and are being returned on flush or fsync

For example:
  writetest-17829 [002] .... 13583.407859: cifs_flush_err: ino=90 rc=-28

Signed-off-by: Steve French <stfrench@microsoft.com>
fs/cifs/file.c
fs/cifs/trace.h

index 79e6f4f..99ea7b2 100644 (file)
@@ -2632,8 +2632,10 @@ int cifs_fsync(struct file *file, loff_t start, loff_t end, int datasync)
        struct cifs_sb_info *cifs_sb = CIFS_FILE_SB(file);
 
        rc = file_write_and_wait_range(file, start, end);
-       if (rc)
+       if (rc) {
+               trace_cifs_fsync_err(file_inode(file)->i_ino, rc);
                return rc;
+       }
 
        xid = get_xid();
 
@@ -2666,7 +2668,8 @@ int cifs_flush(struct file *file, fl_owner_t id)
                rc = filemap_write_and_wait(inode->i_mapping);
 
        cifs_dbg(FYI, "Flush inode %p file %p rc %d\n", inode, file, rc);
-
+       if (rc)
+               trace_cifs_flush_err(inode->i_ino, rc);
        return rc;
 }
 
index e7e350b..4cb0d5f 100644 (file)
@@ -547,6 +547,33 @@ DEFINE_EVENT(smb3_exit_err_class, smb3_##name,    \
 
 DEFINE_SMB3_EXIT_ERR_EVENT(exit_err);
 
+
+DECLARE_EVENT_CLASS(smb3_sync_err_class,
+       TP_PROTO(unsigned long ino,
+               int     rc),
+       TP_ARGS(ino, rc),
+       TP_STRUCT__entry(
+               __field(unsigned long, ino)
+               __field(int, rc)
+       ),
+       TP_fast_assign(
+               __entry->ino = ino;
+               __entry->rc = rc;
+       ),
+       TP_printk("\tino=%lu rc=%d",
+               __entry->ino, __entry->rc)
+)
+
+#define DEFINE_SMB3_SYNC_ERR_EVENT(name)          \
+DEFINE_EVENT(smb3_sync_err_class, cifs_##name,    \
+       TP_PROTO(unsigned long ino,             \
+               int     rc),                    \
+       TP_ARGS(ino, rc))
+
+DEFINE_SMB3_SYNC_ERR_EVENT(fsync_err);
+DEFINE_SMB3_SYNC_ERR_EVENT(flush_err);
+
+
 DECLARE_EVENT_CLASS(smb3_enter_exit_class,
        TP_PROTO(unsigned int xid,
                const char *func_name),