On Fri, Jan 3, 2025 at 4:04 AM Koichiro Den <koichiro.den@xxxxxxxxxxxxx> wrote: > > When a virtuser device is created via configfs and the probe fails due > to an incorrect lookup table, the table is not removed. This prevents > subsequent probe attempts from succeeding, even if the issue is > corrected, unless the device is released. Additionally, cleanup is also > needed in the less likely case of platform_device_register_full() > failure. > > Ensure the lookup table is removed whenever the device activation fails. > > Fixes: 91581c4b3f29 ("gpio: virtuser: new virtual testing driver for the GPIO API") > Signed-off-by: Koichiro Den <koichiro.den@xxxxxxxxxxxxx> > --- > drivers/gpio/gpio-virtuser.c | 25 ++++++++++++++++--------- > 1 file changed, 16 insertions(+), 9 deletions(-) > > diff --git a/drivers/gpio/gpio-virtuser.c b/drivers/gpio/gpio-virtuser.c > index 91b6352c957c..ec5abfebca3d 100644 > --- a/drivers/gpio/gpio-virtuser.c > +++ b/drivers/gpio/gpio-virtuser.c > @@ -1487,10 +1487,8 @@ gpio_virtuser_device_activate(struct gpio_virtuser_device *dev) > pdevinfo.fwnode = swnode; > > ret = gpio_virtuser_make_lookup_table(dev); > - if (ret) { > - fwnode_remove_software_node(swnode); > - return ret; > - } > + if (ret) > + goto err_remove_swnode; > > reinit_completion(&dev->probe_completion); > dev->driver_bound = false; > @@ -1498,23 +1496,32 @@ gpio_virtuser_device_activate(struct gpio_virtuser_device *dev) > > pdev = platform_device_register_full(&pdevinfo); > if (IS_ERR(pdev)) { > + ret = PTR_ERR(pdev); > bus_unregister_notifier(&platform_bus_type, &dev->bus_notifier); > - fwnode_remove_software_node(swnode); > - return PTR_ERR(pdev); > + goto err_remove_lookup_table; > } > > wait_for_completion(&dev->probe_completion); > bus_unregister_notifier(&platform_bus_type, &dev->bus_notifier); > > if (!dev->driver_bound) { > - platform_device_unregister(pdev); > - fwnode_remove_software_node(swnode); > - return -ENXIO; > + ret = -ENXIO; > + goto err_unregister_pdev; > } > > dev->pdev = pdev; > > return 0; > + > +err_unregister_pdev: > + platform_device_unregister(pdev); > +err_remove_lookup_table: > + gpiod_remove_lookup_table(dev->lookup_table); > + kfree(dev->lookup_table); Just one more thing: now we open-code this but the actual allocation and adding of the table happens in a dedicated function. Can you package these calls into their own function (gpio_virtuser_remove_lookup_table() maybe?) and use it here and in gpio_virtuser_device_deactivate()? Bart > +err_remove_swnode: > + fwnode_remove_software_node(swnode); > + > + return ret; > } > > static void > -- > 2.43.0 >