diff options
author | guanglei <guanglei> | 2006-08-25 10:19:20 +0000 |
---|---|---|
committer | guanglei <guanglei> | 2006-08-25 10:19:20 +0000 |
commit | 30da8acfcbaef6bf88d806b8ded4195b88df7f39 (patch) | |
tree | 944d7eebe98b428e9ab2b908a6605e6a6fbd4c65 /tapset/nfs.stp | |
parent | 6811f21e6c6bd1e2b647521617cfcffe98057b67 (diff) | |
download | systemtap-steved-30da8acfcbaef6bf88d806b8ded4195b88df7f39.tar.gz systemtap-steved-30da8acfcbaef6bf88d806b8ded4195b88df7f39.tar.xz systemtap-steved-30da8acfcbaef6bf88d806b8ded4195b88df7f39.zip |
bug fix and more error checking for nfs tapsets
Diffstat (limited to 'tapset/nfs.stp')
-rw-r--r-- | tapset/nfs.stp | 135 |
1 files changed, 123 insertions, 12 deletions
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) |