From: Cornelia Huck As pointed out by Alan Stern, device_move needs to use klist_remove which waits until removal is complete. Signed-off-by: Cornelia Huck Cc: Greg KH Cc: Alan Stern Signed-off-by: Andrew Morton --- drivers/base/core.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff -puN drivers/base/core.c~driver-core-use-klist_remove-in-device_move drivers/base/core.c --- a/drivers/base/core.c~driver-core-use-klist_remove-in-device_move +++ a/drivers/base/core.c @@ -1025,7 +1025,7 @@ int device_move(struct device *dev, stru old_parent = dev->parent; dev->parent = new_parent; if (old_parent) - klist_del(&dev->knode_parent); + klist_remove(&dev->knode_parent); klist_add_tail(&dev->knode_parent, &new_parent->klist_children); if (!dev->class) goto out_put; @@ -1034,7 +1034,7 @@ int device_move(struct device *dev, stru /* We ignore errors on cleanup since we're hosed anyway... */ device_move_class_links(dev, new_parent, old_parent); if (!kobject_move(&dev->kobj, &old_parent->kobj)) { - klist_del(&dev->knode_parent); + klist_remove(&dev->knode_parent); if (old_parent) klist_add_tail(&dev->knode_parent, &old_parent->klist_children); _