Lines Matching +full:m +full:- +full:mode
1 // SPDX-License-Identifier: GPL-2.0-only
93 return ERR_PTR(-EINVAL); in bpf_fd_probe_obj()
104 umode_t mode) in bpf_get_inode() argument
108 switch (mode & S_IFMT) { in bpf_get_inode()
114 return ERR_PTR(-EINVAL); in bpf_get_inode()
119 return ERR_PTR(-ENOSPC); in bpf_get_inode()
121 inode->i_ino = get_next_ino(); in bpf_get_inode()
124 inode_init_owner(&nop_mnt_idmap, inode, dir, mode); in bpf_get_inode()
132 if (inode->i_op == &bpf_prog_iops) in bpf_inode_type()
134 else if (inode->i_op == &bpf_map_iops) in bpf_inode_type()
136 else if (inode->i_op == &bpf_link_iops) in bpf_inode_type()
139 return -EACCES; in bpf_inode_type()
154 struct dentry *dentry, umode_t mode) in bpf_mkdir() argument
158 inode = bpf_get_inode(dir->i_sb, dir, mode | S_IFDIR); in bpf_mkdir()
162 inode->i_op = &bpf_dir_iops; in bpf_mkdir()
163 inode->i_fop = &simple_dir_operations; in bpf_mkdir()
177 static struct map_iter *map_iter(struct seq_file *m) in map_iter() argument
179 return m->private; in map_iter()
182 static struct bpf_map *seq_file_to_map(struct seq_file *m) in seq_file_to_map() argument
184 return file_inode(m->file)->i_private; in seq_file_to_map()
190 kfree(iter->key); in map_iter_free()
203 iter->key = kzalloc(map->key_size, GFP_KERNEL | __GFP_NOWARN); in map_iter_alloc()
204 if (!iter->key) in map_iter_alloc()
214 static void *map_seq_next(struct seq_file *m, void *v, loff_t *pos) in map_seq_next() argument
216 struct bpf_map *map = seq_file_to_map(m); in map_seq_next()
217 void *key = map_iter(m)->key; in map_seq_next()
221 if (map_iter(m)->done) in map_seq_next()
230 if (map->ops->map_get_next_key(map, prev_key, key)) { in map_seq_next()
231 map_iter(m)->done = true; in map_seq_next()
238 static void *map_seq_start(struct seq_file *m, loff_t *pos) in map_seq_start() argument
240 if (map_iter(m)->done) in map_seq_start()
243 return *pos ? map_iter(m)->key : SEQ_START_TOKEN; in map_seq_start()
246 static void map_seq_stop(struct seq_file *m, void *v) in map_seq_stop() argument
250 static int map_seq_show(struct seq_file *m, void *v) in map_seq_show() argument
252 struct bpf_map *map = seq_file_to_map(m); in map_seq_show()
253 void *key = map_iter(m)->key; in map_seq_show()
256 seq_puts(m, "# WARNING!! The output is for debug purpose only\n"); in map_seq_show()
257 seq_puts(m, "# WARNING!! The output format will change\n"); in map_seq_show()
259 map->ops->map_seq_show_elem(map, key, m); in map_seq_show()
274 struct bpf_map *map = inode->i_private; in bpffs_map_open()
276 struct seq_file *m; in bpffs_map_open() local
281 return -ENOMEM; in bpffs_map_open()
289 m = file->private_data; in bpffs_map_open()
290 m->private = iter; in bpffs_map_open()
297 struct seq_file *m = file->private_data; in bpffs_map_release() local
299 map_iter_free(map_iter(m)); in bpffs_map_release()
307 * "cat bpffs/pathto/a-pinned-map".
322 return -EIO; in bpffs_obj_open()
329 static int bpf_mkobj_ops(struct dentry *dentry, umode_t mode, void *raw, in bpf_mkobj_ops() argument
333 struct inode *dir = dentry->d_parent->d_inode; in bpf_mkobj_ops()
334 struct inode *inode = bpf_get_inode(dir->i_sb, dir, mode); in bpf_mkobj_ops()
338 inode->i_op = iops; in bpf_mkobj_ops()
339 inode->i_fop = fops; in bpf_mkobj_ops()
340 inode->i_private = raw; in bpf_mkobj_ops()
346 static int bpf_mkprog(struct dentry *dentry, umode_t mode, void *arg) in bpf_mkprog() argument
348 return bpf_mkobj_ops(dentry, mode, arg, &bpf_prog_iops, in bpf_mkprog()
352 static int bpf_mkmap(struct dentry *dentry, umode_t mode, void *arg) in bpf_mkmap() argument
356 return bpf_mkobj_ops(dentry, mode, arg, &bpf_map_iops, in bpf_mkmap()
361 static int bpf_mklink(struct dentry *dentry, umode_t mode, void *arg) in bpf_mklink() argument
365 return bpf_mkobj_ops(dentry, mode, arg, &bpf_link_iops, in bpf_mklink()
376 if ((dir->i_mode & S_IALLUGO) && in bpf_lookup()
377 strchr(dentry->d_name.name, '.')) in bpf_lookup()
378 return ERR_PTR(-EPERM); in bpf_lookup()
390 return -ENOMEM; in bpf_symlink()
392 inode = bpf_get_inode(dir->i_sb, dir, S_IRWXUGO | S_IFLNK); in bpf_symlink()
398 inode->i_op = &simple_symlink_inode_operations; in bpf_symlink()
399 inode->i_link = link; in bpf_symlink()
419 umode_t mode = S_IFREG | S_IRUSR; in bpf_iter_link_pin_kernel() local
423 inode_lock(parent->d_inode); in bpf_iter_link_pin_kernel()
426 inode_unlock(parent->d_inode); in bpf_iter_link_pin_kernel()
429 ret = bpf_mkobj_ops(dentry, mode, link, &bpf_link_iops, in bpf_iter_link_pin_kernel()
432 inode_unlock(parent->d_inode); in bpf_iter_link_pin_kernel()
442 umode_t mode; in bpf_obj_do_pin() local
450 if (dir->i_op != &bpf_dir_iops) { in bpf_obj_do_pin()
451 ret = -EPERM; in bpf_obj_do_pin()
455 mode = S_IFREG | ((S_IRUSR | S_IWUSR) & ~current_umask()); in bpf_obj_do_pin()
456 ret = security_path_mknod(&path, dentry, mode, 0); in bpf_obj_do_pin()
462 ret = vfs_mkobj(dentry, mode, bpf_mkprog, raw); in bpf_obj_do_pin()
465 ret = vfs_mkobj(dentry, mode, bpf_mkmap, raw); in bpf_obj_do_pin()
468 ret = vfs_mkobj(dentry, mode, bpf_mklink, raw); in bpf_obj_do_pin()
471 ret = -EPERM; in bpf_obj_do_pin()
516 raw = bpf_any_get(inode->i_private, *type); in bpf_obj_do_get()
547 ret = (f_flags != O_RDWR) ? -EINVAL : bpf_link_new_fd(raw); in bpf_obj_get_user()
549 return -ENOENT; in bpf_obj_get_user()
563 if (inode->i_op == &bpf_map_iops) in __get_prog_inode()
564 return ERR_PTR(-EINVAL); in __get_prog_inode()
565 if (inode->i_op == &bpf_link_iops) in __get_prog_inode()
566 return ERR_PTR(-EINVAL); in __get_prog_inode()
567 if (inode->i_op != &bpf_prog_iops) in __get_prog_inode()
568 return ERR_PTR(-EACCES); in __get_prog_inode()
570 prog = inode->i_private; in __get_prog_inode()
577 return ERR_PTR(-EINVAL); in __get_prog_inode()
619 return -ENOENT; in find_bpffs_btf_enums()
621 info->btf = btf; in find_bpffs_btf_enums()
628 name = btf_name_by_offset(btf, t->name_off); in find_bpffs_btf_enums()
633 info->cmd_t = t; in find_bpffs_btf_enums()
635 info->map_t = t; in find_bpffs_btf_enums()
637 info->prog_t = t; in find_bpffs_btf_enums()
639 info->attach_t = t; in find_bpffs_btf_enums()
643 if (info->cmd_t && info->map_t && info->prog_t && info->attach_t) in find_bpffs_btf_enums()
647 return -ESRCH; in find_bpffs_btf_enums()
665 name = btf_name_by_offset(btf, e->name_off); in find_btf_enum_const()
671 *value = e->val; in find_btf_enum_const()
679 static void seq_print_delegate_opts(struct seq_file *m, in seq_print_delegate_opts() argument
697 seq_printf(m, ",%s", opt_name); in seq_print_delegate_opts()
699 seq_printf(m, "=any"); in seq_print_delegate_opts()
706 name = btf_name_by_offset(btf, e->name_off); in seq_print_delegate_opts()
709 msk = 1ULL << e->val; in seq_print_delegate_opts()
711 /* emit lower-case name without prefix */ in seq_print_delegate_opts()
712 seq_putc(m, first ? '=' : ':'); in seq_print_delegate_opts()
715 seq_putc(m, tolower(*name)); in seq_print_delegate_opts()
725 seq_printf(m, "%c0x%llx", first ? '=' : ':', delegate_msk); in seq_print_delegate_opts()
731 static int bpf_show_options(struct seq_file *m, struct dentry *root) in bpf_show_options() argument
734 umode_t mode = inode->i_mode & S_IALLUGO & ~S_ISVTX; in bpf_show_options() local
735 struct bpf_mount_opts *opts = root->d_sb->s_fs_info; in bpf_show_options()
738 if (!uid_eq(inode->i_uid, GLOBAL_ROOT_UID)) in bpf_show_options()
739 seq_printf(m, ",uid=%u", in bpf_show_options()
740 from_kuid_munged(&init_user_ns, inode->i_uid)); in bpf_show_options()
741 if (!gid_eq(inode->i_gid, GLOBAL_ROOT_GID)) in bpf_show_options()
742 seq_printf(m, ",gid=%u", in bpf_show_options()
743 from_kgid_munged(&init_user_ns, inode->i_gid)); in bpf_show_options()
744 if (mode != S_IRWXUGO) in bpf_show_options()
745 seq_printf(m, ",mode=%o", mode); in bpf_show_options()
747 if (opts->delegate_cmds || opts->delegate_maps || in bpf_show_options()
748 opts->delegate_progs || opts->delegate_attachs) { in bpf_show_options()
754 mask = (1ULL << __MAX_BPF_CMD) - 1; in bpf_show_options()
755 seq_print_delegate_opts(m, "delegate_cmds", in bpf_show_options()
757 opts->delegate_cmds, mask); in bpf_show_options()
759 mask = (1ULL << __MAX_BPF_MAP_TYPE) - 1; in bpf_show_options()
760 seq_print_delegate_opts(m, "delegate_maps", in bpf_show_options()
762 opts->delegate_maps, mask); in bpf_show_options()
764 mask = (1ULL << __MAX_BPF_PROG_TYPE) - 1; in bpf_show_options()
765 seq_print_delegate_opts(m, "delegate_progs", in bpf_show_options()
767 opts->delegate_progs, mask); in bpf_show_options()
769 mask = (1ULL << __MAX_BPF_ATTACH_TYPE) - 1; in bpf_show_options()
770 seq_print_delegate_opts(m, "delegate_attachs", in bpf_show_options()
772 opts->delegate_attachs, mask); in bpf_show_options()
782 if (S_ISLNK(inode->i_mode)) in bpf_free_inode()
783 kfree(inode->i_link); in bpf_free_inode()
785 bpf_any_put(inode->i_private, type); in bpf_free_inode()
809 fsparam_u32oct ("mode", OPT_MODE),
819 struct bpf_mount_opts *opts = fc->s_fs_info; in bpf_parse_param()
829 * better continue to ignore non-existing options for bpf. in bpf_parse_param()
831 if (opt == -ENOPARAM) { in bpf_parse_param()
833 if (opt != -ENOPARAM) in bpf_parse_param()
853 if (!kuid_has_mapping(fc->user_ns, uid)) in bpf_parse_param()
856 opts->uid = uid; in bpf_parse_param()
867 if (!kgid_has_mapping(fc->user_ns, gid)) in bpf_parse_param()
870 opts->gid = gid; in bpf_parse_param()
873 opts->mode = result.uint_32 & S_IALLUGO; in bpf_parse_param()
891 delegate_msk = &opts->delegate_cmds; in bpf_parse_param()
896 delegate_msk = &opts->delegate_maps; in bpf_parse_param()
901 delegate_msk = &opts->delegate_progs; in bpf_parse_param()
906 delegate_msk = &opts->delegate_attachs; in bpf_parse_param()
911 return -EINVAL; in bpf_parse_param()
914 str = param->string; in bpf_parse_param()
929 return -EPERM; in bpf_parse_param()
941 return invalfc(fc, "Bad value for '%s'", param->key); in bpf_parse_param()
961 if (!try_module_get(bpf_preload_ops->owner)) { in bpf_preload_mod_get()
972 module_put(bpf_preload_ops->owner); in bpf_preload_mod_put()
991 err = bpf_preload_ops->preload(objs); in populate_bpffs()
1013 struct bpf_mount_opts *opts = sb->s_fs_info; in bpf_fill_super()
1018 if (fc->user_ns != &init_user_ns && !capable(CAP_SYS_ADMIN)) in bpf_fill_super()
1019 return -EPERM; in bpf_fill_super()
1025 sb->s_op = &bpf_super_ops; in bpf_fill_super()
1027 inode = sb->s_root->d_inode; in bpf_fill_super()
1028 inode->i_uid = opts->uid; in bpf_fill_super()
1029 inode->i_gid = opts->gid; in bpf_fill_super()
1030 inode->i_op = &bpf_dir_iops; in bpf_fill_super()
1031 inode->i_mode &= ~S_IALLUGO; in bpf_fill_super()
1032 populate_bpffs(sb->s_root); in bpf_fill_super()
1033 inode->i_mode |= S_ISVTX | opts->mode; in bpf_fill_super()
1044 kfree(fc->s_fs_info); in bpf_free_fc()
1062 return -ENOMEM; in bpf_init_fs_context()
1064 opts->mode = S_IRWXUGO; in bpf_init_fs_context()
1065 opts->uid = current_fsuid(); in bpf_init_fs_context()
1066 opts->gid = current_fsgid(); in bpf_init_fs_context()
1069 opts->delegate_cmds = 0; in bpf_init_fs_context()
1070 opts->delegate_maps = 0; in bpf_init_fs_context()
1071 opts->delegate_progs = 0; in bpf_init_fs_context()
1072 opts->delegate_attachs = 0; in bpf_init_fs_context()
1074 fc->s_fs_info = opts; in bpf_init_fs_context()
1075 fc->ops = &bpf_context_ops; in bpf_init_fs_context()
1081 struct bpf_mount_opts *opts = sb->s_fs_info; in bpf_kill_super()