diff options
-rw-r--r-- | tapset/ChangeLog | 5 | ||||
-rw-r--r-- | tapset/nfs.stp | 135 | ||||
-rw-r--r-- | tapset/nfsd.stp | 3 | ||||
-rw-r--r-- | tapset/vfs.stp | 20 |
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 |