mirror of
https://github.com/FEX-Emu/linux.git
synced 2025-01-05 17:01:17 +00:00
[PATCH] device_shutdown can loop if the driver frees itself
This patch changes device_shutdown() to use the newly introduced safe reverse list traversal. We experienced loops on system reboot if we had removed and re-inserted our device from the device list. We noticed this problem on PPC405. Our PCI IDE device comes and goes a lot. Our hypothesis was that there was a loop caused by the driver->shutdown freeing memory. It is possible that we do something wrong as well, but being unable to reboot is kind of nasty. Signed-off-by: Michael Richardson <mcr@marajade.sandelman.ca> Cc: Patrick Mochel <mochel@digitalimplant.org> Cc: David Howells <dhowells@redhat.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
2d7b5a70e0
commit
9c08a938ce
@ -35,10 +35,10 @@ extern int sysdev_shutdown(void);
|
|||||||
*/
|
*/
|
||||||
void device_shutdown(void)
|
void device_shutdown(void)
|
||||||
{
|
{
|
||||||
struct device * dev;
|
struct device * dev, *devn;
|
||||||
|
|
||||||
down_write(&devices_subsys.rwsem);
|
down_write(&devices_subsys.rwsem);
|
||||||
list_for_each_entry_reverse(dev, &devices_subsys.kset.list,
|
list_for_each_entry_safe_reverse(dev, devn, &devices_subsys.kset.list,
|
||||||
kobj.entry) {
|
kobj.entry) {
|
||||||
if (dev->bus && dev->bus->shutdown) {
|
if (dev->bus && dev->bus->shutdown) {
|
||||||
dev_dbg(dev, "shutdown\n");
|
dev_dbg(dev, "shutdown\n");
|
||||||
|
Loading…
Reference in New Issue
Block a user