diff --git a/tools/btrfsslower.py b/tools/btrfsslower.py index 0478fe119df6..fcc155e87067 100755 --- a/tools/btrfsslower.py +++ b/tools/btrfsslower.py @@ -211,19 +211,24 @@ if (FILTER_US) return 0; - // workaround (rewriter should handle file to d_iname in one step): - struct dentry *de = NULL; - bpf_probe_read(&de, sizeof(de), &valp->fp->f_path.dentry); - // populate output struct u32 size = PT_REGS_RC(ctx); struct data_t data = {.type = type, .size = size, .delta_us = delta_us, .pid = pid}; data.ts_us = ts / 1000; data.offset = valp->offset; - bpf_probe_read(&data.file, sizeof(data.file), de->d_iname); bpf_get_current_comm(&data.task, sizeof(data.task)); + // workaround (rewriter should handle file to d_name in one step): + struct dentry *de = NULL; + struct qstr qs = {}; + bpf_probe_read(&de, sizeof(de), &valp->fp->f_path.dentry); + bpf_probe_read(&qs, sizeof(qs), (void *)&de->d_name); + if (qs.len == 0) + return 0; + bpf_probe_read(&data.file, sizeof(data.file), (void *)qs.name); + + // output events.perf_submit(ctx, &data, sizeof(data)); return 0; diff --git a/tools/ext4slower.py b/tools/ext4slower.py index ceb2a8f77fd9..20865a584359 100755 --- a/tools/ext4slower.py +++ b/tools/ext4slower.py @@ -206,19 +206,24 @@ if (FILTER_US) return 0; - // workaround (rewriter should handle file to d_iname in one step): - struct dentry *de = NULL; - bpf_probe_read(&de, sizeof(de), &valp->fp->f_path.dentry); - // populate output struct u32 size = PT_REGS_RC(ctx); struct data_t data = {.type = type, .size = size, .delta_us = delta_us, .pid = pid}; data.ts_us = ts / 1000; data.offset = valp->offset; - bpf_probe_read(&data.file, sizeof(data.file), de->d_iname); bpf_get_current_comm(&data.task, sizeof(data.task)); + // workaround (rewriter should handle file to d_name in one step): + struct dentry *de = NULL; + struct qstr qs = {}; + bpf_probe_read(&de, sizeof(de), &valp->fp->f_path.dentry); + bpf_probe_read(&qs, sizeof(qs), (void *)&de->d_name); + if (qs.len == 0) + return 0; + bpf_probe_read(&data.file, sizeof(data.file), (void *)qs.name); + + // output events.perf_submit(ctx, &data, sizeof(data)); return 0; diff --git a/tools/xfsslower.py b/tools/xfsslower.py index 80d98781dc1d..25c5a207c788 100755 --- a/tools/xfsslower.py +++ b/tools/xfsslower.py @@ -176,19 +176,24 @@ if (FILTER_US) return 0; - // workaround (rewriter should handle file to d_iname in one step): - struct dentry *de = NULL; - bpf_probe_read(&de, sizeof(de), &valp->fp->f_path.dentry); - // populate output struct u32 size = PT_REGS_RC(ctx); struct data_t data = {.type = type, .size = size, .delta_us = delta_us, .pid = pid}; data.ts_us = ts / 1000; data.offset = valp->offset; - bpf_probe_read(&data.file, sizeof(data.file), de->d_iname); bpf_get_current_comm(&data.task, sizeof(data.task)); + // workaround (rewriter should handle file to d_name in one step): + struct dentry *de = NULL; + struct qstr qs = {}; + bpf_probe_read(&de, sizeof(de), &valp->fp->f_path.dentry); + bpf_probe_read(&qs, sizeof(qs), (void *)&de->d_name); + if (qs.len == 0) + return 0; + bpf_probe_read(&data.file, sizeof(data.file), (void *)qs.name); + + // output events.perf_submit(ctx, &data, sizeof(data)); return 0; diff --git a/tools/zfsslower.py b/tools/zfsslower.py index 8456f21db87c..e2be68410583 100755 --- a/tools/zfsslower.py +++ b/tools/zfsslower.py @@ -180,19 +180,24 @@ if (FILTER_US) return 0; - // workaround (rewriter should handle file to d_iname in one step): - struct dentry *de = NULL; - bpf_probe_read(&de, sizeof(de), &valp->fp->f_path.dentry); - // populate output struct u32 size = PT_REGS_RC(ctx); struct data_t data = {.type = type, .size = size, .delta_us = delta_us, .pid = pid}; data.ts_us = ts / 1000; data.offset = valp->offset; - bpf_probe_read(&data.file, sizeof(data.file), de->d_iname); bpf_get_current_comm(&data.task, sizeof(data.task)); + // workaround (rewriter should handle file to d_name in one step): + struct dentry *de = NULL; + struct qstr qs = {}; + bpf_probe_read(&de, sizeof(de), &valp->fp->f_path.dentry); + bpf_probe_read(&qs, sizeof(qs), (void *)&de->d_name); + if (qs.len == 0) + return 0; + bpf_probe_read(&data.file, sizeof(data.file), (void *)qs.name); + + // output events.perf_submit(ctx, &data, sizeof(data)); return 0;