diff options
author | David Smith <dsmith@redhat.com> | 2010-03-30 15:53:51 -0500 |
---|---|---|
committer | David Smith <dsmith@redhat.com> | 2010-03-30 15:53:51 -0500 |
commit | 1713a05f2afa6df663a7fd3552849759a7d3ff48 (patch) | |
tree | bd182e9ce4c075cf4cde34a273966761fa3edbff /tapset | |
parent | eda8b449152cf0f864d2cd250fb2b7a2945bc996 (diff) | |
download | systemtap-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.stp | 26 | ||||
-rw-r--r-- | tapset/ioblock.stp | 15 | ||||
-rw-r--r-- | tapset/string.stp | 14 | ||||
-rw-r--r-- | tapset/vfs.stp | 16 |
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 */ |