summaryrefslogtreecommitdiffstats
path: root/tapset
diff options
context:
space:
mode:
authorDavid Smith <dsmith@redhat.com>2010-03-30 15:53:51 -0500
committerDavid Smith <dsmith@redhat.com>2010-03-30 15:53:51 -0500
commit1713a05f2afa6df663a7fd3552849759a7d3ff48 (patch)
treebd182e9ce4c075cf4cde34a273966761fa3edbff /tapset
parenteda8b449152cf0f864d2cd250fb2b7a2945bc996 (diff)
downloadsystemtap-steved-1713a05f2afa6df663a7fd3552849759a7d3ff48.tar.gz
systemtap-steved-1713a05f2afa6df663a7fd3552849759a7d3ff48.tar.xz
systemtap-steved-1713a05f2afa6df663a7fd3552849759a7d3ff48.zip
PR 9871 (partial) fix. Removed some embedded-C in ioblock.stp/vfs.stp.
* tapset/dev.stp: Added a bdevname() script function. * tapset/ioblock.stp: Rewrote the embedded-C devname function to just use bdevname() script function. * tapset/vfs.stp: Removed embedded-C __bdevname() C function. Calls bdevname() script function instead. * tapset/string.stp: Added isdigit() function.
Diffstat (limited to 'tapset')
-rw-r--r--tapset/dev.stp26
-rw-r--r--tapset/ioblock.stp15
-rw-r--r--tapset/string.stp14
-rw-r--r--tapset/vfs.stp16
4 files changed, 42 insertions, 29 deletions
diff --git a/tapset/dev.stp b/tapset/dev.stp
index 80449324..2c22031a 100644
--- a/tapset/dev.stp
+++ b/tapset/dev.stp
@@ -1,5 +1,5 @@
-// Device numbering tapset
-// Copyright (C) 2008 Red Hat Corp.
+// Device tapset
+// Copyright (C) 2008, 2010 Red Hat Corp.
//
// This file is part of systemtap, and is free software. You can
// redistribute it and/or modify it under the terms of the GNU General
@@ -31,3 +31,25 @@ function usrdev2kerndev:long(dev:long)
%{ /* pure */
THIS->__retvalue = new_decode_dev(THIS->dev);
%}
+
+function bdevname:string(bdev:long)
+{
+ if (bdev == 0)
+ return "N/A"
+
+ hd = @cast(bdev, "block_device")->bd_disk
+
+ if (@cast(bdev, "block_device")->bd_part)
+ partno = @cast(bdev, "block_device")->bd_part->partno
+ else
+ partno = MINOR(@cast(bdev, "block_device")->bd_dev)
+ - @cast(bdev, "block_device")->bd_disk->first_minor;
+
+ if (!partno)
+ return kernel_string(@cast(hd, "gendisk")->disk_name)
+ disk_name = kernel_string(@cast(hd, "gendisk")->disk_name)
+ if (isdigit(substr(disk_name, strlen(disk_name) - 1, 1)))
+ return sprintf("%sp%d", disk_name, partno)
+ else
+ return sprintf("%s%d", disk_name, partno)
+}
diff --git a/tapset/ioblock.stp b/tapset/ioblock.stp
index 761e7df7..6376ac23 100644
--- a/tapset/ioblock.stp
+++ b/tapset/ioblock.stp
@@ -62,18 +62,9 @@ function __bio_start_sect:long(bio:long)
/* returns the block device name */
function __bio_devname:string(bio:long)
-%{ /* pure */
- char b[BDEVNAME_SIZE];
- struct bio *bio = (struct bio *)(long)THIS->bio;
- struct block_device *bdev = kread(&(bio->bi_bdev));
- if (bdev == NULL) {
- strlcpy(THIS->__retvalue, "N/A", MAXSTRINGLEN);
- } else {
- const char *name = bdevname(bdev, b); /* FIXME: deref hazard! */
- deref_string(THIS->__retvalue, name, MAXSTRINGLEN);
- }
- CATCH_DEREF_FAULT();
-%}
+{
+ return bdevname(@cast(bio, "bio")->bi_bdev)
+}
global BIO_READ = 0, BIO_WRITE = 1
diff --git a/tapset/string.stp b/tapset/string.stp
index d03e5570..9f2c150d 100644
--- a/tapset/string.stp
+++ b/tapset/string.stp
@@ -164,3 +164,17 @@ function strtol:long(str:string, base:long)
%{ /* pure */ /* unprivileged */
THIS->__retvalue = simple_strtol(THIS->str, NULL, THIS->base);
%}
+
+/**
+ * sfunction isdigit - Checks for a digit.
+ * @str: String to check.
+ *
+ * Description: Checks for a digit (0 through 9) as the first
+ * character of a string. Returns non-zero if true, and a zero if
+ * false.
+ */
+function isdigit:long(str:string)
+%{ /* pure */ /* unprivileged */
+ THIS->__retvalue = isdigit(THIS->str[0]);
+%}
+
diff --git a/tapset/vfs.stp b/tapset/vfs.stp
index 5a38a924..cd5365f0 100644
--- a/tapset/vfs.stp
+++ b/tapset/vfs.stp
@@ -16,20 +16,6 @@
/* 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);
- } else {
- const char *name = bdevname(bdev, b); /* FIXME: deref hazard! */
- deref_string(THIS->__retvalue, name, MAXSTRINGLEN);
- }
-
- CATCH_DEREF_FAULT();
-%}
-
/*
We don't want to have to do a bdevname() call every time
we want a devname, so we'll hash them here.
@@ -42,7 +28,7 @@ function __find_bdevname:string(dev:long, bdev:long)
if (dev in __devnames)
return __devnames[dev]
else
- return __devnames[dev] = __bdevname(bdev)
+ return __devnames[dev] = bdevname(bdev)
}
function ppos_pos:long (ppos:long) %{ /* pure */