Commit 3e26a423e78c1bb1ebd29c49d4ae4ccbbacd861b

Authored by Rolf Eike Beer
Committed by Linus Torvalds
1 parent 416bc51292

[PATCH] Return better error codes if drivers/char/raw.c module init fails

Currently this module just returns 1 if anything on module init fails. Store
the error code of the different function calls and return their error on
problems.

Signed-off-by: Rolf Eike Beer <eike-kernel@sf-tec.de>
Cc: Greg KH <greg@kroah.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
[ Fixed to not unregister twice on error ]
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

Showing 1 changed file with 11 additions and 8 deletions Side-by-side Diff

... ... @@ -288,31 +288,34 @@
288 288 static int __init raw_init(void)
289 289 {
290 290 dev_t dev = MKDEV(RAW_MAJOR, 0);
  291 + int ret;
291 292  
292   - if (register_chrdev_region(dev, MAX_RAW_MINORS, "raw"))
  293 + ret = register_chrdev_region(dev, MAX_RAW_MINORS, "raw");
  294 + if (ret)
293 295 goto error;
294 296  
295 297 cdev_init(&raw_cdev, &raw_fops);
296   - if (cdev_add(&raw_cdev, dev, MAX_RAW_MINORS)) {
  298 + ret = cdev_add(&raw_cdev, dev, MAX_RAW_MINORS);
  299 + if (ret) {
297 300 kobject_put(&raw_cdev.kobj);
298   - unregister_chrdev_region(dev, MAX_RAW_MINORS);
299   - goto error;
  301 + goto error_region;
300 302 }
301 303  
302 304 raw_class = class_create(THIS_MODULE, "raw");
303 305 if (IS_ERR(raw_class)) {
304 306 printk(KERN_ERR "Error creating raw class.\n");
305 307 cdev_del(&raw_cdev);
306   - unregister_chrdev_region(dev, MAX_RAW_MINORS);
307   - goto error;
  308 + ret = PTR_ERR(raw_class);
  309 + goto error_region;
308 310 }
309 311 class_device_create(raw_class, NULL, MKDEV(RAW_MAJOR, 0), NULL, "rawctl");
310 312  
311 313 return 0;
312 314  
  315 +error_region:
  316 + unregister_chrdev_region(dev, MAX_RAW_MINORS);
313 317 error:
314   - printk(KERN_ERR "error register raw device\n");
315   - return 1;
  318 + return ret;
316 319 }
317 320  
318 321 static void __exit raw_exit(void)