diff --git a/kernel_module/anonymous_inode.c b/kernel_module/anonymous_inode.c index 77eb7ef..7fc0740 100644 --- a/kernel_module/anonymous_inode.c +++ b/kernel_module/anonymous_inode.c @@ -24,7 +24,7 @@ which reduces namespace pollution. MODULE_LICENSE("GPL"); -static struct dentry *dir; +static struct dentry *debugfs_file; static ssize_t read(struct file *filp, char __user *buf, size_t len, loff_t *off) { @@ -72,14 +72,13 @@ static const struct file_operations fops_ioctl = { static int myinit(void) { - dir = debugfs_create_dir("lkmc_anonymous_inode", 0); - debugfs_create_file("f", 0, dir, NULL, &fops_ioctl); + debugfs_file = debugfs_create_file("lkmc_anonymous_inode", 0, NULL, NULL, &fops_ioctl); return 0; } static void myexit(void) { - debugfs_remove_recursive(dir); + debugfs_remove(debugfs_file); } module_init(myinit) diff --git a/kernel_module/fops.c b/kernel_module/fops.c index b0dd3bb..3f8d47a 100644 --- a/kernel_module/fops.c +++ b/kernel_module/fops.c @@ -28,7 +28,7 @@ Here we use debugfs. MODULE_LICENSE("GPL"); -static struct dentry *dir; +static struct dentry *debugfs_file; static char data[] = {'a', 'b', 'c', 'd'}; static int open(struct inode *inode, struct file *filp) @@ -143,14 +143,13 @@ static const struct file_operations fops = { static int myinit(void) { - dir = debugfs_create_dir("lkmc_fops", 0); - debugfs_create_file("f", S_IRUSR | S_IWUSR, dir, NULL, &fops); + debugfs_file = debugfs_create_file("lkmc_fops", S_IRUSR | S_IWUSR, NULL, NULL, &fops); return 0; } static void myexit(void) { - debugfs_remove_recursive(dir); + debugfs_remove_recursive(debugfs_file); } module_init(myinit) diff --git a/kernel_module/ioctl.c b/kernel_module/ioctl.c index fe68962..d507111 100644 --- a/kernel_module/ioctl.c +++ b/kernel_module/ioctl.c @@ -28,7 +28,7 @@ Documentation/ioctl/ioctl-number.txt has some info: MODULE_LICENSE("GPL"); -static struct dentry *dir; +static struct dentry *debugfs_file; static long unlocked_ioctl(struct file *filp, unsigned int cmd, unsigned long argp) { @@ -76,17 +76,16 @@ static const struct file_operations fops = { static int myinit(void) { - dir = debugfs_create_dir("lkmc_ioctl", 0); /* ioctl permissions are not automatically restricted by rwx as for read / write, * but we could of course implement that ourselves: * https://stackoverflow.com/questions/29891803/user-permission-check-on-ioctl-command */ - debugfs_create_file("f", 0, dir, NULL, &fops); + debugfs_file = debugfs_create_file("lkmc_ioctl", 0, NULL, NULL, &fops); return 0; } static void myexit(void) { - debugfs_remove_recursive(dir); + debugfs_remove(debugfs_file); } module_init(myinit) diff --git a/kernel_module/poll.c b/kernel_module/poll.c index d582289..8b7b7d7 100644 --- a/kernel_module/poll.c +++ b/kernel_module/poll.c @@ -24,7 +24,7 @@ MODULE_LICENSE("GPL"); static char readbuf[1024]; static size_t readbuflen; -static struct dentry *dir; +static struct dentry *debugfs_file; static struct task_struct *kthread; static wait_queue_head_t waitqueue; @@ -74,8 +74,8 @@ static const struct file_operations fops = { static int myinit(void) { - dir = debugfs_create_dir("lkmc_poll", 0); - debugfs_create_file("f", S_IRUSR | S_IWUSR, dir, NULL, &fops); + debugfs_file = debugfs_create_file( + "lkmc_poll", S_IRUSR | S_IWUSR, NULL, NULL, &fops); init_waitqueue_head(&waitqueue); kthread = kthread_create(kthread_func, NULL, "mykthread"); wake_up_process(kthread); @@ -85,7 +85,7 @@ static int myinit(void) static void myexit(void) { kthread_stop(kthread); - debugfs_remove_recursive(dir); + debugfs_remove(debugfs_file); } module_init(myinit) diff --git a/kernel_module/seq_file_single.c b/kernel_module/seq_file_single.c index 80ba920..cc60ff9 100644 --- a/kernel_module/seq_file_single.c +++ b/kernel_module/seq_file_single.c @@ -44,11 +44,7 @@ static int myinit(void) { debugfs_file = debugfs_create_file( "lkmc_seq_file_single", S_IRUSR, NULL, NULL, &fops); - if (debugfs_file) { - return 0; - } else { - return -EINVAL; - } + return 0; } static void myexit(void) diff --git a/rootfs_overlay/anonymous_inode.sh b/rootfs_overlay/anonymous_inode.sh index e10b237..d8d988b 100755 --- a/rootfs_overlay/anonymous_inode.sh +++ b/rootfs_overlay/anonymous_inode.sh @@ -1,6 +1,5 @@ #!/bin/sh set -e insmod /anonymous_inode.ko -cd /sys/kernel/debug/lkmc_anonymous_inode/ -/anonymous_inode.out f +/anonymous_inode.out /sys/kernel/debug/lkmc_anonymous_inode rmmod anonymous_inode diff --git a/rootfs_overlay/ioctl.sh b/rootfs_overlay/ioctl.sh index ec3acd9..4c48308 100755 --- a/rootfs_overlay/ioctl.sh +++ b/rootfs_overlay/ioctl.sh @@ -1,6 +1,5 @@ #!/bin/sh set -e insmod /ioctl.ko -cd /sys/kernel/debug/lkmc_ioctl/ -/ioctl.out f +/ioctl.out /sys/kernel/debug/lkmc_ioctl rmmod ioctl diff --git a/rootfs_overlay/poll.sh b/rootfs_overlay/poll.sh index 287ebfe..2301972 100755 --- a/rootfs_overlay/poll.sh +++ b/rootfs_overlay/poll.sh @@ -1,3 +1,3 @@ #!/bin/sh insmod /poll.ko -/poll.out /sys/kernel/debug/lkmc_poll/f +/poll.out /sys/kernel/debug/lkmc_poll diff --git a/rootfs_overlay/seq_file.sh b/rootfs_overlay/seq_file.sh index 12be441..f29e506 100755 --- a/rootfs_overlay/seq_file.sh +++ b/rootfs_overlay/seq_file.sh @@ -25,3 +25,5 @@ dd if='lkmc_seq_file' bs=1 count=2 skip=2 status=none dd if='lkmc_seq_file' bs=4 count=1 skip=0 status=none # => 0 # => 1 + +rmmod seq_file diff --git a/rootfs_overlay/seq_file_single.sh b/rootfs_overlay/seq_file_single.sh index 48f4d00..795ef58 100755 --- a/rootfs_overlay/seq_file_single.sh +++ b/rootfs_overlay/seq_file_single.sh @@ -8,3 +8,5 @@ cat 'lkmc_seq_file_single' dd if='lkmc_seq_file_single' bs=1 count=3 skip=1 # => b # => c + +rmmod seq_file_single