diff options
author | guanglei <guanglei> | 2006-08-23 09:05:29 +0000 |
---|---|---|
committer | guanglei <guanglei> | 2006-08-23 09:05:29 +0000 |
commit | 66cd5eb80666407f4f790a6cdd85e337d6b11838 (patch) | |
tree | bd3a16af6262447a34675ff8a8dc889a11fbf090 | |
parent | 13d2ecdb6895bc9f2e0d1db9db478a953f3c1efe (diff) | |
download | systemtap-steved-66cd5eb80666407f4f790a6cdd85e337d6b11838.tar.gz systemtap-steved-66cd5eb80666407f4f790a6cdd85e337d6b11838.tar.xz systemtap-steved-66cd5eb80666407f4f790a6cdd85e337d6b11838.zip |
vfs.stp:
New tapset from Thomas Zanussi(trz@us.ibm.com) to probe vfs layer activities.
nfs.stp:
New tapset from Li Xuepeng(xuepengl@cn.ibm.com) to probe nfs file operations
and nfs address space operations on client side.
nfs_proc.stp:
New tapset from Li Xuepeng to probe some nfs RPC procedure stub functions
on client side.
nfsd.stp:
New tapset from Li Xuepeng to probe nfs server side activities, including
some RPC procedure stub functions, nfsd dispatch routine, and nfsd_* functions
-rw-r--r-- | tapset/ChangeLog | 12 | ||||
-rw-r--r-- | tapset/nfs.stp | 999 | ||||
-rw-r--r-- | tapset/nfs_proc.stp | 1443 | ||||
-rw-r--r-- | tapset/nfsd.stp | 1059 | ||||
-rw-r--r-- | tapset/vfs.stp | 592 |
5 files changed, 4105 insertions, 0 deletions
diff --git a/tapset/ChangeLog b/tapset/ChangeLog index 26af7d31..3a38486d 100644 --- a/tapset/ChangeLog +++ b/tapset/ChangeLog @@ -1,3 +1,15 @@ +2006-08-23 Li Guanglei <guanglei@cn.ibm.com> + + * vfs.stp: New tapset from Thomas Zanussi(trz@us.ibm.com) to probe + vfs layer activities. + * nfs.stp: New tapset from Li Xuepeng(xuepengl@cn.ibm.com) to probe + nfs file operations and nfs address space operations on client side. + * nfs_proc.stp: New tapset from Li Xuepeng to probe some nfs RPC + procedure stub functions on client side. + * nfsd.stp: New tapset from Li Xuepeng to probe nfs server side + activities, including some RPC procedure stub functions, nfsd + dispatch routine, and nfsd_* functions + 2006-08-22 Li Guanglei <guanglei@cn.ibm.com> * signal.stp: More variables for signal.do_action and diff --git a/tapset/nfs.stp b/tapset/nfs.stp new file mode 100644 index 00000000..e1609dad --- /dev/null +++ b/tapset/nfs.stp @@ -0,0 +1,999 @@ +%{ +#include <linux/kernel.h> +#include <linux/nfs_fs.h> +%} +/*Get struct nfs_inode from struct inode*/ +%{ + struct nfs_inode * __nfs_i (struct inode *inode) + { + struct nfs_inode * nfsi = NFS_I(inode); + + return (nfsi); + } +%} + +/*Get cache_validity flag from struct inode*/ +function __nfsi_cache_valid:long(inode:long) %{ /* pure */ + struct inode * inode = (struct inode *)(THIS->inode); + struct nfs_inode * nfsi; + + nfsi = __nfs_i(inode); + THIS->__retvalue = nfsi->cache_validity; +%} + +/*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); + + THIS->__retvalue = nfsi->read_cache_jiffies; +%} + +/*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); + + THIS->__retvalue = nfsi->attrtimeo; +%} + +/*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); + + THIS->__retvalue = nfsi->ndirty; +%} + +/*Get rsize from struct inode*/ +function __nfs_server_rsize:long (inode:long) %{ /* pure */ + struct inode * inode = (struct inode *)(THIS->inode); + + THIS->__retvalue = NFS_SERVER(inode)->rsize; +%} + +/*Get wsize from struct inode*/ +function __nfs_server_wsize:long (inode:long) %{ /* pure */ + struct inode * inode = (struct inode *)(THIS->inode); + + THIS->__retvalue = NFS_SERVER(inode)->wsize; +%} + +/*Get rpages from struct inode*/ +function __nfs_rpages:long (inode:long) %{ /* pure */ + struct inode * inode = (struct inode *)(THIS->inode); + + 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); + 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; +%} + +/*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; +%} + +/*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; +%} + +/*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; +%} + +/*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; +%} + +function __d_loff_t :long (ppos :long) %{ /* pure */ + loff_t * ppos = (loff_t *) (THIS->ppos); + + THIS->__retvalue =(long) *ppos; +%} + +probe nfs.fop.entries = nfs.fop.llseek, + nfs.fop.read, + nfs.fop.write, + nfs.fop.aio_read, + nfs.fop.aio_write, + nfs.fop.mmap, + nfs.fop.open, + nfs.fop.flush, + nfs.fop.release, + nfs.fop.fsync, + nfs.fop.lock, + nfs.fop.sendfile +{ +} + +probe nfs.fop.return = nfs.fop.llseek.return, + nfs.fop.read.return, + nfs.fop.write.return, + nfs.fop.aio_read.return, + nfs.fop.aio_write.return, + nfs.fop.mmap.return, + nfs.fop.open.return, + nfs.fop.flush.return, + nfs.fop.release.return, + nfs.fop.fsync.return, + nfs.fop.lock.return, + nfs.fop.sendfile.return +{ +} + +/*probe nfs.fop.llseek + * + * Fires when do a llseek operation on nfs,it probes + * llseek file operation of nfs + * + * Arguments: + * dev : device identifier + * ino : inode number + * offset : the offset of the file will be repositioned + * origin : the original position. The possible value could be: + * SEEK_SET + * The offset is set to offset bytes. + * SEEK_CUR + * The offset is set to its current location plus offset bytes. + * SEEK_END + * The offset is set to the size of the file plus offset bytes. + * +*/ +probe nfs.fop.llseek = kernel.function ("nfs_file_llseek") ?, + module("nfs").function("nfs_file_llseek") ? +{ + dev = $filp->f_dentry->d_inode->i_sb->s_dev + ino = $filp->f_dentry->d_inode->i_ino + maxbyte = $filp->f_dentry->d_inode->i_sb->s_maxbytes + offset = $offset + origin = $origin + + name = "nfs.fop.llseek" + argstr = sprintf("%d, %d", offset, origin) +} + +probe nfs.fop.llseek.return = kernel.function ("nfs_file_llseek").return ?, + module("nfs").function("nfs_file_llseek").return ? +{ + name = "nfs.fop.llseek.return" + retstr = sprintf("%d", $return) +} +/*probe nfs.fop.read + * + * Fires when do a read operation on nfs,it probes + * read file operation of nfs + * + * Arguments: + * + * +*/ +probe nfs.fop.read = vfs.do_sync_read +{ + name = "nfs.fop.read" +} + +probe nfs.fop.read.return = vfs.do_sync_read.return +{ + name = "nfs.fop.read.return" +} + +/*probe nfs.fop.write + * + * Fires when do a write operation on nfs,it probes + * write file operation of nfs + * + * Arguments: + * + * +*/ + +probe nfs.fop.write = vfs.do_sync_write +{ + name = "nfs.fop.write" +} + +probe nfs.fop.write.return = vfs.do_sync_write.return +{ + name = "nfs.fop.write.return" +} + +/*probe nfs.fop.aio_read + * + * It probes aio_read file operation of nfs + * + * Arguments: + * dev : device identifier + * ino : inode number + * count : read bytes + * pos : current position of file + * buf : the address of buf in user space + * parent_name : parent dir name + * file_name : file name + * cache_valid : cache related bit mask flag + * cache_time : when we started read-caching this inode + * attrtimeo : how long the cached information is assumed + * to be valid. + * We need to revalidate the cached attrs for this inode if + * + * jiffies - read_cache_jiffies > attrtimeo +*/ +probe nfs.fop.aio_read = kernel.function ("nfs_file_read") ?, + module("nfs").function("nfs_file_read") ? +{ + dev = $iocb->ki_filp->f_dentry->d_inode->i_sb->s_dev + ino = $iocb->ki_filp->f_dentry->d_inode->i_ino + + count = $count + pos = $pos + buf = $buf + + parent_name = kernel_string($iocb->ki_filp->f_dentry->d_parent->d_name->name) + file_name = kernel_string($iocb->ki_filp->f_dentry->d_name->name) + + + cache_valid = __nfsi_cache_valid($iocb->ki_filp->f_dentry->d_inode) + 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) + + size = count + units = "bytes" +} + + +probe nfs.fop.aio_read.return = kernel.function ("nfs_file_read").return ?, + module("nfs").function("nfs_file_read").return ? +{ + name = "nfs.fop.aio_read.return" + retstr = sprintf("%d", $return) + + if ($return > 0) { + size = $return + units = "bytes" + } +} + +/*probe nfs.fop.aio_write + * + * It probes aio_write file operation of nfs + * + * Arguments: + * dev : device identifier + * ino : inode number + * count : read bytes + * pos : offset of the file + * buf : the address of buf in user space + * parent_name : parent dir name + * file_name : file name + * +*/ +probe nfs.fop.aio_write = kernel.function("nfs_file_write") ?, + module("nfs").function("nfs_file_write") ? +{ + dev = $iocb->ki_filp->f_dentry->d_inode->i_sb->s_dev + ino = $iocb->ki_filp->f_dentry->d_inode->i_ino + + count = $count + pos = $pos + buf = $buf + + parent_name = kernel_string($iocb->ki_filp->f_dentry->d_parent->d_name->name) + file_name = kernel_string($iocb->ki_filp->f_dentry->d_name->name) + + name = "nfs.fop.aio.write" + argstr = sprintf("%p, %d, %d", buf, count, pos) + + size = count + units = "bytes" +} + +probe nfs.fop.aio_write.return = kernel.function("nfs_file_write").return ?, + module("nfs").function("nfs_file_write").return ? +{ + name = "nfs.fop.aio_write.return" + retstr = sprintf("%d", $return) + + if ($return > 0) { + size = $return + units = "bytes" + } +} + +/*probe nfs.fop.mmap + * + * Fires when do an mmap operation on nfs, + * it probes mmap operation of nfs + * + * Arguments: + * dev : device identifier + * ino : inode number + * vm_start : start address within vm_mm + * vm_end : the first byte after end address within vm_mm + * vm_flag : vm flags + * buf : the address of buf in user space + * parent_name : parent dir name + * file_name : file name + * cache_valid : cache related bit mask flag + * cache_time : when we started read-caching this inode + * attrtimeo : how long the cached information is assumed + * to be valid. + * We need to revalidate the cached attrs for this inode if + * + * jiffies - read_cache_jiffies > attrtimeo +*/ +probe nfs.fop.mmap = kernel.function("nfs_file_mmap") ?, + module("nfs").function("nfs_file_mmap") ? +{ + dev = $file->f_dentry->d_inode->i_sb->s_dev + ino = $file->f_dentry->d_inode->i_ino + + vm_start = $vma->vm_start + vm_end = $vma->vm_end + vm_flags = $vma->vm_flags + + parent_name = kernel_string($file->f_dentry->d_parent->d_name->name) + file_name = kernel_string($file->f_dentry->d_name->name) + + cache_valid = __nfsi_cache_valid($file->f_dentry->d_inode) + cache_time = __nfsi_rcache_time($file->f_dentry->d_inode) + attr_time = __nfsi_attr_time($file->f_dentry->d_inode) + + name = "nfs.fop.mmap" + argstr = sprintf("0x%x, 0x%x, 0x%x", vm_start, vm_end, vm_flags) +} + +probe nfs.fop.mmap.return = kernel.function("nfs_file_mmap").return ?, + module("nfs").function("nfs_file_mmap").return ? +{ + name = "nfs.fop.mmap.return" + retstr = sprintf("%d", $return) +} + +/*probe nfs.fop.open + * + * Fires when do an open operation on nfs, + * it probes open file operation of nfs + * + * Arguments: + * dev : device identifier + * ino : inode number + * file_name : file name + * flag : file flag + * i_size : file length in bytes +*/ +probe nfs.fop.open = kernel.function("nfs_file_open") ?, + module("nfs").function("nfs_file_open") ? +{ + dev = $filp->f_dentry->d_inode->i_sb->s_dev + ino = $inode->i_ino + + filename = kernel_string($filp->f_dentry->d_name->name) + flag = $filp->f_flags + + i_size = $inode->i_size + + name = "nfs.fop.open" + argstr = sprintf("%d,%d, %s", flag, ino, filename) +} + +probe nfs.fop.open.return = kernel.function("nfs_file_open").return ?, + module("nfs").function("nfs_file_open").return ? +{ + name = "nfs.fop.open.return" + retstr = sprintf("%d", $return) +} + +/*probe nfs.fop.flush + * + * Fires when do a flush file operation on nfs, + * it probes flush file operation of nfs + * + * Arguments: + * dev : device identifier + * ino : inode number + * mode : file mode + * ndirty : number of dirty page +*/ +probe nfs.fop.flush = kernel.function("nfs_file_flush") ?, + module("nfs").function("nfs_file_flush") ? +{ + dev = $file->f_dentry->d_inode->i_sb->s_dev + ino = $file->f_dentry->d_inode->i_ino; + + mode = $file->f_mode + ndirty = __nfsi_ndirty($file->f_dentry->d_inode) + + name = "nfs.fop.flush" + argstr = sprintf("%d",ino) +} + +probe nfs.fop.flush.return = kernel.function("nfs_file_flush").return ?, + module("nfs").function("nfs_file_flush").return ? +{ + name = "nfs.fop.flush.return" + retstr = sprintf("%d",$return) +} + +/*probe nfs.fop.release + * + * Fires when do a release page operation on nfs, + * it probes release file operation of nfs + * + * Arguments: + * dev : device identifier + * ino : inode number + * mode : file mode +*/ +probe nfs.fop.release = kernel.function("nfs_file_release") ?, + module("nfs").function("nfs_file_release") ? +{ + dev = $filp->f_dentry->d_inode->i_sb->s_dev + ino = $inode->i_ino + + mode = $filp->f_mode + + name = "nfs.fop.release" + argstr = sprintf("%d" , ino) +} + +probe nfs.fop.release.return = kernel.function("nfs_file_release").return ?, + module("nfs").function("nfs_file_release").return ? +{ + name = "nfs.fop.release.return" + retstr = sprintf("%d", $return) +} + +/*probe nfs.fop.fsync + * + * Fires when do a fsync operation on nfs, + * it probes fsync file operation of nfs + * + * Arguments: + * dev : device identifier + * ino : inode number + * ndirty : number of dirty pages +*/ +probe nfs.fop.fsync = kernel.function("nfs_fsync") ?, + module("nfs").function("nfs_fsync") ? +{ + dev = $file->f_dentry->d_inode->i_sb->s_dev + ino = $file->f_dentry->d_inode->i_ino + + ndirty = __nfsi_ndirty($file->f_dentry->d_inode) + + name = "nfs.fop.fsync" + argstr = sprintf("%d",ino) +} + +probe nfs.fop.fsync.return = kernel.function("nfs_fsync").return ?, + module("nfs").function("nfs_fsync").return ? +{ + name = "nfs.fop.fsync.return" + retstr = sprintf("%d", $return) +} + +/*probe nfs.fop.lock + * + * Fires when do a file lock operation on nfs, + * it probes lock file operation of nfs + * + * Arguments: + * dev : device identifier + * ino : inode number + * i_mode : file type and access rights + * cmd : cmd arguments + * fl_type :lock type + * fl_flag : lock flags + * fl_start : starting offset of locked region + * fl_end : ending offset of locked region +*/ +probe nfs.fop.lock = kernel.function("nfs_lock") ?, + module("nfs").function("nfs_lock") ? +{ + dev = $filp->f_dentry->d_inode->i_sb->s_dev + ino = $filp->f_dentry->d_inode->i_ino + + i_mode = $filp->f_dentry->d_inode->i_mode + cmd = $cmd + + fl_type = $fl->fl_type + fl_flag = $fl->fl_flags + fl_start = $fl->fl_start + fl_end = $fl->fl_end + + name = "nfs.fop.lock" + argstr = sprintf("%d,%d",cmd,i_mode) +} + +probe nfs.fop.lock.return = kernel.function("nfs_lock").return ?, + module("nfs").function("nfs_lock").return ? +{ + name = "nfs.fop.lock.return" + retstr = sprintf("%d",$return) +} + + +/*probe nfs.fop.sendfile + * + * Fires when do a send file operation on nfs, + * it probes sendfile file operation of nfs + * + * Arguments: + * dev : device identifier + * ino : inode number + * count : read bytes + * ppos : current position of file + * cache_valid : cache related bit mask flag + * cache_time : when we started read-caching this inode + * attrtimeo : how long the cached information is assumed + * to be valid. + * We need to revalidate the cached attrs for this inode if + * + * jiffies - read_cache_jiffies > attrtimeo +*/ +probe nfs.fop.sendfile = kernel.function("nfs_file_sendfile") ?, + module("nfs").function("nfs_file_sendfile") ? +{ + + dev = $filp->f_dentry->d_inode->i_sb->s_dev + ino = $filp->f_dentry->d_inode->i_ino + + count = $count + ppos = __d_loff_t($ppos) + + cache_valid = __nfsi_cache_valid($filp->f_dentry->d_inode) + cache_time = __nfsi_rcache_time($filp->f_dentry->d_inode) + attr_time = __nfsi_attr_time($filp->f_dentry->d_inode) + + + name = "nfs.fop.sendfile" + argstr = sprintf("%d,%d", count,ppos) + + size = count + units = "bytes" +} + +probe nfs.fop.sendfile.return = kernel.function("nfs_file_sendfile").return ?, + module("nfs").function("nfs_file_sendfile").return ? +{ + name = "nfs.fopsendfile.return" + retstr = sprintf("%d", $return) + + if ($return > 0) { + size = $return + units = "bytes" + } +} + +/*probe nfs.fop.check_flags + * + * Fires when do a checking flag operation on nfs, + * it probes check_flag file operation of nfs + * + * Arguments: + * flag : file flag +*/ +probe nfs.fop.check_flags = kernel.function("nfs_check_flags") ?, + module("nfs").function("nfs_check_flags") ? +{ + flag = $flags + + name = "nfs.fop.check_flags" + argstr = sprintf("%d",flag) +} + +probe nfs.fop.check_flags.return = kernel.function("nfs_check_flags").return ?, + module("nfs").function("nfs_check_flags").return ? +{ + name = "nfs.fop.check_flags.return" + retstr = sprintf("%d",$return) +} + +probe nfs.aop.entries = nfs.aop.readpage, + nfs.aop.readpages, + nfs.aop.writepage, + nfs.aop.writepages, + nfs.aop.prepare_write, + nfs.aop.commit_write, + nfs.aop.release_page +{ +} + +probe nfs.aop.return = nfs.aop.readpage.return, + nfs.aop.readpages.return, + nfs.aop.writepage.return, + nfs.aop.writepages.return, + nfs.aop.prepare_write.return, + nfs.aop.commit_write.return, + nfs.aop.release_page.return +{ +} + +/* probe nfs.aop.readpage + * + * Read the page ,only fies when a previous async + * read operation failed + * + * Arguments: + * __page : the address of page + * dev : device identifier + * ino : inode number + * i_flag : file flags + * i_size : file length in bytes + * sb_flag : super block flags + * file : file argument + * page_index : offset within mapping, can used a + page identifier and position identifier + in the page frame + * rsize : read size (in bytes) + * size : number of pages to be read in this execution + */ +probe nfs.aop.readpage = kernel.function ("nfs_readpage") ?, + module("nfs").function ("nfs_readpage") ? +{ + __page = $page + dev = __page_dev(__page) + ino = __page_ino(__page) + + i_flag = __p2i_flag($page) + i_size = __p2i_size($page) + + sb_flag = __p2sb_flag($page) + + file = $file + page_index = $page->index + + __inode = __p2i($page) + rsize = __nfs_server_rsize(__inode) + + name = "nfs.aop.readpage" + argstr = sprintf("%d,%d" , page_index,r_size) + + size = 1 + units = "pages" +} + +probe nfs.aop.readpage.return = kernel.function ("nfs_readpage").return ?, + module("nfs").function ("nfs_readpage").return ? +{ + name = "nfs.aop.readpage.return" + retstr = sprintf("%d", $return) + + size = 1 + units = "pages" +} + +/* probe nfs.aop.readpages + * + * Fies when in readahead way,read several pages once + * Arguments: + * dev : device identifier + * ino : inode number + * nr_pages : number of pages to be read in this execution + * file : filp argument + * rpages : read size (in pages) + * rsize : read size (in bytes) + * size : number of pages to be read in this execution + */ +probe nfs.aop.readpages = kernel.function ("nfs_readpages") ?, + module("nfs").function ("nfs_readpages") ? +{ + dev = $mapping->host->i_sb->s_dev + ino = $mapping->host->i_ino + + nr_pages = $nr_pages + file = $filp + + rpages = __nfs_rpages($mapping->host) + rsize = __nfs_server_rsize($mapping->host) + + name = "nfs.aop.readpages" + argstr = sprintf("%d" , nr_pages) + + size = nr_pages + units = "pages" +} + +probe nfs.aop.readpages.return = kernel.function ("nfs_readpages").return ?, + module("nfs").function ("nfs_readpages").return ? +{ + name = "nfs.aop.readpages.return" + retstr = sprintf("%d", $return) + + + if($return > 0 ) + { + size = retstr + } + units = "pages" +} +/*probe nfs.aop.set_page_dirty + * + * __set_page_dirty_nobuffers is used to set a page dirty,but + * not all the buffers. + * + * Arguments: + * __page : the address of page + * page_flag : page flags +*/ +probe nfs.aop.set_page_dirty = + kernel.function ("__set_page_dirty_nobuffers") ?, + module("nfs").function ("__set_page_dirty_nobuffers") ? +{ + /* dev = $mapping->host->i_sb->s_dev + devname = __find_bdevname(dev, $mapping->host->i_sb->s_bdev) + ino = $mapping->host->i_ino +*/ + __page = $page + page_flag = $page->flags + + name = "nfs.aop.set_page_dirty" + argstr = sprintf("%d",flag) +} + +probe nfs.aop.set_page_dirty.return = + kernel.function ("__set_page_dirty_nobuffers") .return?, + module("nfs").function ("__set_page_dirty_nobuffers").return ? +{ + name = "nfs.aop.set_page_dirty.return" + retstr = sprintf("%d", $return) +} + +/*probe nfs.aop.writepage + * + * Write an mapped page to the server + * + * Arguments: + * __page : the address of page + * dev : device identifier + * ino : inode number + * for_reclaim : a flag of writeback_control, indicates if it's invoked from the page allocator + * for_kupdate : a flag of writeback_control, indicates if it's a kupdate writeback + * The priority of wb is decided by above two flags + * i_flag : file flags + * i_size : file length in bytes + * i_state : inode state flags + * sb_flag : super block flags + * page_index : offset within mapping, can used a + page identifier and position identifier + in the page frame + * wsize : write size + * size : number of pages to be written in this execution +*/ +probe nfs.aop.writepage = kernel.function ("nfs_writepage") ?, + module("nfs").function ("nfs_writepage") ? +{ + __page = $page + dev = __page_dev(__page) + ino = __page_ino(__page) + + + for_reclaim = $wbc->for_reclaim + for_kupdate = $wbc->for_kupdate + + i_flag = __p2i_flag($page) + i_state = __p2i_state($page) + i_size = __p2i_size($page) + + sb_flag = __p2sb_flag($page) + + + page_index = $page->index + + __inode = __p2i($page) + wsize = __nfs_server_wsize(__inode) + + name = "nfs.aop.writepage" + argstr = sprintf("%d",page_index) + + size = 1 + units = "pages" +} + +probe nfs.aop.writepage.return = kernel.function ("nfs_writepage").return ?, + module("nfs").function ("nfs_writepage").return ? +{ + name = "nfs.aop.writepage.return" + retstr = sprintf("%d", $return) +} + +/*probe nfs.aop.writepages + * Write several dirty pages to the serve + *Arguments: + * dev : device identifier + * ino : inode number + * for_reclaim : a flag of writeback_control, indicates if it's invoked from the page allocator + * for_kupdate : a flag of writeback_control, indicates if it's a kupdate writeback + * The priority of wb is decided by above two flags + * wsize : write size + * wpages : write size (in pages) + * nr_to_write : number of pages to be written in this execution + * size : number of pages to be written in this execution +*/ +probe nfs.aop.writepages = kernel.function ("nfs_writepages") ?, + module("nfs").function ("nfs_writepages") ? +{ + dev = $mapping->host->i_sb->s_dev + ino = $mapping->host->i_ino + + for_reclaim = $wbc->for_reclaim + for_kupdate = $wbc->for_kupdate + nr_to_write = $wbc->nr_to_write + + wsize = __nfs_server_wsize($mapping->host) + wpages = __nfs_wpages($mapping->host) + + name = "nfs.aop.writepages" + argstr = sprintf("%d",nr_to_write) + + size = nr_to_write + units = "pages" +} + +probe nfs.aop.writepages.return = kernel.function ("nfs_writepages").return ?, + module("nfs").function ("nfs_writepages").return ? +{ + name = "nfs.aop.writepages.return" + retstr = sprintf("%d", $return) +} +/*probe nfs.aop.prepare_write + * Fires when do write operation on nfs. + * Prepare a page for writing + * Look for a request corresponding to the page. If there + * is one, and it belongs to another file, we flush it out + * before we try to copy anything into the page. + * Also do the same if we find a request from an existing + * dropped page + * + * Arguments: + * __page : the address of page + * dev : device identifier + * ino : inode number + * offset : start address of this write operation + * to : end address of this write operation + * page_index : offset within mapping, can used a + page identifier and position identifier + in the page frame + * size : read bytes +*/ +probe nfs.aop.prepare_write= kernel.function ("nfs_prepare_write") ?, + module("nfs").function ("nfs_prepare_write") ? +{ + dev = __page_dev(__page) + devname = __find_bdevname(dev, __page_bdev(__page)) + ino = __page_ino(__page) + + offset = $offset + to = $to + + page_index = $page->index + __page = $page + + name = "nfs.aop.prepare_write" + argstr = sprintf("%d", page_index) + + size = to - offset + units = "bytes" +} + +probe nfs.aop.prepare_write.return = + kernel.function ("nfs_prepare_write").return ?, + module("nfs").function ("nfs_prepare_write").return ? +{ + name = "nfs.aop.nfs_prepare_write.return" + retstr = sprintf("%d", $return) +} + +/*probe nfs.aop.commit_write + * Fires when do a write operation on nfs, + * often after prepare_write + * + * Update and possibly write a cached page of an NFS file + * + * Arguments: + * __page : the address of page + * dev : device identifier + * ino : inode number + * offset : start address of this write operation + * to : end address of this write operation + * i_flag : file flags + * i_size : file length in bytes + * sb_flag : super block flags + * page_index : offset within mapping, can used a + page identifier and position identifier + in the page frame + * size : read bytes + */ +probe nfs.aop.commit_write= kernel.function ("nfs_commit_write") ?, + module("nfs").function ("nfs_commit_write") ? +{ + __page = $page + dev = __page_dev(__page) + ino = __page_ino(__page) + + offset = $offset + to = $to + + + i_flag = __p2i_flag($page) + i_size = __p2i_size($page) + + sb_flag = __p2sb_flag($page) + + page_index = $page->index + + name = "nfs.aop.commit_write" + argstr = sprintf("%d, %d",offset , to) + + size = to - offset + units = "bytes" +} + + +probe nfs.aop.commit_write.return= + kernel.function ("nfs_commit_write").return ?, + module("nfs").function ("nfs_commit_write").return? +{ + name = "nfs.aop.nfs_commit_write.return" + retstr = sprintf("%d", $return) +} + +/*probe nfs.aop.release_page + * Fires when do a release operation on nfs, + * + * + * Arguments: + * __page : the address of page + * dev : device identifier + * ino : inode number + * page_index : offset within mapping, can used a + page identifier and position identifier + in the page frame + * size : release pages +*/ +probe nfs.aop.release_page = kernel.function ("nfs_release_page") ?, + module("nfs").function ("nfs_release_page")? +{ + __page = $page + dev = __page_dev(__page) + ino = __page_ino(__page) + +// gfp = $gfp + page_index = $page->index + + name = "nfs.aop.releasepage" + argstr = sprintf("%d", page_index) + + size = 1 + units = "pages" + +} + +probe nfs.aop.release_page.return = kernel.function ("nfs_release_page").return ?, + module("nfs").function ("nfs_release_page").return? +{ + name = "nfs.aop.nfs_release_page.return" + retstr = sprintf("%d", $return) +} + diff --git a/tapset/nfs_proc.stp b/tapset/nfs_proc.stp new file mode 100644 index 00000000..292b5af7 --- /dev/null +++ b/tapset/nfs_proc.stp @@ -0,0 +1,1443 @@ +%{ + #include <linux/nfs_fs.h> +%} + +%{ +/*Get ip address from a rpc_task*/ + __u32 get_ip(struct rpc_task *); +/*Get protocol types from a rpc_task*/ + int get_prot(struct rpc_task *); +%} +%{ + __u32 get_ip(struct rpc_task * task) + { + struct rpc_clnt * tk_client; + struct rpc_xprt * cl_xprt; + tk_client = task->tk_client; + cl_xprt= tk_client->cl_xprt; + + return cl_xprt->addr.sin_addr.s_addr; + } + int get_prot(struct rpc_task * task) + { + struct rpc_clnt * tk_client; + struct rpc_xprt * cl_xprt; + tk_client = task->tk_client; + cl_xprt= tk_client->cl_xprt; + + return cl_xprt->prot; + } +%} +/* + 0:get ip address + 1:get proto +*/ +function __i2n_ip_proto :long(dir:long,index:long) %{ /* pure */ + int index = (int) (THIS->index); + struct inode * dir = (struct inode *)(THIS->dir); + struct rpc_clnt * clnt = NFS_CLIENT(dir); + struct rpc_xprt * cl_xprt = clnt->cl_xprt; + struct sockaddr_in * addr = &(cl_xprt->addr); + + if(index == 0) + THIS->__retvalue = addr->sin_addr.s_addr; + else + THIS->__retvalue = cl_xprt->prot; +%} + +/* + 0:get ip address + 1:get proto +*/ +function __nfs_data_ip_proto:long (rdata :long,index :long) %{ /* pure */ + int index = (int)(THIS->index); + struct nfs_read_data * rdata = (struct nfs_read_data *)(THIS->rdata); + struct rpc_task *task = &(rdata->task); + + if(index == 0) + THIS->__retvalue = get_ip(task); + else + THIS->__retvalue = get_prot(task); +%} + +function __nfsv4_bitmask :long(dir:long,i:long) %{ /* pure */ + int i = (int) (THIS->i); + struct inode * dir = (struct inode *)(THIS->dir); + struct nfs_server * server = NFS_SERVER(dir); + + THIS->__retvalue = server->attr_bitmask[i]; + +%} + +function __getfh_inode :long(dir:long) %{ /* pure */ + struct inode * dir = (struct inode *)(THIS->dir); + struct nfs_fh * fh = NFS_FH(dir); + + THIS->__retvalue =(long) fh; +%} +probe nfs.proc.entries = nfs.proc.lookup, + nfs.proc.read, + nfs.proc.write, + nfs.proc.commit, + nfs.proc.read_setup, + nfs.proc.write_setup, + nfs.proc.commit_setup, + nfs.proc.read_done, + nfs.proc.write_done, + nfs.proc.commit_done, + nfs.proc.open, + nfs.proc.create, + nfs.proc.rename, + nfs.proc.remove, + nfs.proc.release +{ +} + + +probe nfs.proc.return = nfs.proc.lookup.return, + nfs.proc.read.return, + nfs.proc.write.return, + nfs.proc.commit.return, + nfs.proc.read_done.return, + nfs.proc.write_done.return, + nfs.proc.commit_done.return, + nfs.proc.open.return, + nfs.proc.create.return, + nfs.proc.rename.return, + nfs.proc.remove.return, + nfs.proc.release.return +{ +} + +/* +*probe nfs.proc.lookup +* +* Fires when client opens/searchs a file on server +* +* Arguments: +* server_ip : ip address of server +* prot : transfer protocol +* version : nfs version +* filename : the name of file which client opens/searchs on server +* name_len : the length of file name +* bitmask0: +* bitmask1 :V4 bitmask representing the set of attributes +* supported on this filesystem (only in probe nfs.proc4.lookup) +* +*/ +probe nfs.proc.lookup = nfs.proc2.lookup, + nfs.proc3.lookup, + nfs.proc4.lookup +{ +} + +probe nfs.proc.lookup.return = nfs.proc2.lookup.return, + nfs.proc3.lookup.return, + nfs.proc4.lookup.return +{} + +probe nfs.proc2.lookup = kernel.function("nfs_proc_lookup")?, + module("nfs").function("nfs_proc_lookup")? +{ + server_ip = __i2n_ip_proto($dir,0) + prot = __i2n_ip_proto($dir,1) + version = "NFSV2" + + filename = kernel_string($name->name) + name_len = $name->len + + name = "nfs.proc2.lookup" + argstr = sprintf("%s",filename) +} + +probe nfs.proc2.lookup.return = kernel.function("nfs_proc_lookup").return?, + module("nfs").function("nfs_proc_lookup").return? +{ + version = "NFSV2" + name = "nfs.proc2.lookup.return" + retstr = sprintf("%d", $return) +} + +probe nfs.proc3.lookup = kernel.function("nfs3_proc_lookup")?, + module("nfs").function("nfs3_proc_lookup")? +{ + + server_ip = __i2n_ip_proto($dir,0) + prot = __i2n_ip_proto($dir,1) + version = "NFSV3" + + filename = kernel_string($name->name) + name_len = $name->len + + name = "nfs.proc3.lookup" + argstr = sprintf("%s",filename) +} + + +probe nfs.proc3.lookup.return = kernel.function("nfs3_proc_lookup").return?, + module("nfs").function("nfs3_proc_lookup").return? +{ + version = "NFSV3" + name = "nfs.proc3.lookup.return" + retstr = sprintf("%d", $return) +} + +probe nfs.proc4.lookup = kernel.function("nfs4_proc_lookup")?, + module("nfs").function("nfs4_proc_lookup")? +{ + + server_ip = __i2n_ip_proto($dir,0) + prot = __i2n_ip_proto($dir,1) + version = "NFSV4" + + filename = kernel_string($name->name) + name_len = $name->len + bitmask0 = __nfsv4_bitmask($dir,0) + bitmask1 = __nfsv4_bitmask($dir,1) + + name = "nfs.proc4.lookup" + argstr = sprintf("%s",filename) +} + +probe nfs.proc4.lookup.return = kernel.function("nfs4_proc_lookup").return?, + module("nfs").function("nfs4_proc_lookup").return? +{ + version = "NFSV4" + name = "nfs.proc4.lookup.return" + retstr = sprintf("%d", $return) +} + +/* +*probe nfs.proc.read +* +* Fires when client synchronously reads file from server +* +* Arguments: +* server_ip : ip address of server +* prot : transfer protocol +* version : nfs version +* flags : used to set task->tk_flags in rpc_init_task function +* size: +* count : read bytes in this execution +* offset : the file offset +* +*/ +probe nfs.proc.read = nfs.proc2.read , + nfs.proc3.read , + nfs.proc4.read +{} + + +probe nfs.proc.read.return = nfs.proc2.read.return , + nfs.proc3.read.return , + nfs.proc4.read.return +{ +} + +probe nfs.proc2.read = kernel.function("nfs_proc_read") ?, + module("nfs").function("nfs_proc_read")? +{ + server_ip = __nfs_data_ip_proto($rdata,0) + prot = __nfs_data_ip_proto($rdata,1) + version = "NFSV2" + + flags = $rdata->flags + count = $rdata->args->count + offset = $rdata->args->offset + + name = "nfs.proc2.read" + argstr = sprintf("%d,%d",count,offset) + + size = count + units = "bytes" +} + +probe nfs.proc2.read.return = kernel.function("nfs_proc_read").return ?, + module("nfs").function("nfs_proc_read").return? +{ + version = "NFSV2" + name = "nfs.proc2.read.return" + retstr = sprintf("%d", $return) + + if(retsrt >= 0) + { + size = retstr + units = "bytes" + } +} + +probe nfs.proc3.read = kernel.function("nfs3_proc_read") ?, + module("nfs").function("nfs3_proc_read")? +{ + server_ip = __nfs_data_ip_proto($rdata,0) + prot = __nfs_data_ip_proto($rdata,1) + version = "NFSV3" + + flags = $rdata->flags + count = $rdata->args->count + offset = $rdata->args->offset + + name = "nfs.proc3.read" + argstr = sprintf("%d,%d",count,offset) + + size = count + units = "bytes" +} + + +probe nfs.proc3.read.return = kernel.function("nfs3_proc_read").return ?, + module("nfs").function("nfs3_proc_read").return? +{ + version = "NFSV3" + name = "nfs.proc3.read.return" + retstr = sprintf("%d", $return) + + if(retsrt >= 0) + { + size = retstr + units = "bytes" + } +} + + +probe nfs.proc4.read = kernel.function("nfs4_proc_read") ?, + module("nfs").function("nfs4_proc_read")? +{ + server_ip = __nfs_data_ip_proto($rdata,0) + prot = __nfs_data_ip_proto($rdata,1) + version = "NFSV4" + + flags = $rdata->flags + count = $rdata->args->count + offset = $rdata->args->offset + + name = "nfs.proc4.read" + argstr = sprintf("%d,%d",count,offset) + + size = count + units = "bytes" +} + + +probe nfs.proc4.read.return = kernel.function("nfs4_proc_read").return ?, + module("nfs").function("nfs4_proc_read").return? +{ + version = "NFSV4" + name = "nfs.proc4.read.return" + retstr = sprintf("%d", $return) + + if(retsrt >= 0) + { + size = retstr + units = "bytes" + } +} + + +/* +*probe nfs.proc.write +* +* Fires when client synchronously writes file to server +* +* Arguments: +* server_ip : ip address of server +* prot : transfer protocol +* version : nfs version +* flags : used to set task->tk_flags in rpc_init_task function +* count : +* size : read bytes in this execution +* offset : the file offset +* bitmask0: +* bitmask1 :V4 bitmask representing the set of attributes +* supported on this filesystem (only in probe nfs.proc4.lookup) +*/ + +probe nfs.proc.write = nfs.proc2.write , + nfs.proc3.write , + nfs.proc4.write +{} + + +probe nfs.proc.write.return = nfs.proc2.write.return , + nfs.proc3.write.return , + nfs.proc4.write.return +{} + +probe nfs.proc2.write = kernel.function("nfs_proc_write")?, + module("nfs").function("nfs_proc_write") +{ + + server_ip = __nfs_data_ip_proto($wdata,0) + prot = __nfs_data_ip_proto($wdata,1) + version = "NFSV2" + + flags = $wdata->flags + count = $wdata->args->count + offset = $wdata->args->offset + + name = "nfs.proc2.write" + argstr = sprintf("%d,%d",count,offset) + + size = count + units = "bytes" +} + + +probe nfs.proc2.write.return = kernel.function("nfs_proc_write").return ?, + module("nfs").function("nfs_proc_write").return? +{ + version = "NFSV2" + name = "nfs.proc2.write.return" + retstr = sprintf("%d", $return) + + if(retsrt >= 0) + { + size = retstr + units = "bytes" + } +} + + +probe nfs.proc3.write = kernel.function("nfs3_proc_write")?, + module("nfs").function("nfs3_proc_write") +{ + + server_ip = __nfs_data_ip_proto($wdata,0) + prot = __nfs_data_ip_proto($wdata,1) + version = "NFSV3" + + flags = $wdata->flags + count = $wdata->args->count + offset = $wdata->args->offset + + name = "nfs.proc3.write" + argstr = sprintf("%d,%d",count,offset) + + size = count + units = "bytes" +} + + +probe nfs.proc3.write.return = kernel.function("nfs3_proc_write").return ?, + module("nfs").function("nfs3_proc_write").return? +{ + version = "NFSV3" + name = "nfs.proc3.write.return" + retstr = sprintf("%d", $return) + + if(retsrt >= 0) + { + size = retstr + units = "bytes" + } +} + + +probe nfs.proc4.write = kernel.function("nfs4_proc_write")?, + module("nfs").function("nfs4_proc_write") +{ + + server_ip = __nfs_data_ip_proto($wdata,0) + prot = __nfs_data_ip_proto($wdata,1) + version = "NFSV4" + + flags = $wdata->flags + count = $wdata->args->count + offset = $wdata->args->offset + bitmask0 = __nfsv4_bitmask($wdata->inode,0) + bitmask1 = __nfsv4_bitmask($wdata->inode,1) + + name = "nfs.proc4.write" + argstr = sprintf("%d,%d",count,offset) + + size = count + units = "bytes" +} + + +probe nfs.proc4.write.return = kernel.function("nfs4_proc_write").return ?, + module("nfs").function("nfs4_proc_write").return? +{ + version = "NFSV4" + name = "nfs.proc4.write.return" + retstr = sprintf("%d", $return) + + if(retsrt >= 0) + { + size = retstr + units = "bytes" + } +} + +/* +*probe nfs.proc.commit +* +* Fires when client writes the buffered data to disk,the buffered +* data is asynchronously written by client before +* The commit function works in sync way,not exist in NFSV2 +* +* Arguments: +* server_ip : ip address of server +* prot : transfer protocol +* version : nfs version +* flags : used to set task->tk_flags in rpc_init_task function +* count : +* size : read bytes in this execution +* offset : the file offset +* bitmask0: +* bitmask1 :V4 bitmask representing the set of attributes +* supported on this filesystem (only in probe nfs.proc4.lookup) +*/ +probe nfs.proc.commit = nfs.proc3.commit, + nfs.proc4.commit +{} + +probe nfs.proc.commit.return = nfs.proc3.commit.return, + nfs.proc4.commit.return +{} + +probe nfs.proc3.commit = kernel.function ("nfs3_proc_commit")?, + module("nfs").function("nfs3_proc_commit")? +{ + server_ip = __nfs_data_ip_proto($cdata,0) + prot = __nfs_data_ip_proto($cdata,1) + version = "NFSV3" + + count = $cdata->args->count + offset = $cdata->args->offset + + name = "nfs.proc3.commit" + argstr = sprintf("%d,%d",count,offset) + + size = count + units = "bytes" +} + +probe nfs.proc3.commit.return = kernel.function ("nfs3_proc_commit").return?, + module("nfs").function("nfs3_proc_commit").return? +{ + version = "NFSV3" + name = "nfs.proc3.commit.return" + retstr = sprintf("%d", $return) + + if(retsrt >= 0) + { + size = retstr + units = "bytes" + } +} + + +probe nfs.proc4.commit = kernel.function ("nfs4_proc_commit")?, + module("nfs").function("nfs4_proc_commit")? +{ + server_ip = __nfs_data_ip_proto($cdata,0) + prot = __nfs_data_ip_proto($cdata,1) + version = "NFSV4" + + count = $cdata->args->count + offset = $cdata->args->offset + bitmask0 = __nfsv4_bitmask($cdata->inode,0) + bitmask1 = __nfsv4_bitmask($cdata->inode,1) + + name = "nfs.proc4.commit" + argstr = sprintf("%d,%d",count,offset) + + size = count + units = "bytes" +} + +probe nfs.proc4.commit.return = kernel.function ("nfs4_proc_commit").return?, + module("nfs").function("nfs4_proc_commit").return? +{ + version = "NFSV4" + name = "nfs.proc4.commit.return" + retstr = sprintf("%d", $return) + + if(retsrt >= 0) + { + size = retstr + units = "bytes" + } +} + +/* +*probe nfs.proc.read_setup +* +* The read_setup function is used to setup a read rpc task,not do +* a real read operation. +* +* Arguments: +* server_ip : ip address of server +* prot : transfer protocol +* version : nfs version +* count : +* size : read bytes in this execution +* offset : the file offset +*/ +probe nfs.proc.read_setup = nfs.proc2.read_setup , + nfs.proc3.read_setup , + nfs.proc4.read_setup +{} + + + +probe nfs.proc2.read_setup = kernel.function("nfs_proc_read_setup") ?, + module("nfs").function("nfs_proc_read_setup")? +{ + server_ip = __nfs_data_ip_proto($data,0) + prot = __nfs_data_ip_proto($data,1) + version = "NFSV2" + + count = $data->args->count + offset = $data->args->offset + + name = "nfs.proc2.read_setup" + argstr = sprintf("%d,%d",count,offset) + + size = count + units = "bytes" +} + + +probe nfs.proc3.read_setup = kernel.function("nfs3_proc_read_setup") ?, + module("nfs").function("nfs3_proc_read_setup")? +{ + server_ip = __nfs_data_ip_proto($data,0) + prot = __nfs_data_ip_proto($data,1) + version = "NFSV3" + fh = + + count = $data->args->count + offset = $data->args->offset + + name = "nfs.proc3.read_setup" + argstr = sprintf("%d,%d",count,offset) + + size = count + units = "bytes" +} + + + + +probe nfs.proc4.read_setup = kernel.function("nfs4_proc_read_setup") ?, + module("nfs").function("nfs4_proc_read_setup")? +{ + server_ip = __nfs_data_ip_proto($data,0) + prot = __nfs_data_ip_proto($data,1) + version = "NFSV4" + + count = $data->args->count + offset = $data->args->offset + //timestamp = $jiffies + + name = "nfs.proc4.read_setup" + argstr = sprintf("%d,%d",count,offset) + + size = count + units = "bytes" +} + + +/*probe nfs.proc.read_done +* +* Fires when a read reply is received or some read error occur +* (timeout or socket shutdown) +* +* Arguments: +* server_ip : ip address of server +* prot : transfer protocol +* version : nfs version +* status : result of last operation +* count : read size of last operation +* offset : the file offset of last operation +* timestamp : time stamp ,which is used for lease renewal (only + in nfs.proc4.read_done) +*/ +probe nfs.proc.read_done = nfs.proc2.read_done, + nfs.proc3.read_done, + nfs.proc4.read_done +{} + +probe nfs.proc.read_done.return = nfs.proc2.read_done.return, + nfs.proc3.read_done.return, + nfs.proc4.read_done.return +{} + +probe nfs.proc2.read_done = kernel.function("nfs_read_done")?, + module("nfs").function("nfs_read_done")? +{ + server_ip = __nfs_data_ip_proto($data,0) + prot = __nfs_data_ip_proto($data,1) + version = "NFSV2" + + status = $task->tk_status + offset = $data->args->offset + count = $data->args->count + + name = "nfs.proc2.read_done" + argstr = sprintf("%d",status) + +} + +probe nfs.proc2.read_done.return = kernel.function("nfs_read_done").return?, + module("nfs").function("nfs_read_done").return? +{ + version = "NFSV2" + name = "nfs.proc2.read_done.return" + retstr = sprintf("%d", $return) +} + + +probe nfs.proc3.read_done = kernel.function("nfs3_read_done")?, + module("nfs").function("nfs3_read_done")? +{ + server_ip = __nfs_data_ip_proto($data,0) + prot = __nfs_data_ip_proto($data,1) + version = "NFSV3" + + status = $task->tk_status + offset = $data->args->offset + count = $data->args->count + + name = "nfs.proc3.read_done" + argstr = sprintf("%d",status) + +} + +probe nfs.proc3.read_done.return = kernel.function("nfs3_read_done").return?, + module("nfs").function("nfs3_read_done").return? +{ + version = "NFSV3" + name = "nfs.proc3.read_done.return" + retstr = sprintf("%d", $return) +} + + +probe nfs.proc4.read_done = kernel.function("nfs4_read_done")?, + module("nfs").function("nfs4_read_done")? +{ + server_ip = __nfs_data_ip_proto($data,0) + prot = __nfs_data_ip_proto($data,1) + version = "NFSV4" + + status = $task->tk_status + offset = $data->args->offset + count = $data->args->count + timestamp = $data->timestamp + + name = "nfs.proc4.read_done" + argstr = sprintf("%d",status) + +} + +probe nfs.proc4.read_done.return = kernel.function("nfs4_read_done").return?, + module("nfs").function("nfs4_read_done").return? +{ + version = "NFSV4" + name = "nfs.proc4.read_done.return" + retstr = sprintf("%d", $return) +} + +/*probe nfs.proc.write_setup +* +* The write_setup function is used to setup a write rpc task,not do +* a real write operation. +* +* Arguments: +* server_ip : ip address of server +* prot : transfer protocol +* version : nfs version +* size : +* count : read bytes in this execution +* offset : the file offset +* how : used to set args.stable. +* The stable value could be: +* NFS_UNSTABLE,NFS_DATA_SYNC,NFS_FILE_SYNC(in nfs.proc3.write_setup and nfs.proc4.write_setup) +* bitmask0: +* bitmask1 :V4 bitmask representing the set of attributes +* supported on this filesystem (only in probe nfs.proc4.lookup) +*/ + +probe nfs.proc.write_setup = nfs.proc2.write_setup, + nfs.proc3.write_setup, + nfs.proc4.write_setup +{} + + +probe nfs.proc2.write_setup = kernel.function("nfs_proc_write_setup") ?, + module("nfs").function("nfs_proc_write_setup") ? +{ + server_ip = __nfs_data_ip_proto($data,0) + prot = __nfs_data_ip_proto($data,1) + version = "NFSV2" + + count = $data->args->count + offset = $data->args->offset + + name = "nfs.proc2.write_setup" + argstr = sprintf("%d,%d",count,offset) + + size = count + units = "bytes" +} + + +probe nfs.proc3.write_setup = kernel.function("nfs3_proc_write_setup") ?, + module("nfs").function("nfs3_proc_write_setup") ? +{ + server_ip = __nfs_data_ip_proto($data,0) + prot = __nfs_data_ip_proto($data,1) + version = "NFSV3" + + count = $data->args->count + offset = $data->args->offset + how = $how + + name = "nfs.proc3.write_setup" + argstr = sprintf("%d,%d,%d",count,offset,how) + + size = count + units = "bytes" +} + +probe nfs.proc4.write_setup = kernel.function("nfs4_proc_write_setup") ?, + module("nfs").function("nfs4_proc_write_setup") ? +{ + server_ip = __nfs_data_ip_proto($data,0) + prot = __nfs_data_ip_proto($data,1) + version = "NFSV4" + + count = $data->args->count + offset = $data->args->offset + how = $how + bitmask0 = __nfsv4_bitmask($data->inode,0) + bitmask1 = __nfsv4_bitmask($data->inode,1) + //timestamp = $jiffies + + name = "nfs.proc4.write_setup" + argstr = sprintf("%d,%d,%d",count,offset,how) + + size = count + units = "bytes" +} + + +/*probe nfs.proc.write_done +* +* Fires when a write reply is received or some write error occur +* (timeout or socket shutdown) +* +* Arguments: +* server_ip : ip address of server +* prot : transfer protocol +* version : nfs version +* status : result of last operation +* valid : fattr->valid ,indicates which fields are valid +* count : read size of last operation +* offset : the file offset of last operation +* timestamp : time stamp ,which is used for lease renewal (only + in nfs.proc4.write_done) +*/ +probe nfs.proc.write_done = nfs.proc2.write_done, + nfs.proc3.write_done, + nfs.proc4.write_done +{} + +probe nfs.proc.write_done.return = nfs.proc2.write_done.return, + nfs.proc3.write_done.return, + nfs.proc4.write_done.return +{} + +probe nfs.proc2.write_done = kernel.function("nfs_write_done") ?, + module("nfs").function("nfs_write_done") ? +{ + server_ip = __nfs_data_ip_proto($data,0) + prot = __nfs_data_ip_proto($data,1) + version = "NFSV2" + + status = $task->tk_status + valid = $data->res->fattr->valid + offset = $data->args->offset + count = $data->args->count + + name = "nfs.proc2.write_done" + argstr = sprintf("%d",status) +} + +probe nfs.proc2.write_done.return = kernel.function("nfs_write_done").return ?, + module("nfs").function("nfs_write_done").return ? +{ + version = "NFSV2" + name = "nfs.proc2.write_done.return" + retstr = sprintf("%d", $return) +} + +probe nfs.proc3.write_done = kernel.function("nfs3_write_done") ?, + module("nfs").function("nfs3_write_done") ? +{ + server_ip = __nfs_data_ip_proto($data,0) + prot = __nfs_data_ip_proto($data,1) + version = "NFSV3" + + status = $task->tk_status + valid = $data->res->fattr->valid + offset = $data->args->offset + count = $data->args->count + + name = "nfs.proc3.write_done" + argstr = sprintf("%d",status) +} + +probe nfs.proc3.write_done.return = kernel.function("nfs3_write_done").return ?, + module("nfs").function("nfs3_write_done").return ? +{ + version = "NFSV3" + name = "nfs.proc3.write_done.return" + retstr = sprintf("%d", $return) +} + +probe nfs.proc4.write_done = kernel.function("nfs4_write_done") ?, + module("nfs").function("nfs4_write_done") ? +{ + server_ip = __nfs_data_ip_proto($data,0) + prot = __nfs_data_ip_proto($data,1) + version = "NFSV4" + + status = $task->tk_status + valid = $data->res->fattr->valid + offset = $data->args->offset + count = $data->args->count + timestamp = $data->timestamp + + name = "nfs.proc4.write_done" + argstr = sprintf("%d",status) +} + +probe nfs.proc4.write_done.return = kernel.function("nfs4_write_done").return ?, + module("nfs").function("nfs4_write_done").return ? +{ + version = "NFSV4" + name = "nfs.proc4.write_done.return" + retstr = sprintf("%d", $return) +} + + +/*probe nfs.proc.commit_setup +* +* The commit_setup function is used to setup a commit rpc task,not do +* a real commit operation.It is not exist in NFSV2 +* +* Arguments: +* server_ip : ip address of server +* prot : transfer protocol +* version : nfs version +* size : +* count : read bytes in this execution +* offset : the file offset +* bitmask0: +* bitmask1 :V4 bitmask representing the set of attributes +* supported on this filesystem (only in probe nfs.proc4.lookup) +*/ + +probe nfs.proc.commit_setup =nfs.proc3.commit_setup, + nfs.proc4.commit_setup +{} + + +probe nfs.proc3.commit_setup = kernel.function("nfs3_proc_commit_setup") ?, + module("nfs").function("nfs3_proc_commit_setup") ? +{ + server_ip = __nfs_data_ip_proto($data,0) + prot = __nfs_data_ip_proto($data,1) + version = "NFSV3" + + count = $data->args->count + offset = $data->args->offset + + name = "nfs.proc3.commit_setup" + argstr = sprintf("%d,%d,%d",count,offset,how) + + size = count + units = "bytes" +} + +probe nfs.proc4.commit_setup = kernel.function("nfs4_proc_commit_setup") ?, + module("nfs").function("nfs4_proc_commit_setup") ? +{ + server_ip = __nfs_data_ip_proto($data,0) + prot = __nfs_data_ip_proto($data,1) + version = "NFSV4" + + count = $data->args->count + offset = $data->args->offset + bitmask0 = __nfsv4_bitmask($data->inode,0) + bitmask1 = __nfsv4_bitmask($data->inode,1) + //timestamp = $jiffies + + name = "nfs.proc4.commit_setup" + argstr = sprintf("%d,%d,%d",count,offset,how) + + size = count + units = "bytes" +} + + +/*probe nfs.proc.commit_done +* +* Fires when a commit reply is received or some commit operation error occur +* (timeout or socket shutdown) +* +* Arguments: +* server_ip : ip address of server +* prot : transfer protocol +* version : nfs version +* status : result of last operation +* valid : fattr->valid ,indicates which fields are valid +* count : read size of last operation +* offset : the file offset of last operation +* timestamp : time stamp ,which is used for lease renewal (only + in nfs.proc4.commit_done) +*/ +probe nfs.proc.commit_done = + nfs.proc3.commit_done, + nfs.proc4.commit_done +{} + +probe nfs.proc.commit_done.return = + nfs.proc3.commit_done.return, + nfs.proc4.commit_done.return +{} + + +probe nfs.proc3.commit_done = kernel.function("nfs3_commit_done") ?, + module("nfs").function("nfs3_commit_done") ? +{ + server_ip = __nfs_data_ip_proto($data,0) + prot = __nfs_data_ip_proto($data,1) + version = "NFSV3" + + status = $task->tk_status + count = $data->args->count + offset = $data->args->offset + valid = $data->res->fattr->valid + + name = "nfs.proc3.commit_done" + argstr = sprintf("%d",status) +} + +probe nfs.proc3.commit_done.return = kernel.function("nfs3_commit_done").return ?, + module("nfs").function("nfs3_commit_done").return ? +{ + version = "NFSV3" + name = "nfs.proc3.commit_done.return" + retstr = sprintf("%d", $return) +} + +probe nfs.proc4.commit_done = kernel.function("nfs4_commit_done") ?, + module("nfs").function("nfs4_commit_done") ? +{ + server_ip = __nfs_data_ip_proto($data,0) + prot = __nfs_data_ip_proto($data,1) + version = "NFSV4" + + status = $task->tk_status + count = $data->args->count + offset = $data->args->offset + valid = $data->res->fattr->valid + timestamp = $data->timestamp + + name = "nfs.proc4.commit_done" + argstr = sprintf("%d",status) +} + +probe nfs.proc4.commit_done.return = kernel.function("nfs4_commit_done").return ?, + module("nfs").function("nfs4_commit_done").return ? +{ + version = "NFSV4" + name = "nfs.proc4.commit_done.return" + retstr = sprintf("%d", $return) +} +/*probe nfs.proc.open +* +* Allocate file read/write context information +* +* Arguments: +* server_ip : ip address of server +* prot : transfer protocol +* version : nfs version(the function is used for all NFS version) +* filename : file name +* flag : file flag +* mode : file mode +*/ + +probe nfs.proc.open = kernel.function("nfs_open") ?, + module("nfs").function("nfs_open") ? +{ + server_ip = __i2n_ip_proto($inode,0) + prot = __i2n_ip_proto($inode,1) + version = "NFS" + + filename = kernel_string($filp->f_dentry->d_name->name) + flag = $filp->f_flags + mode = $filp->f_mode + + name = "nfs.proc.open" + argstr = sprintf("%s,%d,%d",filename,flag,mode) +} + +probe nfs.proc.open.return = kernel.function("nfs_open").return ?, + module("nfs").function("nfs_open").return ? +{ + version = "NFS" + name = "nfs.proc.open.return" + retstr = sprintf("%d", $return) +} + +/*probe nfs.proc.release +* +* Release file read/write context information +* +* Arguments: +* server_ip : ip address of server +* prot : transfer protocol +* version : nfs version(the function is used for all NFS version) +* filename : file name +* flag : file flag +* mode : file mode +*/ +probe nfs.proc.release= kernel.function("nfs_release") ?, + module("nfs").function("nfs_release") ? +{ + server_ip = __i2n_ip_proto($inode,0) + prot = __i2n_ip_proto($inode,1) + version = "NFS" + + filename = kernel_string($filp->f_dentry->d_name->name) + flag = $filp->f_flags + mode = $filp->f_mode + + name = "nfs.proc.release" + argstr = sprintf("%s,%d,%d",filename,flag,mode) +} + +probe nfs.proc.release.return = kernel.function("nfs_release").return ?, + module("nfs").function("nfs_release").return ? +{ + version = "NFS" + name = "nfs.proc.release.return" + retstr = sprintf("%d", $return) +} +/* +*probe nfs.proc4.hadle_exception (only for NFSV4) +* This is the error handling routine for processes for nfsv4 +* +* Arguments: +* errorcode : indicates the type of error +*/ +probe nfs.proc4.handle_exception = kernel.function("nfs4_handle_exception") ?, + module("nfs").function("nfs4_handle_exception")? +{ + version = "NFSV4" + + errorcode = $errorcode + + name = "nfs.proc4.handle_exception" + argstr = sprintf("%d",errorcode) +} + +probe nfs.proc4.handle_exception.return = kernel.function("nfs4_handle_exception").return ?, + module("nfs").function("nfs4_handle_exception").return? +{ + name = "nfs.proc4.handle_exception.return" + retstr = sprintf("%d",$return) +} + +/* +* probe nfs.proc.create +* Fires when client creates a file on server +* +* Arguments: +* server_ip : ip address of server +* prot : transfer protocol +* version : nfs version(the function is used for all NFS version) +* fh : file handler of parent dir +* filename : file name +* filelen : length of file name +* flag : indicates create mode(only for NFSV3 and NFSV4) +*/ +probe nfs.proc.create = nfs.proc2.create, + nfs.proc3.create, + nfs.proc4.create +{} + +probe nfs.proc.create.return = nfs.proc2.create.return, + nfs.proc3.create.return, + nfs.proc4.create.return +{} + +probe nfs.proc2.create = kernel.function("nfs_proc_create")?, + module("nfs").function("nfs_proc_create")? +{ + server_ip = __i2n_ip_proto($dir,0) + prot = __i2n_ip_proto($dir,1) + version = "NFSv2" + + fh = __getfh_inode($dir) + filename = kernel_string($dentry->d_name->name) + filelen = $dentry->d_name->len + + name = "nfs.proc2.create" + argstr = sprintf("%s",filename) +} + +probe nfs.proc2.create.return = kernel.function("nfs_proc_create").return?, + module("nfs").function("nfs_proc_create").return? +{ + name = "nfs.proc2.create.return" + version = "NFSV2" + retstr = sprintf("%d",$return) +} + +probe nfs.proc3.create = kernel.function("nfs3_proc_create")?, + module("nfs").function("nfs3_proc_create")? +{ + server_ip = __i2n_ip_proto($dir,0) + prot = __i2n_ip_proto($dir,1) + version = "NFSv3" + + fh = __getfh_inode($dir) + filename = kernel_string($dentry->d_name->name) + filelen = $dentry->d_name->len + flag = $flags + + name = "nfs.proc3.create" + argstr = sprintf("%s",filename) +} + +probe nfs.proc3.create.return = kernel.function("nfs3_proc_create").return?, + module("nfs").function("nfs3_proc_create").return? +{ + name = "nfs.proc3.create.return" + version = "NFSV3" + retstr = sprintf("%d",$return) +} + +probe nfs.proc4.create = kernel.function("nfs4_proc_create")?, + module("nfs").function("nfs4_proc_create")? +{ + server_ip = __i2n_ip_proto($dir,0) + prot = __i2n_ip_proto($dir,1) + version = "NFSv4" + + fh = __getfh_inode($dir) + filename = kernel_string($dentry->d_name->name) + filelen = $dentry->d_name->len + flag = $flags + + name = "nfs.proc4.create" + argstr = sprintf("%s",filename) +} + +probe nfs.proc4.create.return = kernel.function("nfs4_proc_create").return?, + module("nfs").function("nfs4_proc_create").return? +{ + name = "nfs.proc4.create.return" + version = "NFSV4" + retstr = sprintf("%d",$return) +} + +/* +* probe nfs.proc.remove +* Fires when client removes a file on server +* +* Arguments: +* server_ip : ip address of server +* prot : transfer protocol +* version : nfs version(the function is used for all NFS version) +* fh : file handler of parent dir +* filename : file name +* filelen : length of file name +*/ +probe nfs.proc.remove = nfs.proc2.remove, + nfs.proc3.remove, + nfs.proc4.remove +{} + +probe nfs.proc.remove.return = nfs.proc2.remove.return, + nfs.proc3.remove.return, + nfs.proc4.remove.return +{} + +probe nfs.proc2.remove = kernel.function("nfs_proc_remove")?, + module("nfs").function("nfs_proc_remove")? +{ + server_ip = __i2n_ip_proto($dir,0) + prot = __i2n_ip_proto($dir,1) + version = "NFSv2" + + fh = __getfh_inode($dir) + filename = kernel_string($name->name) + filelen = $name->len + + name = "nfs.proc2.remove" + argstr = sprintf("%s",filename) +} + +probe nfs.proc2.remove.return = kernel.function("nfs_proc_remove").return?, + module("nfs").function("nfs_proc_remove").return? +{ + name = "nfs.proc2.remove.return" + version = "NFSV2" + retstr = sprintf("%d",$return) +} + +probe nfs.proc3.remove = kernel.function("nfs3_proc_remove")?, + module("nfs").function("nfs3_proc_remove")? +{ + server_ip = __i2n_ip_proto($dir,0) + prot = __i2n_ip_proto($dir,1) + version = "NFSv3" + + fh = __getfh_inode($dir) + filename = kernel_string($name->name) + filelen = $name->len + + name = "nfs.proc3.remove" + argstr = sprintf("%s",filename) +} + +probe nfs.proc3.remove.return = kernel.function("nfs3_proc_remove").return?, + module("nfs").function("nfs3_proc_remove").return? +{ + name = "nfs.proc3.remove.return" + version = "NFSV3" + retstr = sprintf("%d",$return) +} + +probe nfs.proc4.remove = kernel.function("nfs4_proc_remove")?, + module("nfs").function("nfs4_proc_remove")? +{ + server_ip = __i2n_ip_proto($dir,0) + prot = __i2n_ip_proto($dir,1) + version = "NFSv4" + + fh = __getfh_inode($dir) + filename = kernel_string($name->name) + filelen = $name->len + + name = "nfs.proc4.remove" + argstr = sprintf("%s",filename) +} + +probe nfs.proc4.remove.return = kernel.function("nfs4_proc_remove").return?, + module("nfs").function("nfs4_proc_remove").return? +{ + name = "nfs.proc4.remove.return" + version = "NFSV4" + retstr = sprintf("%d",$return) +} + +/* +* probe nfs.proc.rename +* Fires when client renames a file on server +* +* Arguments: +* server_ip : ip address of server +* prot : transfer protocol +* version : nfs version(the function is used for all NFS version) +* old_fh : file handler of old parent dir +* new_fh : file handler of new parent dir +* old_name : old file name +* old_filelen : length of old file name +* new_name : new file name +* new_filelen : length of new file name +*/ +probe nfs.proc.rename = nfs.proc2.rename, + nfs.proc3.rename, + nfs.proc4.rename +{} + +probe nfs.proc.rename.return = nfs.proc2.rename.return, + nfs.proc3.rename.return, + nfs.proc4.rename.return +{} + +probe nfs.proc2.rename = kernel.function("nfs_proc_rename")?, + module("nfs").function("nfs_proc_rename")? +{ + server_ip = __i2n_ip_proto($old_dir,0) + prot = __i2n_ip_proto($old_dir,1) + version = "NFSv2" + + old_fh = __getfh_inode($old_dir) + old_name = kernel_string($old_name->name) + old_filelen = $old_name->len + new_fh = __getfh_inode($new_dir) + new_name = kernel_string($new_name->name) + new_filelen = $new_name->len + + name = "nfs.proc2.remove" + argstr = sprintf("%s,%s",old_name,new_name) +} + +probe nfs.proc2.rename.return = kernel.function("nfs_proc_rename").return?, + module("nfs").function("nfs_proc_rename").return? +{ + name = "nfs.proc2.rename.return" + version = "NFSV2" + retstr = sprintf("%d",$return) +} + +probe nfs.proc3.rename = kernel.function("nfs3_proc_rename")?, + module("nfs").function("nfs3_proc_rename")? +{ + server_ip = __i2n_ip_proto($old_dir,0) + prot = __i2n_ip_proto($old_dir,1) + version = "NFSv3" + + old_fh = __getfh_inode($old_dir) + old_name = kernel_string($old_name->name) + old_filelen = $old_name->len + new_fh = __getfh_inode($new_dir) + new_name = kernel_string($new_name->name) + new_filelen = $new_name->len + + name = "nfs.proc3.remove" + argstr = sprintf("%s,%s",old_name,new_name) +} + +probe nfs.proc3.rename.return = kernel.function("nfs3_proc_rename").return?, + module("nfs").function("nfs3_proc_rename").return? +{ + name = "nfs.proc3.rename.return" + version = "NFSV3" + retstr = sprintf("%d",$return) +} + +probe nfs.proc4.rename = kernel.function("nfs4_proc_rename")?, + module("nfs").function("nfs4_proc_rename")? +{ + server_ip = __i2n_ip_proto($old_dir,0) + prot = __i2n_ip_proto($old_dir,1) + version = "NFSv4" + + old_fh = __getfh_inode($old_dir) + old_name = kernel_string($old_name->name) + old_filelen = $old_name->len + new_fh = __getfh_inode($new_dir) + new_name = kernel_string($new_name->name) + new_filelen = $new_name->len + + name = "nfs.proc4.remove" + argstr = sprintf("%s,%s",old_name,new_name) +} + +probe nfs.proc4.rename.return = kernel.function("nfs4_proc_rename").return?, + module("nfs").function("nfs4_proc_rename").return? +{ + name = "nfs.proc4.rename.return" + version = "NFSV4" + retstr = sprintf("%d",$return) +} diff --git a/tapset/nfsd.stp b/tapset/nfsd.stp new file mode 100644 index 00000000..15d170f2 --- /dev/null +++ b/tapset/nfsd.stp @@ -0,0 +1,1059 @@ +%{ +#include <linux/sunrpc/svc.h> +#include <linux/nfsd/nfsd.h> +#include <linux/nfsd/cache.h> +#include <linux/nfsd/xdr.h> +#include <linux/nfsd/xdr3.h> +%} + +%{ +/*Get file handle from struct svc_fh */ +char * fh_fmt(struct svc_fh * fhp) +{ + struct knfsd_fh *fh = &fhp->fh_handle; + + static char buf[80]; + sprintf(buf, "%d: %08x %08x %08x %08x %08x %08x", + fh->fh_size, + fh->fh_base.fh_pad[0], + fh->fh_base.fh_pad[1], + fh->fh_base.fh_pad[2], + fh->fh_base.fh_pad[3], + fh->fh_base.fh_pad[4], + fh->fh_base.fh_pad[5]); + return buf; +} + +%} + +/* + *1 : nfsd.proc2.lookup + *2 : nfsd.proc3.lookup + *3 : nfsd.proc2.read + *4 : nfsd.proc3.read + *5 : nfsd.proc2.write + *6 : nfsd.proc3.write + *7 : nfsd.proc3.commit + *8 : nfsd.proc2.create + *9 : nfsd.proc3.create + *10: nfsd.proc2.remove + *11: nfsd.proc3.remove + *12 :nfsd.proc2.rename.ffh + *13 :nfsd.proc2.rename.tfh + *14 :nfsd.proc3.rename.ffh + *15 :nfsd.proc3.rename.tfh + */ + +/*Get file handler from argp,the index indicates the type of argp*/ +function __get_fh:string (argp:long,index:long) %{ /* pure */ + int index = (int)(THIS->index); + struct nfsd_diropargs * argp = NULL ; + struct nfsd3_diropargs * argp3 = NULL ; + struct nfsd_readargs * argpr = NULL; + struct nfsd3_readargs * argpr3 = NULL; + struct nfsd_writeargs * argpw = NULL; + struct nfsd3_writeargs * argpw3 = NULL; + struct nfsd3_commitargs * argpc3 = NULL; + struct nfsd_createargs *argpcr = NULL; + struct nfsd3_createargs *argpcr3 = NULL; + struct nfsd_diropargs *argpre = NULL; + struct nfsd3_diropargs *argpre3 = NULL; + struct nfsd_renameargs *argpren = NULL; + struct nfsd3_renameargs *argpren3 = NULL; + struct svc_fh * fhp = NULL; + char * buf; + + switch(index) + { + case 1: argp = (struct nfsd_diropargs *)THIS->argp; + fhp = &argp->fh; + break; + case 2: argp3 = (struct nfsd3_diropargs *)THIS->argp; + fhp = &argp3->fh; + break; + case 3: argpr = (struct nfsd_readargs * )THIS->argp; + fhp = &argpr->fh; + break; + case 4: argpr3 = (struct nfsd3_readargs * )THIS->argp; + fhp = &argpr3->fh; + break; + case 5: argpw = (struct nfsd_writeargs * )THIS->argp; + fhp = &argpw->fh; + break; + case 6: argpw3 = (struct nfsd3_writeargs * )THIS->argp; + fhp = &argpw3->fh; + break; + case 7: argpc3 = (struct nfsd3_commitargs * )THIS->argp; + fhp = &argpc3->fh; + break; + case 8: argpcr = (struct nfsd_createargs * )THIS->argp; + fhp = &argpcr->fh; + break; + case 9: argpcr3 = (struct nfsd3_createargs * )THIS->argp; + fhp = &argpcr3->fh; + break; + case 10: argpre = (struct nfsd_diropargs * )THIS->argp; + fhp = &argpre->fh; + break; + case 11: argpre3 = (struct nfsd3_diropargs * )THIS->argp; + fhp = &argpre3->fh; + break; + case 12: argpren = (struct nfsd_renameargs * )THIS->argp; + fhp = &argpren->ffh; + break; + case 13: argpren = (struct nfsd_renameargs * )THIS->argp; + fhp = &argpren->tfh; + break; + case 14: argpren3 = (struct nfsd3_renameargs * )THIS->argp; + fhp = &argpren3->ffh; + break; + case 15: argpren3 = (struct nfsd3_renameargs * )THIS->argp; + fhp = &argpren3->tfh; + break; + } + + if(fhp == NULL) + { + _stp_printf("the fhp is NULL"); + } + else + { + buf = fh_fmt(fhp); +// _stp_printf("%s:\n",buf); + strlcpy (THIS->__retvalue,buf,80); + } +%} +/*Get file handler from struct svc_fh , it will call +fh_fmt function*/ +function __svc_fh:string(fh :long) %{ /* pure */ + struct svc_fh * fhp = (struct svc_fh *) (THIS->fh); + char * buf ; + + buf = fh_fmt(fhp); + strlcpy (THIS->__retvalue,buf,80); +%} + +function p_long:long(cnt:long) %{ /* pure */ + unsigned long * count = (unsigned long *)(THIS->cnt); + + THIS->__retvalue = *count; +%} +/* +*probe nfsd.dispatch +* Fires when server receives a NFS operation from client +* +*Arguments: +* client_ip : the ip address of client +* proto : transfer protocol +* version : nfs version +* xid : transmission id +* prog : program number +* proc : procedure number +*/ +probe nfsd.dispatch = kernel.function("nfsd_dispatch")?, + module("nfsd").function("nfsd_dispatch") ? +{ + client_ip = $rqstp->rq_addr->sin_addr->s_addr + proto = $rqstp->rq_prot + version = $rqstp->rq_vers + + xid = $rqstp->rq_xid + prog = $rqstp->rq_prog + proc = $rqstp->rq_proc + + name = "nfsd.dispatch" + argstr = sprintf("%d,%d",version,proto) +} + +probe nfsd.dispatch.return = kernel.function("nfsd_dispatch").return?, + module("nfsd").function("nfsd_dispatch").return ? +{ + name = "nfsd.dispatch.return" + retstr = sprintf("%d",$return) +} + +probe nfsd.proc.entries = nfsd.proc.lookup, + nfsd.proc.read, + nfsd.proc.write, + nfsd.proc.commit, + nfsd.proc.compound, + nfsd.proc.rename, + nfsd.proc.create +{} + +probe nfsd.proc.return = nfsd.proc.lookup.return, + nfsd.proc.read.return, + nfsd.proc.write.return, + nfsd.proc.commit.return, + nfsd.proc.compound.return, + nfsd.proc.rename.return, + nfsd.proc.create.return +{} + +/* +*probe nfsd.proc.lookup +* Fires when client opens/searchs file on server +* +*Arguments: +* client_ip : the ip address of client +* proto : transfer protocol +* version : nfs version +* fh : file handle of parent dir (the first part is the length of the file handle) +* filename : file name +* filelen : the length of file name +*/ +probe nfsd.proc.lookup = nfsd.proc2.lookup, + nfsd.proc3.lookup +{} + +probe nfsd.proc.lookup.return = nfsd.proc2.lookup.return, + nfsd.proc3.lookup.return +{} + +probe nfsd.proc2.lookup = kernel.function("nfsd_proc_lookup") ?, + module("nfsd").function("nfsd_proc_lookup") ? +{ + client_ip = $rqstp->rq_addr->sin_addr->s_addr + proto = $rqstp->rq_prot + version = "NFSV2" + fh = __get_fh($argp,1) + + filename = kernel_string($argp->name) + filelen = $argp->len + + name = "nfsd.proc2.lookup" + argstr = sprintf("%s",filename) +} + + +probe nfsd.proc2.lookup.return = kernel.function("nfsd_proc_lookup").return ?, + module("nfsd").function("nfsd_proc_lookup").return ? +{ + name = "nfsd.proc2.lookup.return" + version = "NFSV2" + retstr = sprintf("%d",$return) +} + +probe nfsd.proc3.lookup = kernel.function("nfsd3_proc_lookup") ?, + module("nfsd").function("nfsd3_proc_lookup") ? +{ + client_ip = $rqstp->rq_addr->sin_addr->s_addr + proto = $rqstp->rq_prot + version = "NFSV3" + fh = __get_fh($argp,1) + + filename = kernel_string($argp->name) + filelen = $argp->len + + name = "nfsd.proc3.lookup" + argstr = sprintf("%s",filename) +} + +probe nfsd.proc3.lookup.return = kernel.function("nfsd3_proc_lookup").return ?, + module("nfsd").function("nfsd3_proc_lookup").return ? +{ + name = "nfsd.proc3.lookup.return" + version = "NFSV3" + retstr = sprintf("%d",$return) +} + + +/* +*probe nfsd.proc.read +* Fires when client read file on server +* +*Arguments: +* client_ip : the ip address of client +* proto : transfer protocol +* version : nfs version +* fh : file handle (the first part is the length of the file handle) +* size: +* count : read bytes +* offset : the offset of file +* vec : struct kvec ,includes buf address in kernel address + and length of each buffer +* vlen : read blocks +*/ +probe nfsd.proc.read = nfsd.proc2.read, + nfsd.proc3.read +{} + +probe nfsd.proc.read.return = nfsd.proc2.read.return, + nfsd.proc3.read.return +{ + +} + +probe nfsd.proc2.read = kernel.function("nfsd_proc_read")?, + module("nfsd").function("nfsd_proc_read")? +{ + client_ip = $rqstp->rq_addr->sin_addr->s_addr + proto = $rqstp->rq_prot + version = "NFSV2" + fh = __get_fh($argp,3) + + count = $argp->count + offset = $argp->offset + vec = $argp->vec + vlen = $argp->vlen + + name = "nfsd.proc2.read" + argstr = sprintf("%d,%d",count,offset) + + size = count + units = "bytes" +} + + +probe nfsd.proc2.read.return = kernel.function("nfsd_proc_read").return?, + module("nfsd").function("nfsd_proc_read").return? +{ + name = "nfsd.proc2.read.return" + version = "NFSV2" + retstr = sprintf("%d",$return) +} + +probe nfsd.proc3.read = kernel.function("nfsd3_proc_read")?, + module("nfsd").function("nfsd3_proc_read")? +{ + client_ip = $rqstp->rq_addr->sin_addr->s_addr + proto = $rqstp->rq_prot + version = "NFSV3" + fh = __get_fh($argp,4) + + count = $argp->count + offset = $argp->offset + vec = $argp->vec + vlen = $argp->vlen + + name = "nfsd.proc3.read" + argstr = sprintf("%d,%d",count,offset) + + size = count + units = "bytes" +} + + +probe nfsd.proc3.read.return = kernel.function("nfsd3_proc_read").return?, + module("nfsd").function("nfsd3_proc_read").return? +{ + name = "nfsd.proc3.read.return" + version = "NFSV3" + retstr = sprintf("%d",$return) +} + +/* +*probe nfsd.proc.write +* Fires when client writes data to file on server +* +*Arguments: +* client_ip : the ip address of client +* proto : transfer protocol +* version : nfs version +* fh : file handle (the first part is the length of the file handle) +* size: +* count : read bytes +* offset : the offset of file +* vec : struct kvec ,includes buf address in kernel address + and length of each buffer +* vlen : read blocks +* stable : argp->stable(only in nfs.proc3.write) +*/ +probe nfsd.proc.write = nfsd.proc2.write, + nfsd.proc3.write +{} + +probe nfsd.proc.write.return = nfsd.proc2.write.return, + nfsd.proc3.write.return +{ + +} + +probe nfsd.proc2.write = kernel.function("nfsd_proc_write")?, + module("nfsd").function("nfsd_proc_write")? +{ + client_ip = $rqstp->rq_addr->sin_addr->s_addr + proto = $rqstp->rq_prot + version = "NFSV2" + fh = __get_fh($argp,5) + + count = $argp->len + offset = $argp->offset + vec = $argp->vec + vlen = $argp->vlen + + name = "nfsd.proc2.write" + argstr = sprintf("%d,%d",count,offset) + + size = count + units = "bytes" +} + + +probe nfsd.proc2.write.return = kernel.function("nfsd_proc_write").return?, + module("nfsd").function("nfsd_proc_write").return? +{ + name = "nfsd.proc2.write.return" + version = "NFSV2" + retstr = sprintf("%d",$return) +} + +probe nfsd.proc3.write = kernel.function("nfsd3_proc_write")?, + module("nfsd").function("nfsd3_proc_write")? +{ + client_ip = $rqstp->rq_addr->sin_addr->s_addr + proto = $rqstp->rq_prot + version = "NFSV3" + fh = __get_fh($argp,6) + + count = $argp->count + offset = $argp->offset + vec = $argp->vec + vlen = $argp->vlen + stable = $argp->stable + + name = "nfsd.proc3.write" + argstr = sprintf("%d,%d",count,offset) + + size = count + units = "bytes" +} + + +probe nfsd.proc3.write.return = kernel.function("nfsd3_proc_write").return?, + module("nfsd").function("nfsd3_proc_write").return? +{ + name = "nfsd.proc3.write.return" + version = "NFSV3" + retstr = sprintf("%d",$return) +} + +/* +*probe nfsd.proc.commit +* Fires when client does a commit operation,which is +* used to flush the data written by async operation before +* to disk +* +*Arguments: +* client_ip : the ip address of client +* proto : transfer protocol +* version : nfs version +* fh : file handle (the first part is the length of the file handle) +* size: +* count : read bytes +* offset : the offset of file +*/ +probe nfsd.proc.commit = nfsd.proc3.commit +{} + +probe nfsd.proc.commit.return = nfsd.proc3.commit.return +{ + +} + +probe nfsd.proc3.commit = kernel.function("nfsd3_proc_commit")?, + module("nfsd").function("nfsd3_proc_commit")? +{ + client_ip = $rqstp->rq_addr->sin_addr->s_addr + proto = $rqstp->rq_prot + version = "NFSV3" + fh = __get_fh($argp,7) + + count = $argp->count + offset = $argp->offset + + name = "nfsd.proc3.commit" + argstr = sprintf("%d,%d",count,offset) + + size = count + units = "bytes" +} + +probe nfsd.proc3.commit.return = kernel.function("nfsd3_proc_commit").return?, + module("nfsd").function("nfsd3_proc_commit").return? +{ + name = "nfsd.proc3.commit.return" + version = "NFSV3" + retstr = sprintf("%d",$return) +} + +/* +*probe nfsd.proc.create +* Fires when clients create a file on server side. +* +* Arguments: +* client_ip : the ip address of client +* proto : transfer protocol +* version : nfs version +* fh : file handle (the first part is the length of the file handle) +* filename : file name +* filelen : length of file name +*/ +probe nfsd.proc.create = nfsd.proc2.create, + nfsd.proc3.create +{} +probe nfsd.proc.create.return = nfsd.proc2.create.return, + nfsd.proc3.create.return +{} + +probe nfsd.proc2.create = kernel.function("nfsd_proc_create")?, + module("nfsd").function("nfsd_proc_create") +{ + client_ip = $rqstp->rq_addr->sin_addr->s_addr + proto = $rqstp->rq_prot + version = "NFSV2" + fh = __get_fh($argp,8) + + filename = kernel_string($argp->name) + filelen = $argp->len + + name = "nfsd.proc2.create" + argstr = sprintf("%s",filename) +} + +probe nfsd.proc2.create.return = kernel.function("nfsd_proc_create").return?, + module("nfsd").function("nfsd_proc_create").return +{ + name = "nfsd.proc2.create.return" + version = "NFSV2" + retstr = sprintf("%d",$return) +} + +probe nfsd.proc3.create = kernel.function("nfsd3_proc_create")?, + module("nfsd").function("nfsd3_proc_create") +{ + client_ip = $rqstp->rq_addr->sin_addr->s_addr + proto = $rqstp->rq_prot + version = "NFSV3" + fh = __get_fh($argp,9) + + filename = kernel_string($argp->name) + filelen = $argp->len + + name = "nfsd.proc3.create" + argstr = sprintf("%s",filename) +} + +probe nfsd.proc3.create.return = kernel.function("nfsd3_proc_create").return?, + module("nfsd").function("nfsd3_proc_create").return +{ + name = "nfsd.proc3.create.return" + version = "NFSV3" + retstr = sprintf("%d",$return) +} + +/* +*probe nfsd.proc.remove +* Fires when clients removes a file on server side. +* +* Arguments: +* client_ip : the ip address of client +* proto : transfer protocol +* version : nfs version +* fh : file handle (the first part is the length of the file handle) +* filename : file name +* filelen : length of file name +*/ +probe nfsd.proc.remove = nfsd.proc2.remove, + nfsd.proc3.remove +{} +probe nfsd.proc.remove.return = nfsd.proc2.remove.return, + nfsd.proc3.remove.return +{} + +probe nfsd.proc2.remove = kernel.function("nfsd_proc_remove")?, + module("nfsd").function("nfsd_proc_remove") +{ + client_ip = $rqstp->rq_addr->sin_addr->s_addr + proto = $rqstp->rq_prot + version = "NFSV2" + fh = __get_fh($argp,10) + + filename = kernel_string($argp->name) + filelen = $argp->len + + name = "nfsd.proc2.remove" + argstr = sprintf("%s",filename) +} + +probe nfsd.proc2.remove.return = kernel.function("nfsd_proc_remove").return?, + module("nfsd").function("nfsd_proc_remove").return +{ + name = "nfsd.proc2.remove.return" + version = "NFSV2" + retstr = sprintf("%d",$return) +} + +probe nfsd.proc3.remove = kernel.function("nfsd3_proc_remove")?, + module("nfsd").function("nfsd3_proc_remove") +{ + client_ip = $rqstp->rq_addr->sin_addr->s_addr + proto = $rqstp->rq_prot + version = "NFSV3" + fh = __get_fh($argp,11) + + filename = kernel_string($argp->name) + filelen = $argp->len + + name = "nfsd.proc3.remove" + argstr = sprintf("%s",filename) +} + +probe nfsd.proc3.remove.return = kernel.function("nfsd3_proc_remove").return?, + module("nfsd").function("nfsd3_proc_remove").return? +{ + name = "nfsd.proc3.remove.return" + version = "NFSV3" + retstr = sprintf("%d",$return) +} + +/* +* probe nfsd.proc.rename +* Fires when clients rename a file on server side +* +* Arguments: +* fh : file handler of old path +* tfh : file handler of new path +* filename : old file name +* tname : new file name +* flen : length of old file name +* tlen : length of new file name +*/ +probe nfsd.proc.rename = nfsd.proc2.rename, + nfsd.proc3.rename +{} + +probe nfsd.proc.rename.return = nfsd.proc2.rename.return, + nfsd.proc3.rename.return +{} + +probe nfsd.proc2.rename = kernel.function("nfsd_proc_rename")?, + module("nfsd").function("nfsd_proc_rename")? +{ + client_ip = $rqstp->rq_addr->sin_addr->s_addr + proto = $rqstp->rq_prot + version = "NFSV2" + fh = __get_fh($argp,12) + tfh = __get_fh($argp,13) + + filename = kernel_string($argp->fname) + filelen = $argp->flen + tname = kernel_string($argp->tname) + tlen = $argp->tlen + + name = "nfsd.proc2.rename" + argstr = sprintf("%s,%s",filename,tname) +} + +probe nfsd.proc2.rename.return = kernel.function("nfsd_proc_rename").return?, + module("nfsd").function("nfsd_proc_rename").return? +{ + name = "nfsd.proc2.rename.return" + version = "NFSV2" + retstr = sprintf("%d",$return) +} + +probe nfsd.proc3.rename = kernel.function("nfsd3_proc_rename")?, + module("nfsd").function("nfsd3_proc_rename")? +{ + client_ip = $rqstp->rq_addr->sin_addr->s_addr + proto = $rqstp->rq_prot + version = "NFSV3" + fh = __get_fh($argp,14) + tfh = __get_fh($argp,15) + + filename = kernel_string($argp->fname) + filelen = $argp->flen + tname = kernel_string($argp->tname) + tlen = $argp->tlen + + name = "nfsd.proc3.rename" + argstr = sprintf("%s,%s",filename,tname) +} + +probe nfsd.proc3.rename.return = kernel.function("nfsd3_proc_rename").return?, + module("nfsd").function("nfsd3_proc_rename").return? +{ + name = "nfsd.proc3.rename.return" + version = "NFSV3" + retstr = sprintf("%d",$return) +} +/* +*probe nfsd.proc.compound +* Fires when the server received a NFSV4 operation from client +* +*Arguments: +* client_ip : the ip address of client +* proto : transfer protocol +* version : nfs version +* num : number of file operation in this RPC operation +* op : head of operation list in this compound execution +*/ +probe nfsd.proc.compound = nfsd.proc4.compound +{} + +probe nfsd.proc.compound.return = nfsd.proc4.compound.return +{} + +probe nfsd.proc4.compound = kernel.function("nfsd4_proc_compound")?, + module("nfsd").function("nfsd4_proc_compound") +{ + client_ip = $rqstp->rq_addr->sin_addr->s_addr + proto = $rqstp->rq_prot + version = "NFSV4" + + num = $args->opcnt + op = $args->ops + + name = "nfsd.proc4.cmpound" + argstr = sprintf("%d",num) +} + +probe nfsd.proc4.compound.return = kernel.function("nfsd4_proc_compound").return?, + module("nfsd").function("nfsd4_proc_compound").return +{ + name = "nfsd.proc4.compound.return" + version = "NFSV4" + retstr = sprintf("%d",$return) +} + +probe nfsd.entries = nfsd.open, + nfsd.read, + nfsd.write, + nfsd.lookup, + nfsd.commit, + nfsd.create, + nfsd.createv3, + nfsd.unlink, + nfsd.rename, + nfsd.close +{} + +probe nfsd.return= nfsd.open.return, + nfsd.read.return, + nfsd.write.return, + nfsd.lookup.return, + nfsd.commit.return, + nfsd.create.return, + nfsd.createv3.return, + nfsd.unlink.return, + nfsd.rename,return, + nfsd.close.return +{} +/*probe nfsd.open +* Fires when server opens a file +* +* Arguments: +* fh : file handle (the first part is the length of the file handle) +* access : indicates the type of open(read/write/commit/readdir...) +* type : type of file(regular file or dir) +*/ +probe nfsd.open = kernel.function("nfsd_open") ?, + module("nfsd").function("nfsd_open") +{ + fh = __svc_fh($fhp) + + access = $access + type = $type + + name = "nfsd.open" + argstr = sprintf("%d",access) +} + +probe nfsd.open.return = kernel.function("nfsd_open").return ?, + module("nfsd").function("nfsd_open").return +{ + name = "nfsd.open.return" + retstr = sprintf("%d",$return) +} + +/*probe nfsd.close +* Fires when server closes a file +* +* Arguments: +* filename : file name +*/ +probe nfsd.close = kernel.function("nfsd_close")?, + module("nfsd").function("nfsd_close")? +{ + filename = kernel_string($filp->f_dentry->d_name->name) + + name = "nfsd.close" + argstr = sprintf("%s",filename) +} +/*probe nfsd.read +* Fires when server reads data from a file +* +* Arguments: +* fh : file handle (the first part is the length of the file handle) +* file : argument file,indicates if the file has been opened. +* size: +* count : read bytes +* offset : the offset of file +* vec : struct kvec ,includes buf address in kernel address + and length of each buffer +* vlen : read blocks +*/ +probe nfsd.read = kernel.function("nfsd_read") ?, + module("nfsd").function("nfsd_read")? +{ + fh = __svc_fh($fhp) + + file = $file + count = p_long($count) + offset = $offset + vec = $vec + vlen = $vlen + + name = "nfsd.read" + argstr = sprintf("%d,%d",count,offsee) + + size = count + units = "bytes" +} + +probe nfsd.read.return = kernel.function("nfsd_read").return ?, + module("nfsd").function("nfsd_read").return? +{ + name = "nfsd.read.return" + retstr = sprintf("%d",$return) +} + +/*probe nfsd.write +* Fires when server writes data to a file +* +* Arguments: +* fh : file handle (the first part is the length of the file handle) +* file : argument file,indicates if the file has been opened. +* size: +* count : read bytes +* offset : the offset of file +* vec : struct kvec ,includes buf address in kernel address + and length of each buffer +* vlen : read blocks +*/ +probe nfsd.write = kernel.function("nfsd_write")?, + module("nfsd").function("nfsd_write")? +{ + fh = __svc_fh($fhp) + + file = $file + count = $cnt + offset = $offset + vec = $vec + vlen = $vlen + + name = "nfsd.write" + argstr = sprintf("%d,%d",count,offsee) + + size = count + units = "bytes" +} + +probe nfsd.write.return = kernel.function("nfsd_write").return?, + module("nfsd").function("nfsd_write").return? +{ + name = "nfsd.write.return" + retstr = sprintf("%d",$return) +} + +/*probe nfsd.commit +* Fires when server commits all pending writes to stable storage. +* +* Arguments: +* fh : file handle (the first part is the length of the file handle) +* flag : indicates whether this execution is a sync operation +* size: +* count : read bytes +* offset : the offset of file +*/ +probe nfsd.commit = kernel.function("nfsd_commit")?, + module("nfsd").function("nfsd_commit")? +{ + fh = __svc_fh($fhp) + + count = $count + offset = $offset + flag = $fhp->fh_export->ex_flags + + name = "nfsd.commit" + argstr = sprintf("%d,%d",count,offset) + + size = count + units = "bytes" +} + +probe nfsd.commit.return = kernel.function("nfsd_commit").return?, + module("nfsd").function("nfsd_commit").return ? +{ + name = "nfsd.commit.return" + retstr = sprintf("%d",$return) +} + +/* +*probe nfsd.lookup +* Fires when client opens/searchs file on server +* +*Arguments: +* fh : file handle of parent dir(the first part is the length of the file handle) +* filename : file name +* filelen : the length of file name +*/ + +probe nfsd.lookup = kernel.function("nfsd_lookup")?, + module("nfsd").function("nfsd_lookup")? +{ + fh = __svc_fh($fhp) + + filename = kernel_string($name) + filelen = $len + + name = "nfsd.lookup" + argstr = sprintf("%s",filename) +} + +probe nfsd.lookup.return = kernel.function("nfsd_lookup").return?, + module("nfsd").function("nfsd_lookup").return? +{ + name = "nfsd.lookup.return" + retstr = sprintf("%d",$return) +} +/* +* probe nfsd.create +* Fires when client creates a file(regular,dir,device,fifo) on server side, +* sometimes nfsd will call nfsd_create_v3 instead of this function +* +* Arguments: +* +* fh : file handle (the first part is the length of the file handle) +* filename : file name +* filelen : the length of file name +* type : file type(regular,dir,device,fifo ...) +* iap: inode attributes +*/ +probe nfsd.create = kernel.function("nfsd_create")?, + module("nfsd").function("nfsd_create")? +{ + fh = __svc_fh($fhp) + + filename = kernel_string($fname) + filelen = $flen + type = $type + iap = $iap + + name = "nfsd.create" + argstr = sprintf("%s,%d",filename,iap) +} + +probe nfsd.create.return = kernel.function("nfsd_create").return?, + module("nfsd").function("nfsd_create").return? +{ + name = "nfsd.create.return" + retstr = sprintf("%d",$return) +} + +/* +* probe nfsd.createv3 +* Fires when client creates a regular file or set file attributes on server side, +* only called by nfsd3_proc_create and nfsd4_open(op_claim_type is NFS4_OPEN_CLAIM_NULL) +* +* Arguments: +* +* fh : file handle (the first part is the length of the file handle) +* filename : file name +* filelen : the length of file name +* iap : inode attributes +* createmode : create mode .The possible values could be: +* NFS3_CREATE_EXCLUSIVE,NFS3_CREATE_UNCHECKED,NFS3_CREATE_GUARDED +* truncp : trunp arguments, indicates if the file shouldbe truncate +* verfier : file attributes (atime,mtime,mode).It's used to reset file + attributes for CREATE_EXCLUSIVE +*/ +probe nfsd.createv3 = kernel.function("nfsd_create_v3")?, + module("nfsd").function("nfsd_create_v3")? +{ + fh = __svc_fh($fhp) + + filename = kernel_string($fname) + filelen = $flen + ia_mode = $iap + truncp = $truncp + verfier = $verifier + createmode = $createmode + + name = "nfsd.createv3" + argstr = sprintf("%s,%d",filename,createmode) +} + +probe nfsd.createv3.return = kernel.function("nfsd_create_v3").return?, + module("nfsd").function("nfsd_create_v3").return? +{ + name = "nfsd.createv3.return" + retstr = sprintf("%d",$return) +} + +/* +* probe nfsd.unlink +* Fires when client removes a file or a dir on server side, +* +* Arguments: +* +* fh : file handle (the first part is the length of the file handle) +* filename : file name +* filelen : the length of file name +* type : file type(file or dir) +*/ +probe nfsd.unlink = kernel.function("nfsd_unlink")?, + module("nfsd").function("nfsd_unlink")? +{ + fh = __svc_fh($fhp) + + filename = kernel_string($fname) + filelen = $flen + type = $type + + name = "nfsd.unlink" + argstr = sprintf("%s,%d",filename,iap) +} + +probe nfsd.unlink.return = kernel.function("nfsd_unlink").return?, + module("nfsd").function("nfsd_unlink").return? +{ + name = "nfsd.unlink.return" + retstr = sprintf("%d",$return) +} + +/* +* probe nfsd.rename +* Fires when clients rename a file on server side +* +* Arguments: +* fh : file handler of old path +* tfh : file handler of new path +* filename : old file name +* tname : new file name +* flen : length of old file name +* tlen : length of new file name +*/ + +probe nfsd.rename = kernel.function("nfsd_rename")?, + module("nfsd").function("nfsd_rename")? +{ + fh = __svc_fh($ffhp) + tfh = __svc_fh($tfhp) + + filename = kernel_string($fname) + filelen = $flen + tname = kernel_string($tname) + tlen = $tlen + + name = "nfsd.rename" + argstr = sprintf("%s,%s",filename,tname) +} + +probe nfsd.rename.return = kernel.function("nfsd_rename").return?, + module("nfsd").function("nfsd_rename").return? +{ + name = "nfsd.rename.return" + retstr = sprintf("%d",$return) +} diff --git a/tapset/vfs.stp b/tapset/vfs.stp new file mode 100644 index 00000000..94535fe7 --- /dev/null +++ b/tapset/vfs.stp @@ -0,0 +1,592 @@ +/* generic vfs probes */ + +/* helper functions */ +function __bdevname:string (bdev:long) %{ /* pure */ + char b[BDEVNAME_SIZE]; + struct block_device *bdev = (struct block_device *)(long)THIS->bdev; + if (bdev == NULL) { + strlcpy(THIS->__retvalue, "N/A", MAXSTRINGLEN); + return; + } + + deref_string(THIS->__retvalue, bdevname(bdev,b), MAXSTRINGLEN); + if (0) { +deref_fault: + CONTEXT->last_error = "pointer dereference fault"; + } +%} + +/* + We don't want to have to do a bdevname() call every time + we want a devname, so we'll hash them here. +*/ +global __devnames +function __find_bdevname(dev, bdev) +{ +# return "" + + __devname = __devnames[dev] + + if (__devname != null) + return __devname + + __devname = __devnames[dev] = __bdevname(bdev) + + return __devname +} + +function ppos_pos:long (ppos:long) %{ /* pure */ + loff_t *ppos = (loff_t *)(long)THIS->ppos; + THIS->__retvalue = (int64_t)*ppos; +%} + +function __page_ino:long (page:long) %{ /* pure */ + struct page *page = (struct page *)(long)THIS->page; + if ((page == NULL) || (page->mapping == NULL)) { + THIS->__retvalue = -1; + return; + } + + THIS->__retvalue = deref(sizeof(page->mapping->host->i_ino), + &(page->mapping->host->i_ino)); + if (0) { +deref_fault: + CONTEXT->last_error = "pointer dereference fault"; + } +%} + +function __page_dev:long (page:long) %{ /* pure */ + struct page *page = (struct page *)(long)THIS->page; + if ((page == NULL) || (page->mapping == NULL)) { + THIS->__retvalue = -1; + return; + } + THIS->__retvalue = deref(sizeof(page->mapping->host->i_sb->s_dev), + &(page->mapping->host->i_sb->s_dev)); + if (0) { +deref_fault: + CONTEXT->last_error = "pointer dereference 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; + return; + } + THIS->__retvalue = deref(sizeof(page->mapping->host->i_sb->s_bdev), + &(page->mapping->host->i_sb->s_dev)); + if (0) { +deref_fault: + CONTEXT->last_error = "pointer dereference fault"; + } +%} + +probe generic.fop.llseek = kernel.function ("generic_file_llseek") +{ + dev = $file->f_dentry->d_inode->i_sb->s_dev + devname = __find_bdevname(dev, $file->f_dentry->d_inode->i_sb->s_bdev) + ino = $file->f_dentry->d_inode->i_ino + + offset = $offset + origin = $origin + maxbyte = $file->f_dentry->d_inode->i_sb->s_maxbytes + + name = "generic_file_llseek" + argstr = sprintf("%d, %d", offset, origin) +} +probe generic.fop.llseek.return = kernel.function ("generic_file_llseek").return +{ + name = "generic_file_llseek" + retstr = returnstr(1) +} + +probe generic.fop.aio_read = kernel.function ("generic_file_aio_read") +{ + dev = $iocb->ki_filp->f_dentry->d_inode->i_sb->s_dev + devname = __find_bdevname(dev, $iocb->ki_filp->f_dentry->d_inode->i_sb->s_bdev) + ino = $iocb->ki_filp->f_dentry->d_inode->i_ino + + count = $count + pos = $pos + buf = $buf + + name = "generic_file_aio_read" + argstr = sprintf("%d, %d, %p", count, pos,buf) + + size = count + units = "bytes" +} +probe generic.fop.aio_read.return = kernel.function ("generic_file_aio_read").return +{ + name = "generic_file_aio_read" + retstr = sprintf("%d", $return) + + if ($return > 0) { + size = $return + units = "bytes" + } +} + +probe generic.fop.aio_write = kernel.function ("generic_file_aio_write") +{ + dev = $iocb->ki_filp->f_dentry->d_inode->i_sb->s_dev + devname = __find_bdevname(dev, $iocb->ki_filp->f_dentry->d_inode->i_sb->s_bdev) + ino = $iocb->ki_filp->f_dentry->d_inode->i_ino + + count = $count + pos = $pos + + name = "generic_file_aio_write" + argstr = sprintf("%d, %d", count, pos) + + size = count + units = "bytes" +} +probe generic.fop.aio_write.return = kernel.function ("generic_file_aio_write").return +{ + name = "generic_file_aio_write" + retstr = sprintf("%d", $return) + + if ($return > 0) { + size = $return + units = "bytes" + } +} + +probe generic.fop.readv = kernel.function ("generic_file_readv") +{ + dev = $filp->f_dentry->d_inode->i_sb->s_dev + devname = __find_bdevname(dev, $filp->f_dentry->d_inode->i_sb->s_bdev) + ino = $filp->f_dentry->d_inode->i_ino + + nr_segs = $nr_segs + pos = ppos_pos($ppos) + + name = "generic_file_readv" + argstr = sprintf("%d, %d", nr_segs, pos) + + size = nr_segs + units = "segs" +} +probe generic.fop.readv.return = kernel.function ("generic_file_readv").return +{ + name = "generic_file_readv" + retstr = sprintf("%d", $return) + + if ($return > 0) { + size = $return + units = "bytes" + } +} + +/* calls __generic_file_write_nolock */ +probe generic.fop.writev = kernel.function ("generic_file_writev") +{ + dev = $file->f_dentry->d_inode->i_sb->s_dev + devname = __find_bdevname(dev, $file->f_dentry->d_inode->i_sb->s_bdev) + ino = $file->f_dentry->d_inode->i_ino + + nr_segs = $nr_segs + pos = ppos_pos($ppos) + + name = "generic_file_writev" + argstr = sprintf("%d, %d", nr_segs, pos) + + size = nr_segs + units = "segs" +} +probe generic.fop.writev.return = kernel.function ("generic_file_writev").return +{ + name = "generic_file_writev" + retstr = sprintf("%d", $return) + + if ($return > 0) { + size = $return + units = "bytes" + } +} + +/* checks for aops->readpage, if not defined, return -ENOEXEC + else assigns generic_file_vm_ops to vma + add filemap_nopage, filemap_populate */ +probe generic.fop.mmap = kernel.function ("generic_file_mmap") +{ + dev = $file->f_dentry->d_inode->i_sb->s_dev + devname = __find_bdevname(dev, $file->f_dentry->d_inode->i_sb->s_bdev) + ino = $file->f_dentry->d_inode->i_ino + + vm_start = $vma->vm_start + vm_end = $vma->vm_end + vm_flags = $vma->vm_flags + + name = "generic_file_mmap" + argstr = sprintf("0x%x, 0x%x, 0x%x", vm_start, vm_end, vm_flags) +} +probe generic.fop.mmap.return = kernel.function ("generic_file_mmap").return +{ + name = "generic_file_mmap" + retstr = sprintf("%d", $return) +} + +probe generic.fop.open = kernel.function ("generic_file_open") +{ + dev = $filp->f_dentry->d_inode->i_sb->s_dev + devname = __find_bdevname(dev, $filp->f_dentry->d_inode->i_sb->s_bdev) + ino = $inode->i_ino + + filename = kernel_string($filp->f_dentry->d_name->name) + flag = $filp->f_flags + size = $inode->size + + name = "generic_file_open" + argstr = sprintf("%d, %s", ino, flag, filename) +} +probe generic.fop.open.return = kernel.function ("generic_file_open").return +{ + name = "generic_file_open" + retstr = sprintf("%d", $return) +} + +probe generic.fop.sendfile = kernel.function ("generic_file_sendfile") +{ + dev = $in_file->f_dentry->d_inode->i_sb->s_dev + devname = __find_bdevname(dev, $in_file->f_dentry->d_inode->i_sb->s_bdev) + ino = $in_file->f_dentry->d_inode->i_ino + + count = $count + ppos = $ppos + + name = "generic_file_sendfile" + argstr = sprintf("%d", count) + + size = count + units = "bytes" +} +probe generic.fop.sendfile.return = kernel.function ("generic_file_sendfile").return +{ + name = "generic_file_sendfile" + retstr = sprintf("%d", $return) + + if ($return > 0) { + size = $return + units = "bytes" + } +} + +probe generic.fop.splice_read = kernel.function ("generic_file_splice_read") +{ + dev = $in->f_dentry->d_inode->i_sb->s_dev + devname = __find_bdevname(dev, $in->f_dentry->d_inode->i_sb->s_bdev) + ino = $in->f_dentry->d_inode->i_ino + + len = $len + flags = $flags + + name = "generic_file_splice_read" + argstr = sprintf("%d, %x", len, flags) + + size = len + units = "bytes" +} +probe generic.fop.splice_read.return = kernel.function ("generic_file_splice_read").return +{ + name = "generic_file_splice_read" + retstr = sprintf("%d", $return) + + if ($return > 0) { + size = $return + units = "bytes" + } +} + +probe generic.fop.splice_write = kernel.function ("generic_file_splice_write") +{ + dev = $out->f_dentry->d_inode->i_sb->s_dev + devname = __find_bdevname(dev, $out->f_dentry->d_inode->i_sb->s_bdev) + ino = $out->f_dentry->d_inode->i_ino + + len = $len + flags = $flags + + name = "generic_file_splice_write" + argstr = sprintf("%d, %x", len, flags) + + size = len + units = "bytes" +} +probe generic.fop.splice_write.return = kernel.function ("generic_file_splice_write").return +{ + name = "generic_file_splice_write" + retstr = sprintf("%d", $return) + + if ($return > 0) { + size = $return + units = "bytes" + } +} + +probe generic.fop.read = kernel.function ("generic_file_read") +{ + dev = $filp->f_dentry->d_inode->i_sb->s_dev + devname = __find_bdevname(dev, $filp->f_dentry->d_inode->i_sb->s_bdev) + ino = $filp->f_dentry->d_inode->i_ino + + count = $count + + name = "generic_file_read" + argstr = sprintf("%d", count) + + size = count + units = "bytes" +} +probe generic.fop.read.return = kernel.function ("generic_file_read").return +{ + name = "generic_file_read" + retstr = sprintf("%d", $return) + + if ($return > 0) { + size = $return + units = "bytes" + } +} + +probe generic.fop.write = kernel.function ("generic_file_write") +{ + dev = $file->f_dentry->d_inode->i_sb->s_dev + devname = __find_bdevname(dev, $file->f_dentry->d_inode->i_sb->s_bdev) + ino = $file->f_dentry->d_inode->i_ino + + count = $count + + name = "generic_file_write" + argstr = sprintf("%d", count) + + size = count + units = "bytes" +} +probe generic.fop.write.return = kernel.function ("generic_file_write").return +{ + name = "generic_file_write" + retstr = sprintf("%d", $return) + + if ($return > 0) { + size = $return + units = "bytes" + } +} + +/* generic_writepages calls mpage_writepages(mapping, wbc, NULL) */ +probe generic.aop.writepages = kernel.function ("mpage_writepages") +{ + dev = $mapping->host->i_sb->s_dev + devname = __find_bdevname(dev, $mapping->host->i_sb->s_bdev) + ino = $mapping->host->i_ino + + nr_to_write = $wbc->nr_to_write + + name = "generic_writepages" + argstr = sprintf("%d", nr_to_write) + + size = nr_to_write + units = "pages" +} +probe generic.aop.writepages.return = kernel.function ("mpage_writepages").return +{ + name = "generic_writepages" + retstr = sprintf("%d", $return) +} + +probe vfs.do_sync_read = kernel.function ("do_sync_read") +{ + dev = $filp->f_dentry->d_inode->i_sb->s_dev + ino = $filp->f_dentry->d_inode->i_ino + + len = $len + pos = ppos_pos($ppos) + buf = $buf + + name = "do_sync_read" + argstr = sprintf("%d, %d , %p ", len, pos,buf) + + size = len + units = "bytes" +} +probe vfs.do_sync_read.return = kernel.function ("do_sync_read").return +{ + name = "do_sync_read" + retstr = sprintf("%d", $return) + + if ($return > 0) { + size = $return + units = "bytes" + } +} + +probe vfs.do_sync_write = kernel.function ("do_sync_write") +{ + dev = $filp->f_dentry->d_inode->i_sb->s_dev + devname = __find_bdevname(dev, $filp->f_dentry->d_inode->i_sb->s_bdev) + ino = $filp->f_dentry->d_inode->i_ino + + len = $len + pos = ppos_pos($ppos) + + name = "do_sync_write" + argstr = sprintf("%d, %d", len, pos) + + size = len + units = "bytes" +} +probe vfs.do_sync_write.return = kernel.function ("do_sync_write").return +{ + name = "do_sync_write" + retstr = sprintf("%d", $return) + + if ($return > 0) { + size = $return + units = "bytes" + } +} + +probe vfs.block_sync_page = kernel.function ("block_sync_page") +{ + __page = $page + dev = __page_dev(__page) + devname = __find_bdevname(dev, __page_bdev(__page)) + ino = __page_ino(__page) + + page_index = $page->index + + name = "block_sync_page" + argstr = sprintf("%d", page_index) + + size = 1 + units = "pages" +} +probe vfs.block_sync_page.return = kernel.function ("block_sync_page").return +{ + name = "block_sync_page" + retstr = sprintf("N/A") + + size = 1 + units = "pages" +} + +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 + + page_index = $page->index + + name = "buffer_migrate_page" + argstr = sprintf("%d", page_index) + + size = 1 + units = "pages" +} +probe vfs.buffer_migrate_page.return = kernel.function ("buffer_migrate_page").return +{ + name = "buffer_migrate_page" + retstr = sprintf("%d", $return) + + if ($return == 0) { + size = 1 + units = "pages" + } +} + +/* default if aop not set, __set_page_dirty_nobuffers usually used if set */ +probe vfs.__set_page_dirty_buffers = kernel.function ("__set_page_dirty_buffers") +{ + __page = $page + dev = __page_dev(__page) + devname = __find_bdevname(dev, __page_bdev(__page)) + ino = __page_ino(__page) + + index = $page->index + + name = "__set_page_dirty_buffers" + argstr = sprintf("%d", page_index) + + size = 1 + units = "pages" +} +probe vfs.__set_page_dirty_buffers.return = kernel.function ("__set_page_dirty_buffers").return +{ + name = "__set_page_dirty_buffers" + retstr = sprintf("%d", $return) + + if ($return == 1) { + size = 1 + units = "pages" + } +} + +probe vfs.do_mpage_readpage = kernel.function ("do_mpage_readpage") +{ + __page = $page + dev = __page_dev(__page) + devname = __find_bdevname(dev, __page_bdev(__page)) + ino = __page_ino(__page) + + index = $page->index + + name = "do_mpage_readpage" + argstr = sprintf("%d", index) + + size = 1 + units = "pages" +} +probe vfs.do_mpage_readpage.return = kernel.function ("do_mpage_readpage").return +{ + name = "do_mpage_readpage" + retstr = sprintf("0x%x", $return) + + size = 1 + units = "pages" +} + +probe vfs.add_to_page_cache = kernel.function ("add_to_page_cache") +{ + dev = $mapping->host->i_sb->s_dev + devname = __find_bdevname(dev, $mapping->host->i_sb->s_bdev) + ino = $mapping->host->i_ino + + index = $offset + nrpages = $mapping->nrpages + + name = "vfs.add_to_page_cache" + argstr = sprintf("%d, %d", ino, index) +} +probe vfs.add_to_page_cache.return = kernel.function ("add_to_page_cache").return +{ + name = "vfs.add_to_page_cache" + retstr = sprintf("%d", $return) + + if ($return == 0) { + size = 1 + units = "pages" + } +} + +probe vfs.remove_from_page_cache = kernel.function ("__remove_from_page_cache") +{ + dev = __page_dev($page) + devname = __find_bdevname(dev, __page_bdev($page)) + ino = __page_ino($page) + + index = $page->index + + name = "vfs.remove_from_page_cache" + argstr = sprintf("%d", ino) +} +probe vfs.remove_from_page_cache.return = kernel.function ("remove_from_page_cache").return +{ + name = "vfs.remove_from_page_cache" + retstr = sprintf("N/A") +} + |