mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-07 04:12:04 -04:00
UPSTREAM: bpf: Add d_path helper
Adding d_path helper function that returns full path for given 'struct path' object, which needs to be the kernel BTF 'path' object. The path is returned in buffer provided 'buf' of size 'sz' and is zero terminated. bpf_d_path(&file->f_path, buf, size); The helper calls directly d_path function, so there's only limited set of function it can be called from. Adding just very modest set for the start. Updating also bpf.h tools uapi header and adding 'path' to bpf_helpers_doc.py script. Change-Id: Ic530ea9da08f5f6479bfd7a5b7c8c26d7d4aaa66 Signed-off-by: Jiri Olsa <jolsa@kernel.org> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Acked-by: Andrii Nakryiko <andriin@fb.com> Acked-by: KP Singh <kpsingh@google.com> Link: https://lore.kernel.org/bpf/20200825192124.710397-11-jolsa@kernel.org
This commit is contained in:
parent
c72965f7f4
commit
73ea92cc7a
4 changed files with 78 additions and 0 deletions
|
|
@ -998,6 +998,52 @@ static const struct bpf_func_proto bpf_send_signal_thread_proto = {
|
|||
.arg1_type = ARG_ANYTHING,
|
||||
};
|
||||
|
||||
BPF_CALL_3(bpf_d_path, struct path *, path, char *, buf, u32, sz)
|
||||
{
|
||||
long len;
|
||||
char *p;
|
||||
|
||||
if (!sz)
|
||||
return 0;
|
||||
|
||||
p = d_path(path, buf, sz);
|
||||
if (IS_ERR(p)) {
|
||||
len = PTR_ERR(p);
|
||||
} else {
|
||||
len = buf + sz - p;
|
||||
memmove(buf, p, len);
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
BTF_SET_START(btf_allowlist_d_path)
|
||||
BTF_ID(func, vfs_truncate)
|
||||
BTF_ID(func, vfs_fallocate)
|
||||
BTF_ID(func, dentry_open)
|
||||
BTF_ID(func, vfs_getattr)
|
||||
BTF_ID(func, filp_close)
|
||||
BTF_SET_END(btf_allowlist_d_path)
|
||||
|
||||
static bool bpf_d_path_allowed(const struct bpf_prog *prog)
|
||||
{
|
||||
return btf_id_set_contains(&btf_allowlist_d_path, prog->aux->attach_btf_id);
|
||||
}
|
||||
|
||||
BTF_ID_LIST(bpf_d_path_btf_ids)
|
||||
BTF_ID(struct, path)
|
||||
|
||||
static const struct bpf_func_proto bpf_d_path_proto = {
|
||||
.func = bpf_d_path,
|
||||
.gpl_only = false,
|
||||
.ret_type = RET_INTEGER,
|
||||
.arg1_type = ARG_PTR_TO_BTF_ID,
|
||||
.arg2_type = ARG_PTR_TO_MEM,
|
||||
.arg3_type = ARG_CONST_SIZE_OR_ZERO,
|
||||
.btf_id = bpf_d_path_btf_ids,
|
||||
.allowed = bpf_d_path_allowed,
|
||||
};
|
||||
|
||||
const struct bpf_func_proto *
|
||||
bpf_tracing_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
|
||||
{
|
||||
|
|
@ -1477,6 +1523,8 @@ tracing_prog_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
|
|||
return prog->expected_attach_type == BPF_TRACE_ITER ?
|
||||
&bpf_seq_write_proto :
|
||||
NULL;
|
||||
case BPF_FUNC_d_path:
|
||||
return &bpf_d_path_proto;
|
||||
default:
|
||||
return raw_tp_prog_func_proto(func_id, prog);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue