From: Hongbo Li <lihongbo22@huawei.com> hulk inclusion category: feature bugzilla: https://gitee.com/openeuler/release-management/issues/ID5W1P -------------------------------- Initialize the mfs module. Signed-off-by: Huang Xiaojia <huangxiaojia2@huawei.com> Signed-off-by: Hongbo Li <lihongbo22@huawei.com> --- fs/Kconfig | 1 + fs/Makefile | 1 + fs/mfs/Kconfig | 12 +++++++ fs/mfs/Makefile | 4 +++ fs/mfs/internal.h | 25 +++++++++++++ fs/mfs/super.c | 91 +++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 134 insertions(+) create mode 100644 fs/mfs/Kconfig create mode 100644 fs/mfs/Makefile create mode 100644 fs/mfs/internal.h create mode 100644 fs/mfs/super.c diff --git a/fs/Kconfig b/fs/Kconfig index 92bcdc29e6a8..6657ada03d06 100644 --- a/fs/Kconfig +++ b/fs/Kconfig @@ -370,6 +370,7 @@ source "fs/sysv/Kconfig" source "fs/ufs/Kconfig" source "fs/erofs/Kconfig" source "fs/vboxsf/Kconfig" +source "fs/mfs/Kconfig" endif # MISC_FILESYSTEMS diff --git a/fs/Makefile b/fs/Makefile index 81428bad22f0..fa1e3d067839 100644 --- a/fs/Makefile +++ b/fs/Makefile @@ -136,3 +136,4 @@ obj-$(CONFIG_EROFS_FS) += erofs/ obj-$(CONFIG_VBOXSF_FS) += vboxsf/ obj-$(CONFIG_ZONEFS_FS) += zonefs/ obj-$(CONFIG_RESCTRL_FS) += resctrl/ +obj-$(CONFIG_MFS_FS) += mfs/ \ No newline at end of file diff --git a/fs/mfs/Kconfig b/fs/mfs/Kconfig new file mode 100644 index 000000000000..26c336a3056e --- /dev/null +++ b/fs/mfs/Kconfig @@ -0,0 +1,12 @@ +# SPDX-License-Identifier: GPL-2.0-only + +config MFS_FS + tristate "MFS filesystem support" + help + MFS provides a cache-programmable ability for users. + It is a stackable file system, and will post miss events + during reading data which is not in cache (memory or disk). + Based on these events, users can trigger the target io for each + application. + + If unsure, say N. diff --git a/fs/mfs/Makefile b/fs/mfs/Makefile new file mode 100644 index 000000000000..ff2cd4a514cc --- /dev/null +++ b/fs/mfs/Makefile @@ -0,0 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0-only + +obj-$(CONFIG_MFS_FS) += mfs.o +mfs-objs := super.o diff --git a/fs/mfs/internal.h b/fs/mfs/internal.h new file mode 100644 index 000000000000..70969cd1c124 --- /dev/null +++ b/fs/mfs/internal.h @@ -0,0 +1,25 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* Copyright (C) 2025. Huawei Technologies Co., Ltd */ + +#ifndef _MFS_INTERNAL_H +#define _MFS_INTERNAL_H + +#include <linux/fs.h> +#include <linux/spinlock_types.h> + +#define MFS_NAME "mfs" + +struct mfs_inode { + struct inode *lower; + struct inode *cache; + struct mutex lock; + struct inode vfs_inode; +}; + +struct mfs_dentry_info { + spinlock_t lock; + struct path lower; + struct path cache; +}; + +#endif diff --git a/fs/mfs/super.c b/fs/mfs/super.c new file mode 100644 index 000000000000..607b47cdc31b --- /dev/null +++ b/fs/mfs/super.c @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* Copyright (C) 2025. Huawei Technologies Co., Ltd */ + +#include "internal.h" + +#include <linux/module.h> +#include <linux/fs_context.h> + +/* + * Used for alloc_inode + */ +static struct kmem_cache *mfs_inode_cachep; + +/* + * Used for dentry info + */ +static struct kmem_cache *mfs_dentry_cachep; + +static void mfs_init_once(void *obj) +{ + struct mfs_inode *i = obj; + + inode_init_once(&i->vfs_inode); +} + +static int mfs_init_fs_context(struct fs_context *fc) +{ + return 0; +} + +static void mfs_kill_sb(struct super_block *sb) +{ +} + +static struct file_system_type mfs_fs_type = { + .owner = THIS_MODULE, + .name = MFS_NAME, + .init_fs_context = mfs_init_fs_context, + .kill_sb = mfs_kill_sb, + .fs_flags = 0, +}; +MODULE_ALIAS_FS(MFS_NAME); + +static int __init init_mfs_fs(void) +{ + int err; + + mfs_inode_cachep = + kmem_cache_create("mfs_inode", + sizeof(struct mfs_inode), 0, + SLAB_RECLAIM_ACCOUNT, mfs_init_once); + if (!mfs_inode_cachep) + return -ENOMEM; + + mfs_dentry_cachep = + kmem_cache_create("mfs_dentry", + sizeof(struct mfs_dentry_info), 0, + SLAB_RECLAIM_ACCOUNT, NULL); + if (!mfs_dentry_cachep) { + err = -ENOMEM; + goto err_dentryp; + } + + err = register_filesystem(&mfs_fs_type); + if (err) + goto err_register; + + pr_info("MFS module loaded\n"); + return 0; +err_register: + kmem_cache_destroy(mfs_dentry_cachep); +err_dentryp: + kmem_cache_destroy(mfs_inode_cachep); + return err; +} + +static void __exit exit_mfs_fs(void) +{ + unregister_filesystem(&mfs_fs_type); + kmem_cache_destroy(mfs_dentry_cachep); + kmem_cache_destroy(mfs_inode_cachep); + pr_info("MFS module unload\n"); +} + +module_init(init_mfs_fs); +module_exit(exit_mfs_fs); + +MODULE_AUTHOR("Hongbo Li <lihongbo22@huawei.com>"); +MODULE_AUTHOR("Xiaojia Huang <huangxiaojia2@huawei.com>"); +MODULE_DESCRIPTION("MFS filesystem for Linux"); +MODULE_LICENSE("GPL"); -- 2.25.1