NFS: Avoid RCU usage in tracepoints
authorAnna Schumaker <Anna.Schumaker@Netapp.com>
Wed, 1 Nov 2017 19:48:43 +0000 (15:48 -0400)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Fri, 17 Nov 2017 21:43:43 +0000 (16:43 -0500)
There isn't an obvious way to acquire and release the RCU lock during a
tracepoint, so we can't use the rpc_peeraddr2str() function here.
Instead, rely on the client's cl_hostname, which should have similar
enough information without needing an rcu_dereference().

Reported-by: Dave Jones <davej@codemonkey.org.uk>
Cc: stable@vger.kernel.org # v3.12
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
fs/nfs/nfs4trace.h

index be1da19c65d61e89e19f45d9bd07faaabe54d71f..7a5588c25f70a5405446d2e787b8658e2b9acad3 100644 (file)
@@ -201,17 +201,13 @@ DECLARE_EVENT_CLASS(nfs4_clientid_event,
                TP_ARGS(clp, error),
 
                TP_STRUCT__entry(
-                       __string(dstaddr,
-                               rpc_peeraddr2str(clp->cl_rpcclient,
-                                       RPC_DISPLAY_ADDR))
+                       __string(dstaddr, clp->cl_hostname)
                        __field(int, error)
                ),
 
                TP_fast_assign(
                        __entry->error = error;
-                       __assign_str(dstaddr,
-                               rpc_peeraddr2str(clp->cl_rpcclient,
-                                               RPC_DISPLAY_ADDR));
+                       __assign_str(dstaddr, clp->cl_hostname);
                ),
 
                TP_printk(
@@ -1132,9 +1128,7 @@ DECLARE_EVENT_CLASS(nfs4_inode_callback_event,
                        __field(dev_t, dev)
                        __field(u32, fhandle)
                        __field(u64, fileid)
-                       __string(dstaddr, clp ?
-                               rpc_peeraddr2str(clp->cl_rpcclient,
-                                       RPC_DISPLAY_ADDR) : "unknown")
+                       __string(dstaddr, clp ? clp->cl_hostname : "unknown")
                ),
 
                TP_fast_assign(
@@ -1147,9 +1141,7 @@ DECLARE_EVENT_CLASS(nfs4_inode_callback_event,
                                __entry->fileid = 0;
                                __entry->dev = 0;
                        }
-                       __assign_str(dstaddr, clp ?
-                               rpc_peeraddr2str(clp->cl_rpcclient,
-                                       RPC_DISPLAY_ADDR) : "unknown")
+                       __assign_str(dstaddr, clp ? clp->cl_hostname : "unknown")
                ),
 
                TP_printk(
@@ -1191,9 +1183,7 @@ DECLARE_EVENT_CLASS(nfs4_inode_stateid_callback_event,
                        __field(dev_t, dev)
                        __field(u32, fhandle)
                        __field(u64, fileid)
-                       __string(dstaddr, clp ?
-                               rpc_peeraddr2str(clp->cl_rpcclient,
-                                       RPC_DISPLAY_ADDR) : "unknown")
+                       __string(dstaddr, clp ? clp->cl_hostname : "unknown")
                        __field(int, stateid_seq)
                        __field(u32, stateid_hash)
                ),
@@ -1208,9 +1198,7 @@ DECLARE_EVENT_CLASS(nfs4_inode_stateid_callback_event,
                                __entry->fileid = 0;
                                __entry->dev = 0;
                        }
-                       __assign_str(dstaddr, clp ?
-                               rpc_peeraddr2str(clp->cl_rpcclient,
-                                       RPC_DISPLAY_ADDR) : "unknown")
+                       __assign_str(dstaddr, clp ? clp->cl_hostname : "unknown")
                        __entry->stateid_seq =
                                be32_to_cpu(stateid->seqid);
                        __entry->stateid_hash =