Driver core: Fix device_move() vs. dpm list ordering, v2
dpm_list currently relies on the fact that child devices will be registered after their parents to get a correct suspend order. Using device_move() however destroys this assumption, as an already registered device may be moved under a newly registered one. This patch adds a new argument to device_move(), allowing callers to specify how dpm_list should be adapted. Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com> Acked-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
60530afe1e
commit
ffa6a7054d
@@ -799,7 +799,7 @@ static void sch_attach_disconnected_device(struct subchannel *sch,
|
||||
return;
|
||||
other_sch = to_subchannel(cdev->dev.parent);
|
||||
/* Note: device_move() changes cdev->dev.parent */
|
||||
ret = device_move(&cdev->dev, &sch->dev);
|
||||
ret = device_move(&cdev->dev, &sch->dev, DPM_ORDER_PARENT_BEFORE_DEV);
|
||||
if (ret) {
|
||||
CIO_MSG_EVENT(0, "Moving disconnected device 0.%x.%04x failed "
|
||||
"(ret=%d)!\n", cdev->private->dev_id.ssid,
|
||||
@@ -830,7 +830,7 @@ static void sch_attach_orphaned_device(struct subchannel *sch,
|
||||
* Try to move the ccw device to its new subchannel.
|
||||
* Note: device_move() changes cdev->dev.parent
|
||||
*/
|
||||
ret = device_move(&cdev->dev, &sch->dev);
|
||||
ret = device_move(&cdev->dev, &sch->dev, DPM_ORDER_PARENT_BEFORE_DEV);
|
||||
if (ret) {
|
||||
CIO_MSG_EVENT(0, "Moving device 0.%x.%04x from orphanage "
|
||||
"failed (ret=%d)!\n",
|
||||
@@ -897,7 +897,8 @@ void ccw_device_move_to_orphanage(struct work_struct *work)
|
||||
* ccw device can take its place on the subchannel.
|
||||
* Note: device_move() changes cdev->dev.parent
|
||||
*/
|
||||
ret = device_move(&cdev->dev, &css->pseudo_subchannel->dev);
|
||||
ret = device_move(&cdev->dev, &css->pseudo_subchannel->dev,
|
||||
DPM_ORDER_NONE);
|
||||
if (ret) {
|
||||
CIO_MSG_EVENT(0, "Moving device 0.%x.%04x to orphanage failed "
|
||||
"(ret=%d)!\n", cdev->private->dev_id.ssid,
|
||||
@@ -1129,7 +1130,7 @@ static void ccw_device_move_to_sch(struct work_struct *work)
|
||||
* Try to move the ccw device to its new subchannel.
|
||||
* Note: device_move() changes cdev->dev.parent
|
||||
*/
|
||||
rc = device_move(&cdev->dev, &sch->dev);
|
||||
rc = device_move(&cdev->dev, &sch->dev, DPM_ORDER_PARENT_BEFORE_DEV);
|
||||
mutex_unlock(&sch->reg_mutex);
|
||||
if (rc) {
|
||||
CIO_MSG_EVENT(0, "Moving device 0.%x.%04x to subchannel "
|
||||
|
Reference in New Issue
Block a user