summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tapset/ChangeLog5
-rw-r--r--tapset/nfs.stp135
-rw-r--r--tapset/nfsd.stp3
-rw-r--r--tapset/vfs.stp20
4 files changed, 140 insertions, 23 deletions
diff --git a/tapset/ChangeLog b/tapset/ChangeLog
index 3a38486d..05b1ff33 100644
--- a/tapset/ChangeLog
+++ b/tapset/ChangeLog
@@ -1,3 +1,8 @@
+2006-08-25 Li Guanglei <guanglei@cn.ibm.com>
+
+ From Li Xuepeng:
+ * vfs.stp,nfsd.stp,nfs.stp: bug fixes and more error checking
+
2006-08-23 Li Guanglei <guanglei@cn.ibm.com>
* vfs.stp: New tapset from Thomas Zanussi(trz@us.ibm.com) to probe
diff --git a/tapset/nfs.stp b/tapset/nfs.stp
index e1609dad..56054851 100644
--- a/tapset/nfs.stp
+++ b/tapset/nfs.stp
@@ -16,7 +16,12 @@
function __nfsi_cache_valid:long(inode:long) %{ /* pure */
struct inode * inode = (struct inode *)(THIS->inode);
struct nfs_inode * nfsi;
-
+
+ if(inode == NULL)
+ {
+ THIS->__retvalue = -1;
+ return;
+ }
nfsi = __nfs_i(inode);
THIS->__retvalue = nfsi->cache_validity;
%}
@@ -24,7 +29,15 @@ function __nfsi_cache_valid:long(inode:long) %{ /* pure */
/*Get read_cache_jiffies from struct inode*/
function __nfsi_rcache_time :long (inode:long) %{ /* pure */
struct inode * inode = (struct inode *)(THIS->inode);
- struct nfs_inode * nfsi = (struct nfs_inode *) __nfs_i(inode);
+ struct nfs_inode * nfsi ;
+
+ if(inode == NULL)
+ {
+ THIS->__retvalue = -1;
+ return;
+ }
+
+ nfsi = (struct nfs_inode *) __nfs_i(inode);
THIS->__retvalue = nfsi->read_cache_jiffies;
%}
@@ -32,7 +45,14 @@ function __nfsi_rcache_time :long (inode:long) %{ /* pure */
/*Get attrtimeo from struct inode*/
function __nfsi_attr_time :long (inode:long) %{ /* pure */
struct inode * inode = (struct inode *)(THIS->inode);
- struct nfs_inode * nfsi = (struct nfs_inode *) __nfs_i(inode);
+ struct nfs_inode * nfsi ;
+
+ if(inode == NULL)
+ {
+ THIS->__retvalue = -1;
+ return;
+ }
+ nfsi= (struct nfs_inode *) __nfs_i(inode);
THIS->__retvalue = nfsi->attrtimeo;
%}
@@ -40,7 +60,14 @@ function __nfsi_attr_time :long (inode:long) %{ /* pure */
/*Get ndirty from struct inode*/
function __nfsi_ndirty:long (inode:long) %{ /* pure */
struct inode *inode = (struct inode *)(THIS->inode);
- struct nfs_inode *nfsi = NFS_I(inode);
+ struct nfs_inode *nfsi ;
+
+ if(inode == NULL)
+ {
+ THIS->__retvalue = -1;
+ return;
+ }
+ nfsi = NFS_I(inode);
THIS->__retvalue = nfsi->ndirty;
%}
@@ -49,6 +76,11 @@ function __nfsi_ndirty:long (inode:long) %{ /* pure */
function __nfs_server_rsize:long (inode:long) %{ /* pure */
struct inode * inode = (struct inode *)(THIS->inode);
+ if(inode == NULL)
+ {
+ THIS->__retvalue = -1;
+ return;
+ }
THIS->__retvalue = NFS_SERVER(inode)->rsize;
%}
@@ -56,6 +88,11 @@ function __nfs_server_rsize:long (inode:long) %{ /* pure */
function __nfs_server_wsize:long (inode:long) %{ /* pure */
struct inode * inode = (struct inode *)(THIS->inode);
+ if(inode == NULL)
+ {
+ THIS->__retvalue = -1;
+ return;
+ }
THIS->__retvalue = NFS_SERVER(inode)->wsize;
%}
@@ -63,49 +100,124 @@ function __nfs_server_wsize:long (inode:long) %{ /* pure */
function __nfs_rpages:long (inode:long) %{ /* pure */
struct inode * inode = (struct inode *)(THIS->inode);
+ if(inode == NULL)
+ {
+ THIS->__retvalue = -1;
+ return;
+ }
THIS->__retvalue = NFS_SERVER(inode)->rpages;
%}
/*Get wpages from struct inode*/
function __nfs_wpages:long(inode:long) %{ /* pure */
struct inode *inode = (struct inode*)(THIS->inode);
+ if(inode == NULL)
+ {
+ THIS->__retvalue = -1;
+ return;
+ }
THIS->__retvalue = NFS_SERVER(inode)->wpages;
%}
/*Get struct inode from struct page*/
function __p2i :long(page:long) %{ /* pure */
struct page *page = (struct page *)(THIS->page);
- THIS->__retvalue = (long)page->mapping->host;
+
+ if ((page == NULL) || (page->mapping == NULL)) {
+ THIS->__retvalue = 0;
+ return;
+ }
+
+ THIS->__retvalue = deref(sizeof(page->mapping->host),
+ &(page->mapping->host));
+ if (0) {
+deref_fault:
+ CONTEXT->last_error = "pointer dereference fault";
+ }
%}
/*Get i_flags from struct page*/
function __p2i_flag : long (page:long) %{ /* pure */
struct page *page = (struct page *) (THIS->page);
- THIS->__retvalue = page->mapping->host->i_flags;
+
+ if ((page == NULL) || (page->mapping == NULL) \
+ ||(page->mapping->host == NULL)) {
+ THIS->__retvalue = -1;
+ return;
+ }
+
+ THIS->__retvalue = deref(sizeof(page->mapping->host->i_flags),
+ &(page->mapping->host->i_flags));
+ if (0) {
+deref_fault:
+ CONTEXT->last_error = "pointer dereference fault";
+ }
%}
/*Get i_state from struct page*/
function __p2i_state :long (page:long) %{ /* pure */
struct page *page = (struct page *) (THIS->page);
- THIS->__retvalue = page->mapping->host->i_state;
+
+ if ((page == NULL) || (page->mapping == NULL) \
+ ||(page->mapping->host == NULL)) {
+ THIS->__retvalue = -1;
+ return;
+ }
+
+ THIS->__retvalue = deref(sizeof(page->mapping->host->i_state),
+ &(page->mapping->host->i_state));
+ if (0) {
+deref_fault:
+ CONTEXT->last_error = "pointer dereference fault";
+ }
%}
/*Get i_size from struct page*/
function __p2i_size :long (page:long) %{ /* pure */
struct page *page = (struct page *) (THIS->page);
- THIS->__retvalue = page->mapping->host->i_size;
+
+ if ((page == NULL) || (page->mapping == NULL) \
+ ||(page->mapping->host == NULL)) {
+ THIS->__retvalue = -1;
+ return;
+ }
+
+ THIS->__retvalue = deref(sizeof(page->mapping->host->i_size),
+ &(page->mapping->host->i_size));
+ if (0) {
+deref_fault:
+ CONTEXT->last_error = "pointer dereference fault";
+ }
%}
/*Get s_flags from struct page*/
function __p2sb_flag:long (page:long) %{ /* pure */
struct page *page = (struct page *)(THIS->page);
- THIS->__retvalue = page->mapping->host->i_sb->s_flags;
+
+ if ((page == NULL) || (page->mapping == NULL) \
+ ||(page->mapping->host == NULL)) {
+ THIS->__retvalue = -1;
+ return;
+ }
+
+ THIS->__retvalue = deref(sizeof(page->mapping->host->i_flags),
+ &(page->mapping->host->i_flags));
+ if (0) {
+deref_fault:
+ CONTEXT->last_error = "pointer dereference fault";
+ }
%}
function __d_loff_t :long (ppos :long) %{ /* pure */
- loff_t * ppos = (loff_t *) (THIS->ppos);
+ loff_t * ppos = (loff_t *) (THIS->ppos);
- THIS->__retvalue =(long) *ppos;
+ if (ppos == NULL)
+ {
+ THIS->__retvalue = -1;
+ return;
+ }
+
+ THIS->__retvalue = *ppos;
%}
probe nfs.fop.entries = nfs.fop.llseek,
@@ -252,7 +364,6 @@ probe nfs.fop.aio_read = kernel.function ("nfs_file_read") ?,
cache_time = __nfsi_rcache_time($iocb->ki_filp->f_dentry->d_inode)
attr_time = __nfsi_attr_time($iocb->ki_filp->f_dentry->d_inode)
- flag = $iocb->ki_filp->f_flags
name = "nfs.fop.aio_read"
argstr = sprintf("%p,%d, %d",buf,count, pos)
diff --git a/tapset/nfsd.stp b/tapset/nfsd.stp
index 15d170f2..9c7947ed 100644
--- a/tapset/nfsd.stp
+++ b/tapset/nfsd.stp
@@ -737,8 +737,7 @@ probe nfsd.return= nfsd.open.return,
nfsd.create.return,
nfsd.createv3.return,
nfsd.unlink.return,
- nfsd.rename,return,
- nfsd.close.return
+ nfsd.rename.return
{}
/*probe nfsd.open
* Fires when server opens a file
diff --git a/tapset/vfs.stp b/tapset/vfs.stp
index 94535fe7..4334f7c5 100644
--- a/tapset/vfs.stp
+++ b/tapset/vfs.stp
@@ -72,11 +72,11 @@ deref_fault:
function __page_bdev:long (page:long) %{ /* pure */
struct page *page = (struct page *)(long)THIS->page;
if ((page == NULL) || (page->mapping == NULL)) {
- THIS->__retvalue = -1;
+ THIS->__retvalue = 0;
return;
}
THIS->__retvalue = deref(sizeof(page->mapping->host->i_sb->s_bdev),
- &(page->mapping->host->i_sb->s_dev));
+ &(page->mapping->host->i_sb->s_bdev));
if (0) {
deref_fault:
CONTEXT->last_error = "pointer dereference fault";
@@ -137,9 +137,10 @@ probe generic.fop.aio_write = kernel.function ("generic_file_aio_write")
count = $count
pos = $pos
+ buf = $buf
name = "generic_file_aio_write"
- argstr = sprintf("%d, %d", count, pos)
+ argstr = sprintf("%d, %d ,%p", count, pos,buf)
size = count
units = "bytes"
@@ -238,10 +239,10 @@ probe generic.fop.open = kernel.function ("generic_file_open")
filename = kernel_string($filp->f_dentry->d_name->name)
flag = $filp->f_flags
- size = $inode->size
+ size = $inode->i_size
name = "generic_file_open"
- argstr = sprintf("%d, %s", ino, flag, filename)
+ argstr = sprintf("%d,%d, %s", ino, flag, filename)
}
probe generic.fop.open.return = kernel.function ("generic_file_open").return
{
@@ -432,9 +433,10 @@ probe vfs.do_sync_write = kernel.function ("do_sync_write")
len = $len
pos = ppos_pos($ppos)
+ buf = $buf
name = "do_sync_write"
- argstr = sprintf("%d, %d", len, pos)
+ argstr = sprintf("%d, %d , %p", len, pos, buf)
size = len
units = "bytes"
@@ -476,9 +478,9 @@ probe vfs.block_sync_page.return = kernel.function ("block_sync_page").return
probe vfs.buffer_migrate_page = kernel.function ("buffer_migrate_page")
{
- dev = $page->mapping->host->i_sb->s_dev
- devname = __find_bdevname(dev, $page->mapping->host->i_sb->s_dev)
- ino = $page->mapping->host->i_ino
+ dev = __page_dev($page)
+ ino = __page_ino($page)
+ devname = __find_bdevname(dev,__page_bdev($page))
page_index = $page->index