Re: [PATCH master v2] base: driver: fix double removal of child devices

2021-10-02 Thread Sascha Hauer
On Mon, Sep 13, 2021 at 12:17:53PM +0200, Ahmad Fatoum wrote:
> Child devices like an ext4 file system on a partition may be removed
> twice: Once because they're in the active devices list and then once
> more, because unregister_device is called for the children of its parent.
> 
> As struct bus_type::remove clears association of a driver with its
> device, we can set struct device_d::driver to NULL. unregister_device
> will then skip the second dev->bus->remove.
> 
> Fixes: 29f1c211d86c ("fs: don't free device in remove callback")
> Signed-off-by: Ahmad Fatoum 
> ---
> v1 -> v2:
>   - remove left-over if condition line (Jules)
> ---
>  drivers/base/driver.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)

Applied, thanks

Sascha


-- 
Pengutronix e.K.   | |
Steuerwalder Str. 21   | http://www.pengutronix.de/  |
31137 Hildesheim, Germany  | Phone: +49-5121-206917-0|
Amtsgericht Hildesheim, HRA 2686   | Fax:   +49-5121-206917- |

___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox


[PATCH master v2] base: driver: fix double removal of child devices

2021-09-13 Thread Ahmad Fatoum
Child devices like an ext4 file system on a partition may be removed
twice: Once because they're in the active devices list and then once
more, because unregister_device is called for the children of its parent.

As struct bus_type::remove clears association of a driver with its
device, we can set struct device_d::driver to NULL. unregister_device
will then skip the second dev->bus->remove.

Fixes: 29f1c211d86c ("fs: don't free device in remove callback")
Signed-off-by: Ahmad Fatoum 
---
v1 -> v2:
  - remove left-over if condition line (Jules)
---
 drivers/base/driver.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/base/driver.c b/drivers/base/driver.c
index 0e04ef36868d..23d11d4dad60 100644
--- a/drivers/base/driver.c
+++ b/drivers/base/driver.c
@@ -511,8 +511,10 @@ static void devices_shutdown(void)
struct device_d *dev;
 
list_for_each_entry(dev, , active) {
-   if (dev->bus->remove)
+   if (dev->bus->remove) {
dev->bus->remove(dev);
+   dev->driver = NULL;
+   }
}
 }
 devshutdown_exitcall(devices_shutdown);
-- 
2.33.0


___
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox