From 794f72d7219df40ff61f939059a39b03d0665ee7 Mon Sep 17 00:00:00 2001 From: nganhkhoa Date: Tue, 29 Oct 2024 10:31:47 +0000 Subject: [PATCH] working list dir --- Makefile | 5 ++++- voidfs.c | 50 +++++++++++++++++++++++++++++++++----------------- 2 files changed, 37 insertions(+), 18 deletions(-) diff --git a/Makefile b/Makefile index 9e71f15..99915c0 100644 --- a/Makefile +++ b/Makefile @@ -3,4 +3,7 @@ obj-m += voidfs.o all: voidfs voidfs: - make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules + make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules + +clean: + make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) clean diff --git a/voidfs.c b/voidfs.c index 05981d8..8dc5748 100644 --- a/voidfs.c +++ b/voidfs.c @@ -17,6 +17,10 @@ static int voidfs_fill_super(struct super_block *sb, void *data, int silent); void voidfs_kill_superblock(struct super_block *sb); +struct dentry *voidfs_lookup(struct inode *dir, struct dentry *dentry, unsigned int); +int voidfs_readdir(struct file *fp, struct dir_context *ctx); + +ssize_t voidfs_open(struct file *fp, char __user *buf, size_t len, loff_t *ppos); ssize_t voidfs_read(struct file *fp, char __user *buf, size_t len, loff_t *ppos); ssize_t voidfs_write(struct file *fp, const char __user *buf, size_t len, loff_t *ppos); @@ -30,19 +34,29 @@ struct file_system_type voidfs_fs_type = { struct super_operations voidfs_super_ops = { // null for now -} +}; -struct super_operations voidfs_inode_ops = { - // null for now -} +struct inode_operations voidfs_inode_ops = { + .lookup = voidfs_lookup, +}; struct file_operations voidfs_dir_ops = { .iterate_shared = voidfs_readdir, -} +}; struct file_operations voidfs_file_ops = { + .open = voidfs_open, .read = voidfs_read, .write = voidfs_write, +}; + +struct dentry *voidfs_lookup(struct inode *dir, struct dentry *dentry, unsigned int) { + struct inode* inode = NULL; + + printk(KERN_INFO "listing directory uwu %s", dentry->d_name.name); + + d_add(dentry, inode); + return NULL; } int voidfs_readdir(struct file *fp, struct dir_context *ctx) { @@ -52,7 +66,7 @@ int voidfs_readdir(struct file *fp, struct dir_context *ctx) { printk(KERN_INFO "readdir"); - inode = file_inode(file); + inode = file_inode(fp); sb = inode->i_sb; // if (inode && @@ -67,7 +81,7 @@ ssize_t voidfs_read(struct file *fp, char __user *buf, size_t len, loff_t *ppos) struct inode *inode; struct super_block *sb; - inode = file_inode(file); + inode = file_inode(fp); if (!inode) { return -EFAULT; } @@ -83,14 +97,15 @@ ssize_t voidfs_read(struct file *fp, char __user *buf, size_t len, loff_t *ppos) // get as much as we can if (copy_to_user(buf, buffer, nbytes)) { - brelse(bh); printk(KERN_ERR "Error copying file content to userspace buffer\n"); return -EFAULT; } + return 0; } ssize_t voidfs_write(struct file *fp, const char __user *buf, size_t len, loff_t *ppos) { + return 0; } struct dentry *voidfs_mount(struct file_system_type *fs_type, int flags, const char *dev_name, void *data) { @@ -127,21 +142,22 @@ static int voidfs_fill_super(struct super_block *sb, void *data, int silent) { if (!root_inode) { return -ENOMEM; } - inode_init_owner(root_inode, NULL, root_inode->i_mode); + root_inode->i_mode = S_IFDIR | 0644; + inode_init_owner(&nop_mnt_idmap, root_inode, NULL, root_inode->i_mode); root_inode->i_sb = sb; root_inode->i_op = &voidfs_inode_ops; - root_inode->i_atime = root_inode->i_mtime - = root_inode->i_ctime - = CURRENT_TIME; - root_inode->i_fop = &voidfs_dir_ops; - // create a dummy file entry point - root_inode->i_fop = &voidfs_file_ops; - sb->s_root = d_make_root(root_inode); + // create a dummy file entry point + // root_inode->i_fop = &voidfs_file_ops; + + + // create a child file + + return 0; } @@ -190,5 +206,5 @@ static void __exit voidfs_exit(void) module_init(voidfs_init); module_exit(voidfs_exit); -MODULE_LICENSE("MIT"); +MODULE_LICENSE("GPL"); MODULE_AUTHOR("nganhkhoa");