This patch creates a mount point "bpfdump" under /sys/kernel. The file system has a single user mode, i.e., all mount points will be identical. The magic number I picked for the new file system is "dump". Signed-off-by: Yonghong Song <yhs@xxxxxx> --- include/uapi/linux/magic.h | 1 + kernel/bpf/Makefile | 1 + kernel/bpf/dump.c | 79 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+) create mode 100644 kernel/bpf/dump.c diff --git a/include/uapi/linux/magic.h b/include/uapi/linux/magic.h index d78064007b17..4ce3d8882315 100644 --- a/include/uapi/linux/magic.h +++ b/include/uapi/linux/magic.h @@ -88,6 +88,7 @@ #define BPF_FS_MAGIC 0xcafe4a11 #define AAFS_MAGIC 0x5a3c69f0 #define ZONEFS_MAGIC 0x5a4f4653 +#define DUMPFS_MAGIC 0x64756d70 /* Since UDF 2.01 is ISO 13346 based... */ #define UDF_SUPER_MAGIC 0x15013346 diff --git a/kernel/bpf/Makefile b/kernel/bpf/Makefile index f2d7be596966..4a1376ab2bea 100644 --- a/kernel/bpf/Makefile +++ b/kernel/bpf/Makefile @@ -26,6 +26,7 @@ obj-$(CONFIG_BPF_SYSCALL) += reuseport_array.o endif ifeq ($(CONFIG_SYSFS),y) obj-$(CONFIG_DEBUG_INFO_BTF) += sysfs_btf.o +obj-$(CONFIG_BPF_SYSCALL) += dump.o endif ifeq ($(CONFIG_BPF_JIT),y) obj-$(CONFIG_BPF_SYSCALL) += bpf_struct_ops.o diff --git a/kernel/bpf/dump.c b/kernel/bpf/dump.c new file mode 100644 index 000000000000..e0c33486e0e7 --- /dev/null +++ b/kernel/bpf/dump.c @@ -0,0 +1,79 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* Copyright (c) 2020 Facebook */ + +#include <linux/init.h> +#include <linux/magic.h> +#include <linux/mount.h> +#include <linux/anon_inodes.h> +#include <linux/namei.h> +#include <linux/fs.h> +#include <linux/fs_context.h> +#include <linux/fs_parser.h> +#include <linux/filter.h> +#include <linux/bpf.h> + +static void bpfdump_free_inode(struct inode *inode) +{ + kfree(inode->i_private); + free_inode_nonrcu(inode); +} + +static const struct super_operations bpfdump_super_operations = { + .statfs = simple_statfs, + .free_inode = bpfdump_free_inode, +}; + +static int bpfdump_fill_super(struct super_block *sb, struct fs_context *fc) +{ + static const struct tree_descr files[] = { { "" } }; + int err; + + err = simple_fill_super(sb, DUMPFS_MAGIC, files); + if (err) + return err; + + sb->s_op = &bpfdump_super_operations; + return 0; +} + +static int bpfdump_get_tree(struct fs_context *fc) +{ + return get_tree_single(fc, bpfdump_fill_super); +} + +static const struct fs_context_operations bpfdump_context_ops = { + .get_tree = bpfdump_get_tree, +}; + +static int bpfdump_init_fs_context(struct fs_context *fc) +{ + fc->ops = &bpfdump_context_ops; + return 0; +} + +static struct file_system_type fs_type = { + .owner = THIS_MODULE, + .name = "bpfdump", + .init_fs_context = bpfdump_init_fs_context, + .kill_sb = kill_litter_super, +}; + +static int __init bpfdump_init(void) +{ + int ret; + + ret = sysfs_create_mount_point(kernel_kobj, "bpfdump"); + if (ret) + return ret; + + ret = register_filesystem(&fs_type); + if (ret) + goto remove_mount; + + return 0; + +remove_mount: + sysfs_remove_mount_point(kernel_kobj, "bpfdump"); + return ret; +} +core_initcall(bpfdump_init); -- 2.24.1