Код: Выделить всё
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;
printf("UID: %u, Write to Inode: %lu, Filename: %s/%s\n",
$uid,
$ino,
str($dentry->d_parent->d_name.name),
str($dentry->d_name.name),
);
}
Ниже приведен скелет кода 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, то он загружается без проблем, хотя при ближайшем рассмотрении я могу получить мусорные значения (?). Например, верификатор не жалуется на присоединение с помощью этого кода в write_ops
но напечатанное значение не является моим фактическим 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 ошибка (или подобные ошибки). Например, я попробовал использовать функцию write_ops:
Код: Выделить всё
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"); }
Код: Выделить всё
import (
"log"
"time"
"github.com/cilium/ebpf/link"
)
func main() {
// Load eBPF objects to the objs struct (not the kernel yet!)
var objs collectorObjects
if err := loadCollectorObjects(&objs, nil); err != nil {
log.Fatal("Loading eBPF objects:", err)
}
defer objs.Close()
link, err := link.AttachTracing(link.TracingOptions{
Program: objs.WriteOps,
})
if err != nil {
log.Fatal("Attaching Fentry:", err)
}
defer link.Close()
log.Printf("Program Loaded!\n")
time.Sleep(10*time.Seconds)
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... s-function
Мобильная версия