From 4b403fb00ae3a4a81c6fa4336b57cd80f13725ba Mon Sep 17 00:00:00 2001 From: c4llv07e Date: Wed, 7 May 2025 00:29:04 +0300 Subject: Made inode operations for directory --- etcfs.c | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/etcfs.c b/etcfs.c index 4440e05..a4276ca 100644 --- a/etcfs.c +++ b/etcfs.c @@ -13,7 +13,30 @@ static const struct super_operations etcfs_ops = { }; #endif -static int etcfs_fill_super(struct super_block *sb, strcut fc_context *fc) { +static struct dentry *etcfs_lookup(struct inode *dir, struct dentry *dentry, + unsigned int flags) { + return dentry->d_parent; +} + +static const struct inode_operations etcfs_dir_inode_operations = { + .lookup = etcfs_lookup, +}; + +static int etcfs_readdir(struct file *file, struct dir_context *ctx) { + if (!dir_emit_dots(file, ctx)) + return 0; + if (!dir_emit(ctx, "a", 1, 2, 0)) + return 0; + return 0; +} + +static struct file_operations etcfs_dir_file_ops = { + .llseek = generic_file_llseek, + .read = generic_read_dir, + .iterate_shared = etcfs_readdir, +}; + +static int etcfs_fill_super(struct super_block *sb, struct fs_context *fs) { struct inode *inode; sb->s_maxbytes = MAX_LFS_FILESIZE; sb->s_blocksize = PAGE_SIZE; @@ -35,6 +58,10 @@ static int etcfs_fill_super(struct super_block *sb, strcut fc_context *fc) { */ simple_inode_init_ts(inode); + /* inode->i_op = &simple_dir_inode_operations; */ + inode->i_op = &etcfs_dir_inode_operations; + inode->i_fop = &etcfs_dir_file_ops; + sb->s_root = d_make_root(inode); if (!sb->s_root) return -ENOMEM; @@ -57,6 +84,7 @@ static int etcfs_init_fs_context(struct fs_context *fc) { } static struct file_system_type etcfs_fs_type = { + .owner = THIS_MODULE, .name = "etcfs", .fs_flags = FS_USERNS_MOUNT, .init_fs_context = etcfs_init_fs_context, -- cgit v1.2.3