summaryrefslogtreecommitdiff
path: root/etcfs.c
diff options
context:
space:
mode:
authorc4llv07e <igor@c4llv07e.xyz>2025-05-06 20:43:06 +0300
committerc4llv07e <igor@c4llv07e.xyz>2025-05-06 20:43:06 +0300
commit16df2ac01e3e8ecac35463678f2471b29422d004 (patch)
tree22a3e07475dd70abfd8cdeaf5878371ab48ab49a /etcfs.c
parenta6e6702727d2fdba6e921db16feb703a859687c8 (diff)
downloadetcfs-16df2ac01e3e8ecac35463678f2471b29422d004.tar.gz
etcfs-16df2ac01e3e8ecac35463678f2471b29422d004.tar.bz2
etcfs-16df2ac01e3e8ecac35463678f2471b29422d004.zip
Some progress
Diffstat (limited to 'etcfs.c')
-rw-r--r--etcfs.c61
1 files changed, 53 insertions, 8 deletions
diff --git a/etcfs.c b/etcfs.c
index 82e7220..4440e05 100644
--- a/etcfs.c
+++ b/etcfs.c
@@ -1,39 +1,84 @@
+#define DEBUG
+#define ETCFS_MAGIC 0x49c643f4 /* random number */
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/fs_context.h>
+#include <linux/dcache.h>
+#include <linux/mnt_idmapping.h>
+
+#if 0
+static const struct super_operations etcfs_ops = {
+
+};
+#endif
+
+static int etcfs_fill_super(struct super_block *sb, strcut fc_context *fc) {
+ struct inode *inode;
+ sb->s_maxbytes = MAX_LFS_FILESIZE;
+ sb->s_blocksize = PAGE_SIZE;
+ sb->s_blocksize_bits = PAGE_SHIFT;
+ sb->s_magic = ETCFS_MAGIC;
+ sb->s_time_gran = 1; /* I have no idea what is's doing */
+
+ inode = new_inode(sb);
+
+ if (!inode)
+ return -ENOMEM;
+
+ inode->i_ino = get_next_ino();
+ inode_init_owner(&nop_mnt_idmap, inode, NULL, S_IFDIR);
+ inode->i_mapping->a_ops = &ram_aops;
+ /*
+ mapping_set_gfp_mask(inode->i_mapping, GFP_HIGHUSER);
+ mapping_set_unevictable(inode->i_mapping);
+ */
+ simple_inode_init_ts(inode);
+
+ sb->s_root = d_make_root(inode);
+ if (!sb->s_root)
+ return -ENOMEM;
+ return 0;
+}
+
+static int etcfs_get_tree(struct fs_context *fc) {
+ pr_debug("Get tree\n");
+ return get_tree_nodev(fc, etcfs_fill_super);
+}
static struct fs_context_operations etcfs_context_ops = {
+ .get_tree = etcfs_get_tree,
};
static int etcfs_init_fs_context(struct fs_context *fc) {
- int err;
+ pr_debug("Etcfs init fs context\n");
fc->ops = &etcfs_context_ops;
return 0;
}
-static struct file_system_type etc_fs_type = {
+static struct file_system_type etcfs_fs_type = {
.name = "etcfs",
- .f_flasgs = FS_USERNS_MOUNT,
+ .fs_flags = FS_USERNS_MOUNT,
.init_fs_context = etcfs_init_fs_context,
};
static int __init etcfs_init(void) {
int err;
- err = register_filesystem(etcfs);
+ err = register_filesystem(&etcfs_fs_type);
if (err) {
return err;
}
return 0;
}
-static int __exit etcfs_exit(void) {
+static void __exit etcfs_exit(void) {
int err;
- err = unregister_filesystem(etcfs);
+ err = unregister_filesystem(&etcfs_fs_type);
if (err) {
- return err;
+ pr_err("Error, can't unregister filesystem: %d\n", err);
+ return;
}
- return 0;
+ return;
}
module_init(etcfs_init);