mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 02:50:49 +09:00
s390/cio: unregister device when the only path is gone
[ Upstream commit 89c0c62e94 ]
Currently, if the device is offline and all the channel paths are
either configured or varied offline, the associated subchannel gets
unregistered. Don't unregister the subchannel, instead unregister
offline device.
Signed-off-by: Vineeth Vijayan <vneethv@linux.ibm.com>
Reviewed-by: Peter Oberparleiter <oberpar@linux.ibm.com>
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
552a24eb71
commit
39a77f005f
@@ -1367,6 +1367,7 @@ void ccw_device_set_notoper(struct ccw_device *cdev)
|
|||||||
enum io_sch_action {
|
enum io_sch_action {
|
||||||
IO_SCH_UNREG,
|
IO_SCH_UNREG,
|
||||||
IO_SCH_ORPH_UNREG,
|
IO_SCH_ORPH_UNREG,
|
||||||
|
IO_SCH_UNREG_CDEV,
|
||||||
IO_SCH_ATTACH,
|
IO_SCH_ATTACH,
|
||||||
IO_SCH_UNREG_ATTACH,
|
IO_SCH_UNREG_ATTACH,
|
||||||
IO_SCH_ORPH_ATTACH,
|
IO_SCH_ORPH_ATTACH,
|
||||||
@@ -1399,7 +1400,7 @@ static enum io_sch_action sch_get_action(struct subchannel *sch)
|
|||||||
}
|
}
|
||||||
if ((sch->schib.pmcw.pam & sch->opm) == 0) {
|
if ((sch->schib.pmcw.pam & sch->opm) == 0) {
|
||||||
if (ccw_device_notify(cdev, CIO_NO_PATH) != NOTIFY_OK)
|
if (ccw_device_notify(cdev, CIO_NO_PATH) != NOTIFY_OK)
|
||||||
return IO_SCH_UNREG;
|
return IO_SCH_UNREG_CDEV;
|
||||||
return IO_SCH_DISC;
|
return IO_SCH_DISC;
|
||||||
}
|
}
|
||||||
if (device_is_disconnected(cdev))
|
if (device_is_disconnected(cdev))
|
||||||
@@ -1461,6 +1462,7 @@ static int io_subchannel_sch_event(struct subchannel *sch, int process)
|
|||||||
case IO_SCH_ORPH_ATTACH:
|
case IO_SCH_ORPH_ATTACH:
|
||||||
ccw_device_set_disconnected(cdev);
|
ccw_device_set_disconnected(cdev);
|
||||||
break;
|
break;
|
||||||
|
case IO_SCH_UNREG_CDEV:
|
||||||
case IO_SCH_UNREG_ATTACH:
|
case IO_SCH_UNREG_ATTACH:
|
||||||
case IO_SCH_UNREG:
|
case IO_SCH_UNREG:
|
||||||
if (!cdev)
|
if (!cdev)
|
||||||
@@ -1494,6 +1496,7 @@ static int io_subchannel_sch_event(struct subchannel *sch, int process)
|
|||||||
if (rc)
|
if (rc)
|
||||||
goto out;
|
goto out;
|
||||||
break;
|
break;
|
||||||
|
case IO_SCH_UNREG_CDEV:
|
||||||
case IO_SCH_UNREG_ATTACH:
|
case IO_SCH_UNREG_ATTACH:
|
||||||
spin_lock_irqsave(sch->lock, flags);
|
spin_lock_irqsave(sch->lock, flags);
|
||||||
sch_set_cdev(sch, NULL);
|
sch_set_cdev(sch, NULL);
|
||||||
|
|||||||
Reference in New Issue
Block a user