The patch titled Correct misc_register return code handling in several drivers has been added to the -mm tree. Its filename is correct-misc_register-return-code-handling-in-several-drivers.patch See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find out what to do about this ------------------------------------------------------ Subject: Correct misc_register return code handling in several drivers From: Neil Horman <nhorman@xxxxxxxxxxxxx> Signed-off-by: Neil Horman <nhorman@xxxxxxxxxxxxx> Cc: Bjorn Helgaas <bjorn.helgaas@xxxxxx> Cc: Kylene Jo Hall <kjhall@xxxxxxxxxx> Cc: Dmitry Torokhov <dtor@xxxxxxx> Cc: Olaf Hering <olh@xxxxxxx> Cc: Benjamin Herrenschmidt <benh@xxxxxxxxxxxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxx> --- drivers/char/misc.c | 2 ++ drivers/char/mmtimer.c | 23 ++++++++++++++++++----- drivers/char/tpm/tpm.c | 1 + drivers/input/misc/hp_sdc_rtc.c | 4 +++- drivers/macintosh/apm_emu.c | 3 ++- 5 files changed, 26 insertions(+), 7 deletions(-) diff -puN drivers/char/misc.c~correct-misc_register-return-code-handling-in-several-drivers drivers/char/misc.c --- a/drivers/char/misc.c~correct-misc_register-return-code-handling-in-several-drivers +++ a/drivers/char/misc.c @@ -199,6 +199,8 @@ int misc_register(struct miscdevice * mi dev_t dev; int err = 0; + INIT_LIST_HEAD(&misc->list); + down(&misc_sem); list_for_each_entry(c, &misc_list, list) { if (c->minor == misc->minor) { diff -puN drivers/char/mmtimer.c~correct-misc_register-return-code-handling-in-several-drivers drivers/char/mmtimer.c --- a/drivers/char/mmtimer.c~correct-misc_register-return-code-handling-in-several-drivers +++ a/drivers/char/mmtimer.c @@ -680,7 +680,7 @@ static int __init mmtimer_init(void) if (sn_rtc_cycles_per_second < 100000) { printk(KERN_ERR "%s: unable to determine clock frequency\n", MMTIMER_NAME); - return -1; + goto out1; } mmtimer_femtoperiod = ((unsigned long)1E15 + sn_rtc_cycles_per_second / @@ -689,13 +689,13 @@ static int __init mmtimer_init(void) if (request_irq(SGI_MMTIMER_VECTOR, mmtimer_interrupt, IRQF_PERCPU, MMTIMER_NAME, NULL)) { printk(KERN_WARNING "%s: unable to allocate interrupt.", MMTIMER_NAME); - return -1; + goto out1; } if (misc_register(&mmtimer_miscdev)) { printk(KERN_ERR "%s: failed to register device\n", MMTIMER_NAME); - return -1; + goto out2; } /* Get max numbered node, calculate slots needed */ @@ -709,16 +709,18 @@ static int __init mmtimer_init(void) if (timers == NULL) { printk(KERN_ERR "%s: failed to allocate memory for device\n", MMTIMER_NAME); - return -1; + goto out3; } + memset(timers,0,(sizeof(mmtimer_t *)*maxn)); + /* Allocate mmtimer_t's for each online node */ for_each_online_node(node) { timers[node] = kmalloc_node(sizeof(mmtimer_t)*NUM_COMPARATORS, GFP_KERNEL, node); if (timers[node] == NULL) { printk(KERN_ERR "%s: failed to allocate memory for device\n", MMTIMER_NAME); - return -1; + goto out4; } for (i=0; i< NUM_COMPARATORS; i++) { mmtimer_t * base = timers[node] + i; @@ -739,6 +741,17 @@ static int __init mmtimer_init(void) sn_rtc_cycles_per_second/(unsigned long)1E6); return 0; + +out4: + for_each_online_node(node) { + kfree(timers[node]); + } +out3: + misc_deregister(&mmtimer_miscdev); +out2: + free_irq(SGI_MMTIMER_VECTOR, NULL); +out1: + return -1; } module_init(mmtimer_init); diff -puN drivers/char/tpm/tpm.c~correct-misc_register-return-code-handling-in-several-drivers drivers/char/tpm/tpm.c --- a/drivers/char/tpm/tpm.c~correct-misc_register-return-code-handling-in-several-drivers +++ a/drivers/char/tpm/tpm.c @@ -1155,6 +1155,7 @@ struct tpm_chip *tpm_register_hardware(s if (sysfs_create_group(&dev->kobj, chip->vendor.attr_group)) { list_del(&chip->list); + misc_deregister(&chip->vendor.miscdev); put_device(dev); clear_bit(chip->dev_num, dev_mask); kfree(chip); diff -puN drivers/input/misc/hp_sdc_rtc.c~correct-misc_register-return-code-handling-in-several-drivers drivers/input/misc/hp_sdc_rtc.c --- a/drivers/input/misc/hp_sdc_rtc.c~correct-misc_register-return-code-handling-in-several-drivers +++ a/drivers/input/misc/hp_sdc_rtc.c @@ -695,7 +695,9 @@ static int __init hp_sdc_rtc_init(void) if ((ret = hp_sdc_request_timer_irq(&hp_sdc_rtc_isr))) return ret; - misc_register(&hp_sdc_rtc_dev); + if (misc_register(&hp_sdc_rtc_dev) != 0) + printk(KERN_INFO "Could not register misc. dev for i8042 rtc\n"); + create_proc_read_entry ("driver/rtc", 0, NULL, hp_sdc_rtc_read_proc, NULL); diff -puN drivers/macintosh/apm_emu.c~correct-misc_register-return-code-handling-in-several-drivers drivers/macintosh/apm_emu.c --- a/drivers/macintosh/apm_emu.c~correct-misc_register-return-code-handling-in-several-drivers +++ a/drivers/macintosh/apm_emu.c @@ -529,7 +529,8 @@ static int __init apm_emu_init(void) if (apm_proc) apm_proc->owner = THIS_MODULE; - misc_register(&apm_device); + if (misc_register(&apm_device) != 0) + printk(KERN_INFO "Could not create misc. device for apm\n"); pmu_register_sleep_notifier(&apm_sleep_notifier); _ Patches currently in -mm which might be from nhorman@xxxxxxxxxxxxx are correct-misc_register-return-code-handling-in-several-drivers.patch - To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html