--- a/drivers/char/ppdev.c 2016-12-11 12:17:54.000000000 -0700 +++ b/drivers/char/ppdev.c 2017-03-28 10:44:07.033783941 -0600 @@ -84,8 +84,11 @@ struct ieee1284_info state; struct ieee1284_info saved_state; long default_inactivity; + int index; }; + static DEFINE_IDA(ida_index); + /* pp_struct.flags bitfields */ #define PP_CLAIMED (1<<0) #define PP_EXCL (1<<1) @@ -287,6 +290,7 @@ struct pardevice *pdev = NULL; char *name; struct pardev_cb ppdev_cb; + int index; name = kasprintf(GFP_KERNEL, CHRDEV "%x", minor); if (name == NULL) @@ -299,20 +303,23 @@ return -ENXIO; } + index = ida_simple_get(&ida_index, 0, 0, GFP_KERNEL); memset(&ppdev_cb, 0, sizeof(ppdev_cb)); ppdev_cb.irq_func = pp_irq; ppdev_cb.flags = (pp->flags & PP_EXCL) ? PARPORT_FLAG_EXCL : 0; ppdev_cb.private = pp; - pdev = parport_register_dev_model(port, name, &ppdev_cb, minor); + pdev = parport_register_dev_model(port, name, &ppdev_cb, index); parport_put_port(port); if (!pdev) { printk(KERN_WARNING "%s: failed to register device!\n", name); kfree(name); + ida_simple_remove(&ida_index, index); return -ENXIO; } pp->pdev = pdev; + pp->index = index; dev_dbg(&pdev->dev, "registered pardevice\n"); return 0; } @@ -749,6 +756,7 @@ if (pp->pdev) { parport_unregister_device(pp->pdev); + ida_simple_remove(&ida_index, pp->index); pp->pdev = NULL; pr_debug(CHRDEV "%x: unregistered pardevice\n", minor); }