diff options
author | Frank Ch. Eigler <fche@elastic.org> | 2008-06-27 21:45:37 -0400 |
---|---|---|
committer | Frank Ch. Eigler <fche@elastic.org> | 2008-06-27 21:45:37 -0400 |
commit | 53ca410a6a6032c2cde6aac6e95b57c68585e48a (patch) | |
tree | 79cda31e77dd2fee51b8f2f20e2e76989f4c8ad7 /tapset | |
parent | 4494bb1367876f3067d0e7c90b1466b9bd88633f (diff) | |
parent | cfa2ca3cbf2da7bbabcdf35c3085a969bd2370e4 (diff) | |
download | systemtap-steved-53ca410a6a6032c2cde6aac6e95b57c68585e48a.tar.gz systemtap-steved-53ca410a6a6032c2cde6aac6e95b57c68585e48a.tar.xz systemtap-steved-53ca410a6a6032c2cde6aac6e95b57c68585e48a.zip |
Merge commit 'origin/master' into pr6429-comp-unwindsyms
* commit 'origin/master':
Always include libdw using link groups.
Fix bug in handling process(PID) probes.
Added tests for 'process(PID)' variants.
This commit makes changes to the VFS tapset. The changes include deprecation of
syscalls2.stp: Add sys_renameat.
Only probe lines once for the :* wildcard line pattern.
Revert checking address in runtime
bz451707: fix conversions.exp test $name
Cleanup in tapsets.cxx
Added powerpc support to runtime/syscall.h.
Remove validating _stext due to many aliased symbols
PR6646: Add checking address in runtime
Fixed offset argument to vm_callback.
Diffstat (limited to 'tapset')
-rw-r--r-- | tapset/ChangeLog | 4 | ||||
-rw-r--r-- | tapset/syscalls2.stp | 23 | ||||
-rw-r--r-- | tapset/vfs.stp | 303 |
3 files changed, 324 insertions, 6 deletions
diff --git a/tapset/ChangeLog b/tapset/ChangeLog index 7365d4c9..0332a384 100644 --- a/tapset/ChangeLog +++ b/tapset/ChangeLog @@ -1,3 +1,7 @@ +2008-06-26 Zhaolei <zhaolei@cn.fujitsu.com> + + * syscalls2.stp: Add sys_renameat. + 2008-06-23 Zhaolei <zhaolei@cn.fujitsu.com> * syscalls.stp: Add sys_mknodat. diff --git a/tapset/syscalls2.stp b/tapset/syscalls2.stp index 98bdc95f..64cbaa1d 100644 --- a/tapset/syscalls2.stp +++ b/tapset/syscalls2.stp @@ -833,6 +833,29 @@ probe syscall.rename.return = kernel.function("sys_rename").return { retstr = returnstr(1) } +# renameat ___________________________________________________ +# new function with 2.6.16 +# long sys_renameat(int olddfd, const char __user *oldname, +# int newdfd, const char __user *newname) +probe syscall.renameat = kernel.function("sys_renameat") ? { + name = "renameat" + olddfd = $olddfd + olddfd_str = _dfd_str($olddfd) + oldname = $oldname + oldname_str = user_string($oldname) + newdfd = $newdfd + newdfd_str = _dfd_str($newdfd) + newname = $newname + newname_str = user_string($newname) + argstr = sprintf("%s, %s, %s, %s", + olddfd_str, user_string_quoted($oldname), + newdfd_str, user_string_quoted($newname)) +} +probe syscall.renameat.return = kernel.function("sys_renameat").return ? { + name = "renameat" + retstr = returnstr(1) +} + # request_key ________________________________________________ # # long sys_request_key(const char __user *_type, diff --git a/tapset/vfs.stp b/tapset/vfs.stp index 6073dffc..78c79051 100644 --- a/tapset/vfs.stp +++ b/tapset/vfs.stp @@ -57,6 +57,18 @@ function __page_ino:long (page:long) %{ /* pure */ CATCH_DEREF_FAULT(); %} +function __address_inode:long (page:long) %{ /* pure */ + struct page *page = (struct page *)(long)THIS->page; + struct address_space *mapping = + (struct address_space *)(long)THIS; + if (mapping == NULL) { + THIS->__retvalue = -1; + } else { + THIS->__retvalue = (long)kread(&(mapping->host)); + } + CATCH_DEREF_FAULT(); +%} + function __page_dev:long (page:long) %{ /* pure */ struct page *page = (struct page *)(long)THIS->page; struct address_space *mapping = page? kread(&(page->mapping)) : NULL; @@ -152,11 +164,47 @@ function __file_filename:string (file:long) %{ /* pure */ CATCH_DEREF_FAULT(); %} +function __inode_num:long(file:long) +%{ + struct file *file = NULL; + struct dentry *dentry = NULL; + struct inode *inode = NULL; + + file = (struct file *)(long)THIS->file; + dentry = file? kread(&(file->f_dentry)) : NULL; + inode = dentry? kread(&(dentry->d_inode)) : NULL; + THIS->__retvalue = inode? (long)(kread(&(inode->i_ino))) : 0; + CATCH_DEREF_FAULT(); +%} + +function _get_fopv_size:long (iov:long, nr_segs:long) +%{ + struct iovec *iovp = (struct iovec *)(long)THIS->iov; + if (iovp) { + int i; + THIS->__retvalue = 0; + for (i = 0 ; i < THIS->nr_segs ; i++) + THIS->__retvalue += kread(&(iovp[i].iov_len)); + } else + THIS->__retvalue = -1; + + CATCH_DEREF_FAULT(); +%} + +function _dev_minor:long (dev:long) %{ /* pure */ + THIS->__retvalue = (long)MINOR((dev_t)THIS->dev); +%} + +function _dev_major:long (dev:long) %{ /* pure */ + THIS->__retvalue = (long)MAJOR((dev_t)THIS->dev); +%} + probe generic.fop.llseek = kernel.function ("generic_file_llseek") { dev = __file_dev($file) devname = __find_bdevname(dev, __file_bdev($file)) ino = __file_ino($file) + file = $file offset = $offset origin = $origin @@ -168,11 +216,19 @@ probe generic.fop.llseek = kernel.function ("generic_file_llseek") probe generic.fop.llseek.return = kernel.function ("generic_file_llseek").return { name = "generic_file_llseek" - retstr = returnstr(1) + name = "generic_file_llseek" + retstr = $return + file = $file + offset = $offset + origin = $origin + + error = $return < 0 ? $return : 0 + error_str = error ? errno_str(error) : "" } probe generic.fop.aio_read = kernel.function ("generic_file_aio_read") { + file = $iocb->ki_filp dev = __file_dev($iocb->ki_filp) devname = __find_bdevname(dev, __file_bdev($iocb->ki_filp)) ino = __file_ino($iocb->ki_filp) @@ -194,9 +250,15 @@ probe generic.fop.aio_read = kernel.function ("generic_file_aio_read") } probe generic.fop.aio_read.return = kernel.function ("generic_file_aio_read").return { + file = $iocb->ki_filp + nr_segs = $nr_segs name = "generic_file_aio_read" retstr = sprintf("%d", $return) + bytes_read = $return > 0 ? $return : 0 + error = $return < 0 ? $return : 0 + error_str = error ? errno_str(error) : "" + if ($return > 0) { size = $return units = "bytes" @@ -205,6 +267,7 @@ probe generic.fop.aio_read.return = kernel.function ("generic_file_aio_read").re probe generic.fop.aio_write = kernel.function ("generic_file_aio_write") { + file = $iocb->ki_filp dev = __file_dev($iocb->ki_filp) devname = __find_bdevname(dev, __file_bdev($iocb->ki_filp)) ino = __file_ino($iocb->ki_filp) @@ -226,6 +289,7 @@ probe generic.fop.aio_write = kernel.function ("generic_file_aio_write") } probe generic.fop.aio_write.return = kernel.function ("generic_file_aio_write").return { + file = $iocb->ki_filp name = "generic_file_aio_write" retstr = sprintf("%d", $return) @@ -235,6 +299,7 @@ probe generic.fop.aio_write.return = kernel.function ("generic_file_aio_write"). } } +%( kernel_v < "2.6.19" %? probe generic.fop.readv = kernel.function ("generic_file_readv") ? { dev = __file_dev($filp) @@ -279,20 +344,28 @@ probe generic.fop.writev = kernel.function ("generic_file_writev")? } probe generic.fop.writev.return = kernel.function ("generic_file_writev").return ? { + file = $file name = "generic_file_writev" retstr = sprintf("%d", $return) + bytes_written = $return > 0 ? $return : 0 + error = $return < 0 ? $return : 0 + error_str = error ? errno_str(error) : "" + 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") { + file = $file dev = __file_dev($file) devname = __find_bdevname(dev, __file_bdev($file)) ino = __file_ino($file) @@ -306,8 +379,12 @@ probe generic.fop.mmap = kernel.function ("generic_file_mmap") } probe generic.fop.mmap.return = kernel.function ("generic_file_mmap").return { + file = $file name = "generic_file_mmap" retstr = sprintf("%d", $return) + + error = $return < 0 ? $return : 0 + error_str = error ? errno_str(error) : "" } probe generic.fop.open = kernel.function ("generic_file_open") @@ -362,6 +439,7 @@ probe generic.fop.splice_read = kernel.function ("generic_file_splice_read") ? dev = __file_dev($in) devname = __find_bdevname(dev, __file_bdev($in)) ino = __file_ino($in) + file = $in len = $len flags = $flags @@ -376,9 +454,17 @@ probe generic.fop.splice_read.return = kernel.function ("generic_file_splice_rea { name = "generic_file_splice_read" retstr = sprintf("%d", $return) + file = $in + ino = __file_ino($in) + dev_major = _dev_major(_dev) + dev_minor = _dev_minor(_dev) - if ($return > 0) { - size = $return + ret = $return + error = ret < 0 ? ret : 0 + error_str = error ? errno_str(error) : "" + + if (error) { + size = ret units = "bytes" } } @@ -388,6 +474,7 @@ probe generic.fop.splice_write = kernel.function ("generic_file_splice_write") ? dev = __file_dev($out) devname = __find_bdevname(dev, __file_bdev($out)) ino = __file_ino($out) + file = $out len = $len flags = $flags @@ -403,12 +490,18 @@ probe generic.fop.splice_write.return = kernel.function ("generic_file_splice_wr name = "generic_file_splice_write" retstr = sprintf("%d", $return) - if ($return > 0) { + file = $out + + error = $return < 0 ? $return : 0 + error_str = error ? errno_str(error) : "" + + if (error) { size = $return units = "bytes" } } +%( kernel_v < "2.6.19" %? probe generic.fop.read = kernel.function ("generic_file_read") ? { dev = __file_dev($filp) @@ -458,6 +551,7 @@ probe generic.fop.write.return = kernel.function ("generic_file_write").return ? units = "bytes" } } +%) /* generic_writepages calls mpage_writepages(mapping, wbc, NULL) */ probe generic.aop.writepages = kernel.function ("mpage_writepages") @@ -494,12 +588,19 @@ probe vfs.do_sync_read = kernel.function ("do_sync_read") size = len units = "bytes" + bytes_to_read = len } probe vfs.do_sync_read.return = kernel.function ("do_sync_read").return { name = "do_sync_read" retstr = sprintf("%d", $return) + bytes_to_read = $len + ret = $return + bytes_read = ret > 0 ? ret : 0 + error = ret < 0 ? ret : 0 + error_str = error ? errno_str(error) : "" + if ($return > 0) { size = $return units = "bytes" @@ -515,6 +616,7 @@ probe vfs.do_sync_write = kernel.function ("do_sync_write") len = $len pos = ppos_pos($ppos) buf = $buf + bytes_to_write = len name = "do_sync_write" argstr = sprintf("%d, %d , %p", len, pos, buf) @@ -527,8 +629,15 @@ 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 + bytes_to_write = $len + ppos = $ppos + ret = $return + bytes_written = ret > 0 ? ret : 0 + error = $return < 0 ? ret : 0 + error_str = error ? errno_str(error) : "" + + if (error) { + size = ret units = "bytes" } } @@ -677,3 +786,185 @@ probe vfs.remove_from_page_cache.return = kernel.function ("__remove_from_page_c retstr = sprintf("N/A") } +probe vfs.read = kernel.function ("vfs_read") +{ + file = $file + pos = $pos + buf = $buf + bytes_to_read = $count +} + +probe vfs.read.return = kernel.function ("vfs_read").return +{ + file = $file + pos = $pos + buf = $buf + bytes_to_read = $count + + ret = $return + bytes_read = ret > 0 ? ret : 0 + error = ret < 0 ? ret : 0 + error_str = error ? errno_str(error) : "" +} + +probe vfs.readv = kernel.function ("vfs_readv") +{ + file = $file + pos = $pos + vec = $vec + vlen = $vlen + bytes_to_read = _get_fopv_size($vec, $vlen) +} + +probe vfs.readv.return = kernel.function ("vfs_readv").return +{ + file = $file + pos = $pos + vec = $vec + vlen = $vlen + bytes_to_read = _get_fopv_size($vec, $vlen) + + ret = $return + bytes_read = ret > 0 ? ret : 0 + error = ret < 0 ? ret : 0 + error_str = error ? errno_str(error) : "" +} + +probe vfs.write = kernel.function ("vfs_write") +{ + file = $file + pos = $pos + buf = $buf + bytes_to_write = $count +} + +probe vfs.write.return = kernel.function ("vfs_write").return +{ + file = $file + pos = $pos + buf = $buf + bytes_to_write = $count + + ret = $return + bytes_written = ret > 0 ? ret : 0 + error = ret < 0 ? ret : 0 + error_str = error ? errno_str(error) : "" +} + +probe vfs.writev = kernel.function("vfs_writev") +{ + file = $file + pos = $pos + vlen = $vlen + vec = $vec + bytes_to_write = _get_fopv_size($vec, $vlen) +} + +probe vfs.writev.return = kernel.function ("vfs_writev").return +{ + file = $file + pos = $pos + vlen = $vlen + vec = $vec + bytes_to_write = _get_fopv_size($vec, $vlen) + + ret = $return + bytes_written = ret > 0 ? ret : 0 + error = ret < 0 ? ret : 0 + error_str = error ? errno_str(error) : "" +} + +probe _vfs.generic_file_readonly_mmap = +kernel.function("generic_file_readonly_mmap") +{ + file = $file + vma = $vma +} + +probe _vfs.generic_file_readonly_mmap.return = kernel.function ("generic_file_readonly_mmap").return +{ + file = $file + vma = $vma + + ret = $return + error = ret < 0 ? ret : 0 + error_str = error ? errno_str(error) : "" +} + +probe _vfs.generic_block_bmap = kernel.function ("generic_block_bmap") +{ + mapping = $mapping + block = $block + get_block = $get_block +} + +probe _vfs.generic_commit_write = kernel.function ("generic_commit_write") +{ + file = $file + page = $page + from = $from + to = $to +} + +probe _vfs.block_prepare_write = kernel.function ("__block_prepare_write") +{ + _inode = $inode + page = $page + write_from = $from + write_upto = $to +} + +probe _vfs.block_prepare_write.return = kernel.function("__block_prepare_write").return +{ + _inode = $inode + page = $page + write_from = $from + write_upto = $to + + ret = $return + error = ret < 0 ? ret : 0 + error_str = error ? errno_str(error) : "" +} + +probe _vfs.block_write_begin = kernel.function ("block_write_begin") +{ + file = $file + pos = $pos + len = $len + flags = $flags + + _inode = __address_inode($mapping) +} + +probe _vfs.block_write_begin.return = kernel.function ("block_write_begin").return +{ + file = $file + pos = $pos + len = $len + flags = $flags + + _inode = __address_inode($mapping) + + ret = $return + error = ret < 0 ? ret : 0 + error_str = error ? errno_str(error) : "" +} + +probe _vfs.block_write_end = kernel.function ("block_write_end") +{ + file = $file + pos = $pos + len = $len + page = $page + _inode = __address_inode($mapping) +} + +probe _vfs.block_write_end.return = kernel.function ("block_write_end").return +{ + file = $file + pos = $pos + len = $len + page = $page + _inode = __address_inode($mapping) + ret = $return +} |