Lines Matching +full:m +full:- +full:mode
1 // SPDX-License-Identifier: GPL-2.0-only
92 return ERR_PTR(-EINVAL); in bpf_fd_probe_obj()
103 umode_t mode) in bpf_get_inode() argument
107 switch (mode & S_IFMT) { in bpf_get_inode()
113 return ERR_PTR(-EINVAL); in bpf_get_inode()
118 return ERR_PTR(-ENOSPC); in bpf_get_inode()
120 inode->i_ino = get_next_ino(); in bpf_get_inode()
121 inode->i_atime = current_time(inode); in bpf_get_inode()
122 inode->i_mtime = inode->i_atime; in bpf_get_inode()
123 inode->i_ctime = inode->i_atime; in bpf_get_inode()
125 inode_init_owner(&init_user_ns, inode, dir, mode); in bpf_get_inode()
133 if (inode->i_op == &bpf_prog_iops) in bpf_inode_type()
135 else if (inode->i_op == &bpf_map_iops) in bpf_inode_type()
137 else if (inode->i_op == &bpf_link_iops) in bpf_inode_type()
140 return -EACCES; in bpf_inode_type()
151 dir->i_mtime = current_time(dir); in bpf_dentry_finalize()
152 dir->i_ctime = dir->i_mtime; in bpf_dentry_finalize()
156 struct dentry *dentry, umode_t mode) in bpf_mkdir() argument
160 inode = bpf_get_inode(dir->i_sb, dir, mode | S_IFDIR); in bpf_mkdir()
164 inode->i_op = &bpf_dir_iops; in bpf_mkdir()
165 inode->i_fop = &simple_dir_operations; in bpf_mkdir()
179 static struct map_iter *map_iter(struct seq_file *m) in map_iter() argument
181 return m->private; in map_iter()
184 static struct bpf_map *seq_file_to_map(struct seq_file *m) in seq_file_to_map() argument
186 return file_inode(m->file)->i_private; in seq_file_to_map()
192 kfree(iter->key); in map_iter_free()
205 iter->key = kzalloc(map->key_size, GFP_KERNEL | __GFP_NOWARN); in map_iter_alloc()
206 if (!iter->key) in map_iter_alloc()
216 static void *map_seq_next(struct seq_file *m, void *v, loff_t *pos) in map_seq_next() argument
218 struct bpf_map *map = seq_file_to_map(m); in map_seq_next()
219 void *key = map_iter(m)->key; in map_seq_next()
223 if (map_iter(m)->done) in map_seq_next()
232 if (map->ops->map_get_next_key(map, prev_key, key)) { in map_seq_next()
233 map_iter(m)->done = true; in map_seq_next()
240 static void *map_seq_start(struct seq_file *m, loff_t *pos) in map_seq_start() argument
242 if (map_iter(m)->done) in map_seq_start()
245 return *pos ? map_iter(m)->key : SEQ_START_TOKEN; in map_seq_start()
248 static void map_seq_stop(struct seq_file *m, void *v) in map_seq_stop() argument
252 static int map_seq_show(struct seq_file *m, void *v) in map_seq_show() argument
254 struct bpf_map *map = seq_file_to_map(m); in map_seq_show()
255 void *key = map_iter(m)->key; in map_seq_show()
258 seq_puts(m, "# WARNING!! The output is for debug purpose only\n"); in map_seq_show()
259 seq_puts(m, "# WARNING!! The output format will change\n"); in map_seq_show()
261 map->ops->map_seq_show_elem(map, key, m); in map_seq_show()
276 struct bpf_map *map = inode->i_private; in bpffs_map_open()
278 struct seq_file *m; in bpffs_map_open() local
283 return -ENOMEM; in bpffs_map_open()
291 m = file->private_data; in bpffs_map_open()
292 m->private = iter; in bpffs_map_open()
299 struct seq_file *m = file->private_data; in bpffs_map_release() local
301 map_iter_free(map_iter(m)); in bpffs_map_release()
309 * "cat bpffs/pathto/a-pinned-map".
324 return -EIO; in bpffs_obj_open()
331 static int bpf_mkobj_ops(struct dentry *dentry, umode_t mode, void *raw, in bpf_mkobj_ops() argument
335 struct inode *dir = dentry->d_parent->d_inode; in bpf_mkobj_ops()
336 struct inode *inode = bpf_get_inode(dir->i_sb, dir, mode); in bpf_mkobj_ops()
340 inode->i_op = iops; in bpf_mkobj_ops()
341 inode->i_fop = fops; in bpf_mkobj_ops()
342 inode->i_private = raw; in bpf_mkobj_ops()
348 static int bpf_mkprog(struct dentry *dentry, umode_t mode, void *arg) in bpf_mkprog() argument
350 return bpf_mkobj_ops(dentry, mode, arg, &bpf_prog_iops, in bpf_mkprog()
354 static int bpf_mkmap(struct dentry *dentry, umode_t mode, void *arg) in bpf_mkmap() argument
358 return bpf_mkobj_ops(dentry, mode, arg, &bpf_map_iops, in bpf_mkmap()
363 static int bpf_mklink(struct dentry *dentry, umode_t mode, void *arg) in bpf_mklink() argument
367 return bpf_mkobj_ops(dentry, mode, arg, &bpf_link_iops, in bpf_mklink()
378 if ((dir->i_mode & S_IALLUGO) && in bpf_lookup()
379 strchr(dentry->d_name.name, '.')) in bpf_lookup()
380 return ERR_PTR(-EPERM); in bpf_lookup()
392 return -ENOMEM; in bpf_symlink()
394 inode = bpf_get_inode(dir->i_sb, dir, S_IRWXUGO | S_IFLNK); in bpf_symlink()
400 inode->i_op = &simple_symlink_inode_operations; in bpf_symlink()
401 inode->i_link = link; in bpf_symlink()
421 umode_t mode = S_IFREG | S_IRUSR; in bpf_iter_link_pin_kernel() local
425 inode_lock(parent->d_inode); in bpf_iter_link_pin_kernel()
428 inode_unlock(parent->d_inode); in bpf_iter_link_pin_kernel()
431 ret = bpf_mkobj_ops(dentry, mode, link, &bpf_link_iops, in bpf_iter_link_pin_kernel()
434 inode_unlock(parent->d_inode); in bpf_iter_link_pin_kernel()
444 umode_t mode; in bpf_obj_do_pin() local
451 mode = S_IFREG | ((S_IRUSR | S_IWUSR) & ~current_umask()); in bpf_obj_do_pin()
453 ret = security_path_mknod(&path, dentry, mode, 0); in bpf_obj_do_pin()
458 if (dir->i_op != &bpf_dir_iops) { in bpf_obj_do_pin()
459 ret = -EPERM; in bpf_obj_do_pin()
465 ret = vfs_mkobj(dentry, mode, bpf_mkprog, raw); in bpf_obj_do_pin()
468 ret = vfs_mkobj(dentry, mode, bpf_mkmap, raw); in bpf_obj_do_pin()
471 ret = vfs_mkobj(dentry, mode, bpf_mklink, raw); in bpf_obj_do_pin()
474 ret = -EPERM; in bpf_obj_do_pin()
519 raw = bpf_any_get(inode->i_private, *type); in bpf_obj_do_get()
550 ret = (f_flags != O_RDWR) ? -EINVAL : bpf_link_new_fd(raw); in bpf_obj_get_user()
552 return -ENOENT; in bpf_obj_get_user()
566 if (inode->i_op == &bpf_map_iops) in __get_prog_inode()
567 return ERR_PTR(-EINVAL); in __get_prog_inode()
568 if (inode->i_op == &bpf_link_iops) in __get_prog_inode()
569 return ERR_PTR(-EINVAL); in __get_prog_inode()
570 if (inode->i_op != &bpf_prog_iops) in __get_prog_inode()
571 return ERR_PTR(-EACCES); in __get_prog_inode()
573 prog = inode->i_private; in __get_prog_inode()
580 return ERR_PTR(-EINVAL); in __get_prog_inode()
604 static int bpf_show_options(struct seq_file *m, struct dentry *root) in bpf_show_options() argument
606 umode_t mode = d_inode(root)->i_mode & S_IALLUGO & ~S_ISVTX; in bpf_show_options() local
608 if (mode != S_IRWXUGO) in bpf_show_options()
609 seq_printf(m, ",mode=%o", mode); in bpf_show_options()
617 if (S_ISLNK(inode->i_mode)) in bpf_free_inode()
618 kfree(inode->i_link); in bpf_free_inode()
620 bpf_any_put(inode->i_private, type); in bpf_free_inode()
636 fsparam_u32oct ("mode", OPT_MODE),
641 umode_t mode; member
646 struct bpf_mount_opts *opts = fc->fs_private; in bpf_parse_param()
654 * better continue to ignore non-existing options for bpf. in bpf_parse_param()
656 if (opt == -ENOPARAM) { in bpf_parse_param()
658 if (opt != -ENOPARAM) in bpf_parse_param()
670 opts->mode = result.uint_32 & S_IALLUGO; in bpf_parse_param()
694 if (!try_module_get(bpf_preload_ops->owner)) { in bpf_preload_mod_get()
705 module_put(bpf_preload_ops->owner); in bpf_preload_mod_put()
724 err = bpf_preload_ops->preload(objs); in populate_bpffs()
746 struct bpf_mount_opts *opts = fc->fs_private; in bpf_fill_super()
754 sb->s_op = &bpf_super_ops; in bpf_fill_super()
756 inode = sb->s_root->d_inode; in bpf_fill_super()
757 inode->i_op = &bpf_dir_iops; in bpf_fill_super()
758 inode->i_mode &= ~S_IALLUGO; in bpf_fill_super()
759 populate_bpffs(sb->s_root); in bpf_fill_super()
760 inode->i_mode |= S_ISVTX | opts->mode; in bpf_fill_super()
771 kfree(fc->fs_private); in bpf_free_fc()
789 return -ENOMEM; in bpf_init_fs_context()
791 opts->mode = S_IRWXUGO; in bpf_init_fs_context()
793 fc->fs_private = opts; in bpf_init_fs_context()
794 fc->ops = &bpf_context_ops; in bpf_init_fs_context()