From 5c61c12fdb972559c84c7f24f068007106a542b9 Mon Sep 17 00:00:00 2001 From: Yaakov Date: Sun, 11 Aug 2024 17:49:35 +1000 Subject: [PATCH] put back error checking --- scream.c | 51 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 40 insertions(+), 11 deletions(-) diff --git a/scream.c b/scream.c index 2cec2d2..f22b284 100644 --- a/scream.c +++ b/scream.c @@ -23,41 +23,70 @@ static int scream_device_release(struct inode*, struct file*); static ssize_t scream_device_read(struct file*, char*, size_t, loff_t*); static const struct file_operations scream_fops = { - .owner = THIS_MODULE, + .owner = THIS_MODULE, .open = scream_device_open, .read = scream_device_read, .release = scream_device_release, }; -static int __init scream_module_init(void) -{ +static int __init scream_module_init(void) { + + printk(KERN_INFO "[scream] loading...\n"); + int err; dev_t dev; err = alloc_chrdev_region(&dev, 0, 1, DEVICE_NAME); + if (err) { + printk(KERN_ALERT "[scream] Failed to register a major number.\n"); + return err; + } + major_number = MAJOR(dev); scream_class = class_create(CLASS_NAME); + if (IS_ERR(scream_class)) { + unregister_chrdev_region(major_number, 1); + printk(KERN_ALERT "[scream] Failed to register device class\n"); + return PTR_ERR(scream_class); + } + + scream_device = device_create(scream_class, NULL, MKDEV(major_number, 0), NULL, DEVICE_NAME); + if (IS_ERR(scream_device)) { + class_destroy(scream_class); + unregister_chrdev_region(major_number, 1); + printk(KERN_ALERT "[scream] Failed to create the device\n"); + return PTR_ERR(scream_device); + } + + printk(KERN_INFO "[scream] %s/%s device registered.", CLASS_NAME, DEVICE_NAME); cdev_init(&scream_cdev, &scream_fops); - scream_cdev.owner = THIS_MODULE; - - cdev_add(&scream_cdev, MKDEV(major_number, 0), 1); - - device_create(scream_class, NULL, MKDEV(major_number, 0), NULL, DEVICE_NAME); + err = cdev_add(&scream_cdev, MKDEV(major_number, 0), 1); + if (err < 0) { + device_destroy(scream_class, MKDEV(major_number, 0)); + class_destroy(scream_class); + unregister_chrdev_region(major_number, 1); + printk(KERN_ALERT "[scream] Failed to add cdev: %d\n", err); + return err; + } + printk(KERN_INFO "[scream] loaded.\n"); return 0; + } static void __exit scream_module_exit(void) { + printk(KERN_INFO "[scream] exiting...\n"); + + cdev_del(&scream_cdev); device_destroy(scream_class, MKDEV(major_number, 0)); - - class_unregister(scream_class); class_destroy(scream_class); + unregister_chrdev_region(major_number, 1); - unregister_chrdev_region(MKDEV(major_number, 0), MINORMASK); + printk(KERN_INFO "[scream] done.\n"); } static int scream_device_open(struct inode *inode, struct file *file)