Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

dtlk: fix error checks in module_init()

This patch fixes two things in module_init.

- fix register_chrdev() error check

Currently dtlk doesn't check register_chrdev() failure correctly.
register_chrdev() returns a errno on failure.

- check probe failure

dtlk ignores probe failure and allows the module loading without
such device. I got "Trying to free nonexistent resource" message
by release_region() when unloading module without device.

[akpm@linux-foundation.org: fix error code return]
Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
Cc: Chris Pallotta <chris@allmedia.com>
Cc: Jim Van Zandt <jrv@vanzandt.mv.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Akinobu Mita and committed by
Linus Torvalds
b2bbe383 19d0e8ce

+10 -4
+10 -4
drivers/char/dtlk.c
··· 324 324 325 325 static int __init dtlk_init(void) 326 326 { 327 + int err; 328 + 327 329 dtlk_port_lpc = 0; 328 330 dtlk_port_tts = 0; 329 331 dtlk_busy = 0; 330 332 dtlk_major = register_chrdev(0, "dtlk", &dtlk_fops); 331 - if (dtlk_major == 0) { 333 + if (dtlk_major < 0) { 332 334 printk(KERN_ERR "DoubleTalk PC - cannot register device\n"); 333 - return 0; 335 + return dtlk_major; 334 336 } 335 - if (dtlk_dev_probe() == 0) 336 - printk(", MAJOR %d\n", dtlk_major); 337 + err = dtlk_dev_probe(); 338 + if (err) { 339 + unregister_chrdev(dtlk_major, "dtlk"); 340 + return err; 341 + } 342 + printk(", MAJOR %d\n", dtlk_major); 337 343 338 344 init_waitqueue_head(&dtlk_process_list); 339 345