summaryrefslogtreecommitdiffstats
path: root/tapset
diff options
context:
space:
mode:
authorzhaolei <zhaolei>2007-11-05 01:13:56 +0000
committerzhaolei <zhaolei>2007-11-05 01:13:56 +0000
commit23618fb8c4281c16f7ea31a108a635fa127b5e69 (patch)
tree2a5e6b73ad93931dc76cd3251154bd10452f5e02 /tapset
parent600e72b28cc0676dc581b8fc5d54c09772979b79 (diff)
downloadsystemtap-steved-23618fb8c4281c16f7ea31a108a635fa127b5e69.tar.gz
systemtap-steved-23618fb8c4281c16f7ea31a108a635fa127b5e69.tar.xz
systemtap-steved-23618fb8c4281c16f7ea31a108a635fa127b5e69.zip
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.
Diffstat (limited to 'tapset')
-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: