Staging: ipack/devices/ipoctal: avoid kernel oops when uninstalling
authorSamuel Iglesias Gonsalvez <siglesias@igalia.com>
Fri, 25 May 2012 08:03:03 +0000 (10:03 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 7 Jun 2012 05:20:29 +0000 (14:20 +0900)
When uninstalling a device, there is a loop of calls that produces, at the end,
two calls to __ipoctal_remove() function with the same ipack_device argument.

The first time works fine, but the second will fail in tty_unregister_driver()

To avoid this situation, the call to __ipoctal_remove() it is done only from the
ipack bus driver and not from the ipack device driver.

Signed-off-by: Samuel Iglesias Gonsalvez <siglesias@igalia.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/ipack/devices/ipoctal.c

index 29f6fa8..a6f424e 100644 (file)
@@ -853,11 +853,6 @@ static void __ipoctal_remove(struct ipoctal *ipoctal)
 
        tty_unregister_driver(ipoctal->tty_drv);
        put_tty_driver(ipoctal->tty_drv);
-
-       /* Tell the carrier board to free all the resources for this device */
-       if (ipoctal->dev->bus->ops->remove_device != NULL)
-               ipoctal->dev->bus->ops->remove_device(ipoctal->dev);
-
        list_del(&ipoctal->list);
        kfree(ipoctal);
 }
@@ -889,7 +884,7 @@ static void __exit ipoctal_exit(void)
        struct ipoctal *p, *next;
 
        list_for_each_entry_safe(p, next, &ipoctal_list, list)
-               __ipoctal_remove(p);
+               p->dev->bus->ops->remove_device(p->dev);
 
        ipack_driver_unregister(&driver);
 }