diff options
Diffstat (limited to 'kernel/bpf/inode.c')
-rw-r--r-- | kernel/bpf/inode.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/kernel/bpf/inode.c b/kernel/bpf/inode.c index 0b030c9126d3..fddcae801724 100644 --- a/kernel/bpf/inode.c +++ b/kernel/bpf/inode.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/parser.h> | 21 | #include <linux/parser.h> |
22 | #include <linux/filter.h> | 22 | #include <linux/filter.h> |
23 | #include <linux/bpf.h> | 23 | #include <linux/bpf.h> |
24 | #include <linux/bpf_trace.h> | ||
24 | 25 | ||
25 | enum bpf_type { | 26 | enum bpf_type { |
26 | BPF_TYPE_UNSPEC = 0, | 27 | BPF_TYPE_UNSPEC = 0, |
@@ -281,6 +282,13 @@ int bpf_obj_pin_user(u32 ufd, const char __user *pathname) | |||
281 | ret = bpf_obj_do_pin(pname, raw, type); | 282 | ret = bpf_obj_do_pin(pname, raw, type); |
282 | if (ret != 0) | 283 | if (ret != 0) |
283 | bpf_any_put(raw, type); | 284 | bpf_any_put(raw, type); |
285 | if ((trace_bpf_obj_pin_prog_enabled() || | ||
286 | trace_bpf_obj_pin_map_enabled()) && !ret) { | ||
287 | if (type == BPF_TYPE_PROG) | ||
288 | trace_bpf_obj_pin_prog(raw, ufd, pname); | ||
289 | if (type == BPF_TYPE_MAP) | ||
290 | trace_bpf_obj_pin_map(raw, ufd, pname); | ||
291 | } | ||
284 | out: | 292 | out: |
285 | putname(pname); | 293 | putname(pname); |
286 | return ret; | 294 | return ret; |
@@ -342,8 +350,15 @@ int bpf_obj_get_user(const char __user *pathname) | |||
342 | else | 350 | else |
343 | goto out; | 351 | goto out; |
344 | 352 | ||
345 | if (ret < 0) | 353 | if (ret < 0) { |
346 | bpf_any_put(raw, type); | 354 | bpf_any_put(raw, type); |
355 | } else if (trace_bpf_obj_get_prog_enabled() || | ||
356 | trace_bpf_obj_get_map_enabled()) { | ||
357 | if (type == BPF_TYPE_PROG) | ||
358 | trace_bpf_obj_get_prog(raw, ret, pname); | ||
359 | if (type == BPF_TYPE_MAP) | ||
360 | trace_bpf_obj_get_map(raw, ret, pname); | ||
361 | } | ||
347 | out: | 362 | out: |
348 | putname(pname); | 363 | putname(pname); |
349 | return ret; | 364 | return ret; |