Я пытаюсь воспроизвести поведение недавно созданного сценария bpftrace:
Код: Выделить всё
fentry:nfsd:nfsd4_write {
$dentry = args->cstate->current_fh.fh_dentry;
$ino = $dentry->d_inode->i_ino;
$uid = args->rqstp->rq_cred.cr_uid.val;
$p = args->cstate->current_fh.fh_export->ex_path;
$export_name = str($p.dentry->d_name.name);
printf("UID: %u, Write to Inode: %lu, Filename: %s/%s, Export: %s, Filepath: %s\n",
$uid,
$ino,
str($dentry->d_parent->d_name.name),
str($dentry->d_name.name),
$export_name,
@paths[$ino]
);
}
Ниже приведен скелет моего кода C, и я опишу странное поведение, которое наблюдаю.
Код: Выделить всё
#include "nfsd-btf.h"
#include "vmlinux.h"
#include
#include
SEC("fentry/nfsd4_write")
int write_ops(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
union nfsd4_op_u *u) {
....
}
Вот что я наблюдаю:
- Если я ничего не делаю с аргументами, то он загружается без проблем.
- Если я пытаюсь получить доступ к rqstp, то он загружается без проблем, хотя при ближайшем рассмотрении я могу получить мусорные значения (?). Например, я могу сделать
но напечатанное значение не является моим фактическим uid (оно дает мне 3243852586, независимо от пользователя или даже root)
Код: Выделить всё
bpf_printk("nfs write %u\n", BPF_CORE_READ(rqstp, rq_cred.cr_uid.val)); - Если я попытаюсь получить доступ к cstate, я получаю отказ в разрешении: 0: (bf) r3 = r2: R2 !read_ok ошибка (или подобные ошибки). Например, я попробовал (весь остальной код закомментировал)
Код: Выделить всё
struct dentry *dentry_ptr = BPF_CORE_READ(cstate, current_fh.fh_dentry);Код: Выделить всё
bpf_printk("%p\n", cstate);Код: Выделить всё
if (!cstate) { bpf_printk("cstate NULL"); return 0; } else { bpf_printk("cstate valid"); }
Я попробовал миллион вещей, но не могу заставить его работать. Буду очень признателен за любой вклад. Спасибо!
Подробнее здесь: https://stackoverflow.com/questions/798 ... pt-program
Мобильная версия