Commit 3e26a423e78c1bb1ebd29c49d4ae4ccbbacd861b
Committed by
Linus Torvalds
1 parent
416bc51292
Exists in
master
and in
39 other branches
[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
drivers/char/raw.c
... | ... | @@ -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) |