[PATCH 2/3] libdtrace: derive io provider dev_name from the device model
Jacob Carlborg <[email protected]> Mon, 20 Jul 2026 15:30:59 +0200
| Newsgroups | dev.linux.lists.dtrace |
|---|---|
| Message-ID | <[email protected]> |
Without this fix, running any DTrace commands, like `dtrace -l`, results in: ``` dtrace: invalid probe specifier :::: "/usr/lib64/dtrace/6.12.0/io.d", line 134: failed to resolve vmlinux`major_names: Unknown symbol name ``` The issue is that on newer kernels the `major_names` symbols is not available in `kallsyms` anymore. For example, running `grep -w major_names /proc/kallsyms` on a newer kernel shows no results. Running the same command on an older kernel gives the following result: ``` $ grep -w major_names /proc/kallsyms 0000000000000000 b major_names ``` The fix is to stop depending on the `major_names` symbol and instead derive `dev_name` from the device model (the driver name), mirroring the `struct buffer_head` translator. Signed-off-by: Jacob Carlborg <[email protected]> --- libdtrace/io.d.in | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/libdtrace/io.d.in b/libdtrace/io.d.in index 5ea356ee..e96a5b23 100644 --- a/libdtrace/io.d.in +++ b/libdtrace/io.d.in @@ -124,16 +124,27 @@ translator devinfo_t < struct buffer_head *B > { ); }; +define_for_kernel([[__part0_dev]], [[(m4_kver(5,11,0), [[part0->bd_device]])]], [[part0.__dev]]) #pragma D binding "1.6.3" translator translator devinfo_t < struct bio *B > { dev_major = B->__disk_chk == NULL ? 0 : getmajor(B->__bio_part_dev); dev_minor = B->__disk_chk == NULL ? 0 : getminor(B->__bio_part_dev); dev_instance = 0; + /* + * Derive the driver name from the device model rather than the kernel's + * `major_names` array: that symbol became static and is no longer + * resolvable via kallsyms on newer kernels. This mirrors how the + * struct buffer_head devinfo translator above obtains dev_name. + */ dev_name = B->__disk_chk == NULL ? "nfs" - : stringof(((struct blk_major_name **)vmlinux`major_names)[ - getmajor(B->__bio_part_dev) % 255 - ]->name); + : B->__disk->__part0_dev.parent + ? B->__disk->__part0_dev.parent->driver->name + ? stringof(B->__disk->__part0_dev.parent->driver->name) + : "<none>" + : B->__disk->__part0_dev.driver->name + ? stringof(B->__disk->__part0_dev.driver->name) + : "<none>"; dev_statname = B->__disk_chk == NULL ? "nfs" : (B->__bio_partno) == 0 ? stringof(B->__disk->disk_name) : strjoin(stringof(B->__disk->disk_name), lltostr(B->__bio_partno)); -- 2.50.1 (Apple Git-155)