int bpf_obj_get_user(const char __user *pathname) { enum bpf_type type = BPF_TYPE_UNSPEC; struct filename *pname; int ret = -ENOENT; void *raw; pname = getname(pathname); if (IS_ERR(pname)) return PTR_ERR(pname); raw = bpf_obj_do_get(pname, &type); if (IS_ERR(raw)) { ret = PTR_ERR(raw); goto out; } if (type == BPF_TYPE_PROG) ret = bpf_prog_new_fd(raw); else if (type == BPF_TYPE_MAP) ret = bpf_map_new_fd(raw); else goto out; if (ret < 0) bpf_any_put(raw, type); out: putname(pname); return ret; }
int bpf_obj_pin_user(u32 ufd, const char __user *pathname) { struct filename *pname; enum bpf_type type; void *raw; int ret; pname = getname(pathname); if (IS_ERR(pname)) return PTR_ERR(pname); raw = bpf_fd_probe_obj(ufd, &type); if (IS_ERR(raw)) { ret = PTR_ERR(raw); goto out; } ret = bpf_obj_do_pin(pname, raw, type); if (ret != 0) bpf_any_put(raw, type); if ((trace_bpf_obj_pin_prog_enabled() || trace_bpf_obj_pin_map_enabled()) && !ret) { if (type == BPF_TYPE_PROG) trace_bpf_obj_pin_prog(raw, ufd, pname); if (type == BPF_TYPE_MAP) trace_bpf_obj_pin_map(raw, ufd, pname); } out: putname(pname); return ret; }
static void bpf_evict_inode(struct inode *inode) { enum bpf_type type; truncate_inode_pages_final(&inode->i_data); clear_inode(inode); if (!bpf_inode_type(inode, &type)) bpf_any_put(inode->i_private, type); }
int bpf_obj_get_user(const char __user *pathname, int flags) { enum bpf_type type = BPF_TYPE_UNSPEC; struct filename *pname; int ret = -ENOENT; int f_flags; void *raw; f_flags = bpf_get_file_flag(flags); if (f_flags < 0) return f_flags; pname = getname(pathname); if (IS_ERR(pname)) return PTR_ERR(pname); raw = bpf_obj_do_get(pname, &type, f_flags); if (IS_ERR(raw)) { ret = PTR_ERR(raw); goto out; } if (type == BPF_TYPE_PROG) ret = bpf_prog_new_fd(raw); else if (type == BPF_TYPE_MAP) ret = bpf_map_new_fd(raw, f_flags); else goto out; if (ret < 0) { bpf_any_put(raw, type); } else if (trace_bpf_obj_get_prog_enabled() || trace_bpf_obj_get_map_enabled()) { if (type == BPF_TYPE_PROG) trace_bpf_obj_get_prog(raw, ret, pname); if (type == BPF_TYPE_MAP) trace_bpf_obj_get_map(raw, ret, pname); } out: putname(pname); return ret; }
int bpf_obj_pin_user(u32 ufd, const char __user *pathname) { struct filename *pname; enum bpf_type type; void *raw; int ret; pname = getname(pathname); if (IS_ERR(pname)) return PTR_ERR(pname); raw = bpf_fd_probe_obj(ufd, &type); if (IS_ERR(raw)) { ret = PTR_ERR(raw); goto out; } ret = bpf_obj_do_pin(pname, raw, type); if (ret != 0) bpf_any_put(raw, type); out: putname(pname); return ret; }