summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrank Ch. Eigler <fche@elastic.org>2007-11-05 11:43:08 -0500
committerFrank Ch. Eigler <fche@elastic.org>2007-11-05 11:43:08 -0500
commit006fd454d55d6a06b8c38a22cc75c10cba0fb20e (patch)
tree2a5e6b73ad93931dc76cd3251154bd10452f5e02
parent806b26a85d30f59af7dcb0025c68a50bf4bbb352 (diff)
parent23618fb8c4281c16f7ea31a108a635fa127b5e69 (diff)
downloadsystemtap-steved-006fd454d55d6a06b8c38a22cc75c10cba0fb20e.tar.gz
systemtap-steved-006fd454d55d6a06b8c38a22cc75c10cba0fb20e.tar.xz
systemtap-steved-006fd454d55d6a06b8c38a22cc75c10cba0fb20e.zip
Merge branch 'master' of git://sources.redhat.com/git/systemtap
-rw-r--r--tapset/ChangeLog6
-rw-r--r--tapset/nfs_proc.stp36
2 files changed, 25 insertions, 17 deletions
diff --git a/tapset/ChangeLog b/tapset/ChangeLog
index 11cdea4c..b420ad02 100644
--- a/tapset/ChangeLog
+++ b/tapset/ChangeLog
@@ -1,3 +1,9 @@
+2007-11-5 Zhaolei <zhaolei@cn.fujitsu.com>
+
+ From Cai Fei <caifei@cn.fujitsu.com>
+ * nfs_proc.stp: Use kread in get_ip and get_prot to avoid kernel
+ panic.
+
2007-11-2 Zhaolei <zhaolei@cn.fujitsu.com>
From Cai Fei <caifei@cn.fujitsu.com>
diff --git a/tapset/nfs_proc.stp b/tapset/nfs_proc.stp
index 6ec2572e..2dc7e659 100644
--- a/tapset/nfs_proc.stp
+++ b/tapset/nfs_proc.stp
@@ -5,34 +5,36 @@
%{
/*Get ip address from a rpc_task*/
- __u32 get_ip(struct rpc_task *);
+ __u32 get_ip(struct rpc_task *, struct context * __restrict__);
/*Get protocol types from a rpc_task*/
- int get_prot(struct rpc_task *);
+ int get_prot(struct rpc_task *, struct context * __restrict__);
%}
%{
- __u32 get_ip(struct rpc_task * task)
+ __u32 get_ip(struct rpc_task * task, struct context * __restrict__ c)
{
- /* FIXME: deref hazards! */
struct rpc_clnt * tk_client;
struct rpc_xprt * cl_xprt;
struct sockaddr_in *addr;
- tk_client = task->tk_client;
- cl_xprt= tk_client->cl_xprt;
+ tk_client = kread(&(task->tk_client));
+ cl_xprt= kread(&(tk_client->cl_xprt));
addr = (struct sockaddr_in *)&(cl_xprt->addr);
- if (addr->sin_family != AF_INET)
+ if (kread(&(addr->sin_family)) != AF_INET)
/* Now consider ipv4 only */
return 0;
- return addr->sin_addr.s_addr;
+ return kread(&(addr->sin_addr.s_addr));
+ CATCH_DEREF_FAULT();
+ return -1;
}
- int get_prot(struct rpc_task * task)
+ int get_prot(struct rpc_task * task, struct context * __restrict__ c)
{
- /* FIXME: deref hazards! */
struct rpc_clnt * tk_client;
struct rpc_xprt * cl_xprt;
- tk_client = task->tk_client;
- cl_xprt= tk_client->cl_xprt;
+ tk_client = kread(&(task->tk_client));
+ cl_xprt= kread(&(tk_client->cl_xprt));
- return cl_xprt->prot;
+ return kread(&(cl_xprt->prot));
+ CATCH_DEREF_FAULT();
+ return -1;
}
%}
/*
@@ -73,10 +75,10 @@ function __nfs_read_data_info:long (rdata :long,index :long) %{ /* pure */
switch(index) {
case 0:
- THIS->__retvalue = get_ip(task);
+ THIS->__retvalue = get_ip(task, CONTEXT);
break;
case 1:
- THIS->__retvalue = get_prot(task);
+ THIS->__retvalue = get_prot(task, CONTEXT);
break;
case 2:
THIS->__retvalue = kread(&(rres->count));
@@ -113,10 +115,10 @@ function __nfs_write_data_info:long (wdata :long,index :long) %{ /* pure */
switch(index) {
case 0:
- THIS->__retvalue = get_ip(task);
+ THIS->__retvalue = get_ip(task, CONTEXT);
break;
case 1:
- THIS->__retvalue = get_prot(task);
+ THIS->__retvalue = get_prot(task, CONTEXT);
break;
case 2: