mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-15 01:44:52 +00:00
[S390] ccwgroup device unregister.
Work around the problem that a device cannot be unregistered from driver_for_each_device() because of klist node refcounting: Get device after device owned by the driver to be unregistered with driver_find_device() and then unregister it. This works because driver_get_device() gets us out of the region of the elevated klist node refcount. driver_find_device() will always get the next device in the list after the found one has been unregistered. Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
231caa1cac
commit
887ab59929
@ -404,21 +404,24 @@ ccwgroup_driver_register (struct ccwgroup_driver *cdriver)
|
||||
}
|
||||
|
||||
static int
|
||||
__ccwgroup_driver_unregister_device(struct device *dev, void *data)
|
||||
__ccwgroup_match_all(struct device *dev, void *data)
|
||||
{
|
||||
__ccwgroup_remove_symlinks(to_ccwgroupdev(dev));
|
||||
device_unregister(dev);
|
||||
put_device(dev);
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
void
|
||||
ccwgroup_driver_unregister (struct ccwgroup_driver *cdriver)
|
||||
{
|
||||
struct device *dev;
|
||||
|
||||
/* We don't want ccwgroup devices to live longer than their driver. */
|
||||
get_driver(&cdriver->driver);
|
||||
driver_for_each_device(&cdriver->driver, NULL, NULL,
|
||||
__ccwgroup_driver_unregister_device);
|
||||
while ((dev = driver_find_device(&cdriver->driver, NULL, NULL,
|
||||
__ccwgroup_match_all))) {
|
||||
__ccwgroup_remove_symlinks(to_ccwgroupdev(dev));
|
||||
device_unregister(dev);
|
||||
put_device(dev);
|
||||
}
|
||||
put_driver(&cdriver->driver);
|
||||
driver_unregister(&cdriver->driver);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user