summaryrefslogtreecommitdiffstats
path: root/sunrpc
diff options
context:
space:
mode:
Diffstat (limited to 'sunrpc')
-rw-r--r--sunrpc/sunrpc-xprtsock.stp43
1 files changed, 37 insertions, 6 deletions
diff --git a/sunrpc/sunrpc-xprtsock.stp b/sunrpc/sunrpc-xprtsock.stp
index 8d560df..b76a9b7 100644
--- a/sunrpc/sunrpc-xprtsock.stp
+++ b/sunrpc/sunrpc-xprtsock.stp
@@ -2,8 +2,31 @@
#include <linux/kernel.h>
#include <linux/sunrpc/clnt.h>
#include <linux/sunrpc/svc.h>
+
+struct rpcbind_args {
+ struct rpc_xprt * r_xprt;
+
+ u32 r_prog;
+ u32 r_vers;
+ u32 r_prot;
+ unsigned short r_port;
+ const char * r_netid;
+ const char * r_addr;
+ const char * r_owner;
+
+ int r_status;
+};
%}
+function rpcb_status:long(_rpc:long)
+%{
+ struct rpcbind_args *rpc =
+ (struct rpcbind_args *)(long) kread(&(THIS->_rpc));
+
+ THIS->__retvalue = rpc->r_status;
+
+ CATCH_DEREF_FAULT();
+%}
function task_status:long(_task:long)
%{
struct rpc_task *task = (struct rpc_task *)(long) kread(&(THIS->_task));
@@ -51,15 +74,23 @@ probe module("sunrpc").function("rpcb_getport_async")
}
probe module("sunrpc").function("rpcb_getport_async").return
{
- if (task_status(rpcb_task))
- printf("%s(%d): rpcb_getport_async: status %d\n",
- execname(), pid(), task_status(rpcb_task));
+ if (task_status(rpcb_task))
+ printf("%s(%d): rpcb_getport_async: status %d\n",
+ execname(), pid(), task_status(rpcb_task));
+}
+global rpc_args;
+probe module("sunrpc").function("rpcb_getport_done")
+{
+ if (task_status($child))
+ printf("%s(%d): rpcb_getport_done: task status %d\n",
+ execname(), pid(), task_status($child));
+ rpc_args = $data;
}
probe module("sunrpc").function("rpcb_getport_done").return
{
- if (task_status($child))
- printf("%s(%d): rpcb_getport_done: status %d\n",
- execname(), pid(), task_status(rpcb_task));
+ if (rpcb_status(rpc_args))
+ printf("%s(%d): rpcb_getport_done: rpcbind status %d\n",
+ execname(), pid(), rpcb_status(rpc_args));
}
global xstcp_task
probe module("sunrpc").function("xs_tcp_connect")