NFSv4.2: Add tracepoints for getxattr, setxattr, and removexattr
authorAnna Schumaker <Anna.Schumaker@Netapp.com>
Thu, 22 Sep 2022 19:18:50 +0000 (15:18 -0400)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Wed, 5 Oct 2022 19:47:16 +0000 (15:47 -0400)
These functions take similar arguments, and can share a tracepoint class
for common formatting.

Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
fs/nfs/nfs42proc.c
fs/nfs/nfs4trace.h

index 6dab9e40837298405f98617b64076f7a6ce79f90..c4791ca00df1b8fff49b70ab14685d7fdf6f12c5 100644 (file)
@@ -1175,6 +1175,7 @@ static int _nfs42_proc_removexattr(struct inode *inode, const char *name)
 
        ret = nfs4_call_sync(server->client, server, &msg, &args.seq_args,
            &res.seq_res, 1);
+       trace_nfs4_removexattr(inode, name, ret);
        if (!ret)
                nfs4_update_changeattr(inode, &res.cinfo, timestamp, 0);
 
@@ -1214,6 +1215,7 @@ static int _nfs42_proc_setxattr(struct inode *inode, const char *name,
 
        ret = nfs4_call_sync(server->client, server, &msg, &arg.seq_args,
            &res.seq_res, 1);
+       trace_nfs4_setxattr(inode, name, ret);
 
        for (; np > 0; np--)
                put_page(pages[np - 1]);
@@ -1246,6 +1248,7 @@ static ssize_t _nfs42_proc_getxattr(struct inode *inode, const char *name,
 
        ret = nfs4_call_sync(server->client, server, &msg, &arg.seq_args,
            &res.seq_res, 0);
+       trace_nfs4_getxattr(inode, name, ret);
        if (ret < 0)
                return ret;
 
index 37c4c105ed29fcd9e7b19fe30ee865284652df40..650c9353826f36637c182b4ea51e1799ccd186cd 100644 (file)
@@ -2496,6 +2496,52 @@ TRACE_EVENT(nfs4_offload_cancel,
                        __entry->stateid_seq, __entry->stateid_hash
                )
 );
+
+DECLARE_EVENT_CLASS(nfs4_xattr_event,
+               TP_PROTO(
+                       const struct inode *inode,
+                       const char *name,
+                       int error
+               ),
+
+               TP_ARGS(inode, name, error),
+
+               TP_STRUCT__entry(
+                       __field(unsigned long, error)
+                       __field(dev_t, dev)
+                       __field(u32, fhandle)
+                       __field(u64, fileid)
+                       __string(name, name)
+               ),
+
+               TP_fast_assign(
+                       __entry->error = error < 0 ? -error : 0;
+                       __entry->dev = inode->i_sb->s_dev;
+                       __entry->fileid = NFS_FILEID(inode);
+                       __entry->fhandle = nfs_fhandle_hash(NFS_FH(inode));
+                       __assign_str(name, name);
+               ),
+
+               TP_printk(
+                       "error=%ld (%s) fileid=%02x:%02x:%llu fhandle=0x%08x "
+                       "name=%s",
+                       -__entry->error, show_nfs4_status(__entry->error),
+                       MAJOR(__entry->dev), MINOR(__entry->dev),
+                       (unsigned long long)__entry->fileid,
+                       __entry->fhandle, __get_str(name)
+               )
+);
+#define DEFINE_NFS4_XATTR_EVENT(name) \
+       DEFINE_EVENT(nfs4_xattr_event, name,  \
+                       TP_PROTO( \
+                               const struct inode *inode, \
+                               const char *name, \
+                               int error \
+                       ), \
+                       TP_ARGS(inode, name, error))
+DEFINE_NFS4_XATTR_EVENT(nfs4_getxattr);
+DEFINE_NFS4_XATTR_EVENT(nfs4_setxattr);
+DEFINE_NFS4_XATTR_EVENT(nfs4_removexattr);
 #endif /* CONFIG_NFS_V4_2 */
 
 #endif /* CONFIG_NFS_V4_1 */