From 59fb29c6b0cdc0d4e1281259033fabc958669466 Mon Sep 17 00:00:00 2001 From: Patrick Mochel Date: Wed, 5 Jun 2002 19:50:30 -0700 Subject: [PATCH] device detach locking, one more time: get driver and reset it in struct device before calling remove() --- drivers/base/core.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/drivers/base/core.c b/drivers/base/core.c index b1d4e5480ae1..9d04145d5ac2 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c @@ -98,19 +98,22 @@ static int device_attach(struct device * dev) static void device_detach(struct device * dev) { - if (dev->driver) { - write_lock(&dev->driver->lock); - list_del_init(&dev->driver_list); - write_unlock(&dev->driver->lock); - - /* detach from driver */ - if (dev->driver->remove) - dev->driver->remove(dev); - put_driver(dev->driver); + struct device_driver * drv; + if (dev->driver) { lock_device(dev); + drv = dev->driver; dev->driver = NULL; unlock_device(dev); + + write_lock(&drv->lock); + list_del_init(&dev->driver_list); + write_unlock(&drv->lock); + + /* detach from driver */ + if (drv->remove) + drv->remove(dev); + put_driver(drv); } } -- 2.39.5