efs: convert efs to use the new mount api
Convert the efs filesystem to use the new mount API. Signed-off-by: Bill O'Donnell <bodonnel@redhat.com> Link: https://lore.kernel.org/r/20240220003318.166143-1-bodonnel@redhat.com Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
parent
ddb9fd7a54
commit
39a6c668e4
1 changed files with 84 additions and 30 deletions
106
fs/efs/super.c
106
fs/efs/super.c
|
@ -14,19 +14,14 @@
|
||||||
#include <linux/buffer_head.h>
|
#include <linux/buffer_head.h>
|
||||||
#include <linux/vfs.h>
|
#include <linux/vfs.h>
|
||||||
#include <linux/blkdev.h>
|
#include <linux/blkdev.h>
|
||||||
|
#include <linux/fs_context.h>
|
||||||
|
#include <linux/fs_parser.h>
|
||||||
#include "efs.h"
|
#include "efs.h"
|
||||||
#include <linux/efs_vh.h>
|
#include <linux/efs_vh.h>
|
||||||
#include <linux/efs_fs_sb.h>
|
#include <linux/efs_fs_sb.h>
|
||||||
|
|
||||||
static int efs_statfs(struct dentry *dentry, struct kstatfs *buf);
|
static int efs_statfs(struct dentry *dentry, struct kstatfs *buf);
|
||||||
static int efs_fill_super(struct super_block *s, void *d, int silent);
|
static int efs_init_fs_context(struct fs_context *fc);
|
||||||
|
|
||||||
static struct dentry *efs_mount(struct file_system_type *fs_type,
|
|
||||||
int flags, const char *dev_name, void *data)
|
|
||||||
{
|
|
||||||
return mount_bdev(fs_type, flags, dev_name, data, efs_fill_super);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void efs_kill_sb(struct super_block *s)
|
static void efs_kill_sb(struct super_block *s)
|
||||||
{
|
{
|
||||||
|
@ -35,15 +30,6 @@ static void efs_kill_sb(struct super_block *s)
|
||||||
kfree(sbi);
|
kfree(sbi);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct file_system_type efs_fs_type = {
|
|
||||||
.owner = THIS_MODULE,
|
|
||||||
.name = "efs",
|
|
||||||
.mount = efs_mount,
|
|
||||||
.kill_sb = efs_kill_sb,
|
|
||||||
.fs_flags = FS_REQUIRES_DEV,
|
|
||||||
};
|
|
||||||
MODULE_ALIAS_FS("efs");
|
|
||||||
|
|
||||||
static struct pt_types sgi_pt_types[] = {
|
static struct pt_types sgi_pt_types[] = {
|
||||||
{0x00, "SGI vh"},
|
{0x00, "SGI vh"},
|
||||||
{0x01, "SGI trkrepl"},
|
{0x01, "SGI trkrepl"},
|
||||||
|
@ -63,6 +49,27 @@ static struct pt_types sgi_pt_types[] = {
|
||||||
{0, NULL}
|
{0, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
Opt_explicit_open,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct fs_parameter_spec efs_param_spec[] = {
|
||||||
|
fsparam_flag ("explicit-open", Opt_explicit_open),
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* File system definition and registration.
|
||||||
|
*/
|
||||||
|
static struct file_system_type efs_fs_type = {
|
||||||
|
.owner = THIS_MODULE,
|
||||||
|
.name = "efs",
|
||||||
|
.kill_sb = efs_kill_sb,
|
||||||
|
.fs_flags = FS_REQUIRES_DEV,
|
||||||
|
.init_fs_context = efs_init_fs_context,
|
||||||
|
.parameters = efs_param_spec,
|
||||||
|
};
|
||||||
|
MODULE_ALIAS_FS("efs");
|
||||||
|
|
||||||
static struct kmem_cache * efs_inode_cachep;
|
static struct kmem_cache * efs_inode_cachep;
|
||||||
|
|
||||||
|
@ -108,18 +115,10 @@ static void destroy_inodecache(void)
|
||||||
kmem_cache_destroy(efs_inode_cachep);
|
kmem_cache_destroy(efs_inode_cachep);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int efs_remount(struct super_block *sb, int *flags, char *data)
|
|
||||||
{
|
|
||||||
sync_filesystem(sb);
|
|
||||||
*flags |= SB_RDONLY;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct super_operations efs_superblock_operations = {
|
static const struct super_operations efs_superblock_operations = {
|
||||||
.alloc_inode = efs_alloc_inode,
|
.alloc_inode = efs_alloc_inode,
|
||||||
.free_inode = efs_free_inode,
|
.free_inode = efs_free_inode,
|
||||||
.statfs = efs_statfs,
|
.statfs = efs_statfs,
|
||||||
.remount_fs = efs_remount,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct export_operations efs_export_ops = {
|
static const struct export_operations efs_export_ops = {
|
||||||
|
@ -249,7 +248,7 @@ static int efs_validate_super(struct efs_sb_info *sb, struct efs_super *super) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int efs_fill_super(struct super_block *s, void *d, int silent)
|
static int efs_fill_super(struct super_block *s, struct fs_context *fc)
|
||||||
{
|
{
|
||||||
struct efs_sb_info *sb;
|
struct efs_sb_info *sb;
|
||||||
struct buffer_head *bh;
|
struct buffer_head *bh;
|
||||||
|
@ -328,6 +327,61 @@ static int efs_fill_super(struct super_block *s, void *d, int silent)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void efs_free_fc(struct fs_context *fc)
|
||||||
|
{
|
||||||
|
kfree(fc->fs_private);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int efs_get_tree(struct fs_context *fc)
|
||||||
|
{
|
||||||
|
return get_tree_bdev(fc, efs_fill_super);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int efs_parse_param(struct fs_context *fc, struct fs_parameter *param)
|
||||||
|
{
|
||||||
|
int token;
|
||||||
|
struct fs_parse_result result;
|
||||||
|
|
||||||
|
token = fs_parse(fc, efs_param_spec, param, &result);
|
||||||
|
if (token < 0)
|
||||||
|
return token;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int efs_reconfigure(struct fs_context *fc)
|
||||||
|
{
|
||||||
|
sync_filesystem(fc->root->d_sb);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct efs_context {
|
||||||
|
unsigned long s_mount_opts;
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct fs_context_operations efs_context_opts = {
|
||||||
|
.parse_param = efs_parse_param,
|
||||||
|
.get_tree = efs_get_tree,
|
||||||
|
.reconfigure = efs_reconfigure,
|
||||||
|
.free = efs_free_fc,
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set up the filesystem mount context.
|
||||||
|
*/
|
||||||
|
static int efs_init_fs_context(struct fs_context *fc)
|
||||||
|
{
|
||||||
|
struct efs_context *ctx;
|
||||||
|
|
||||||
|
ctx = kzalloc(sizeof(struct efs_context), GFP_KERNEL);
|
||||||
|
if (!ctx)
|
||||||
|
return -ENOMEM;
|
||||||
|
fc->fs_private = ctx;
|
||||||
|
fc->ops = &efs_context_opts;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int efs_statfs(struct dentry *dentry, struct kstatfs *buf) {
|
static int efs_statfs(struct dentry *dentry, struct kstatfs *buf) {
|
||||||
struct super_block *sb = dentry->d_sb;
|
struct super_block *sb = dentry->d_sb;
|
||||||
struct efs_sb_info *sbi = SUPER_INFO(sb);
|
struct efs_sb_info *sbi = SUPER_INFO(sb);
|
||||||
|
|
Loading…
Add table
Reference in a new issue