diff options
author | zhaolei <zhaolei> | 2007-11-05 01:13:56 +0000 |
---|---|---|
committer | zhaolei <zhaolei> | 2007-11-05 01:13:56 +0000 |
commit | 23618fb8c4281c16f7ea31a108a635fa127b5e69 (patch) | |
tree | 2a5e6b73ad93931dc76cd3251154bd10452f5e02 /tapset | |
parent | 600e72b28cc0676dc581b8fc5d54c09772979b79 (diff) | |
download | systemtap-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/ChangeLog | 6 | ||||
-rw-r--r-- | tapset/nfs_proc.stp | 36 |
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: |