Commit 2297791c authored by Vineeth Vijayan's avatar Vineeth Vijayan Committed by Heiko Carstens

s390/cio: dont unregister subchannel from child-drivers

The devices owned by the parent-driver (css) was getting unregistered
from the io-subchannel driver is clearly a layering violation.
Remove the subchannel unregistration from the child-drivers.

This also means, if the device connected to the subchannel is not
operational, or not accessible, the subchannel will not be unregistered.
Instead the CIO layer will allow valid subchannels without any operational
devices in sysfs. And the userspace tooling might need to be modified to
optimally handle this new situation.
Signed-off-by: default avatarVineeth Vijayan <vneethv@linux.ibm.com>
Reviewed-by: default avatarPeter Oberparleiter <oberpar@linux.ibm.com>
Signed-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
parent c7a5238e
...@@ -262,7 +262,10 @@ static int blacklist_parse_proc_parameters(char *buf) ...@@ -262,7 +262,10 @@ static int blacklist_parse_proc_parameters(char *buf)
if (strcmp("free", parm) == 0) { if (strcmp("free", parm) == 0) {
rc = blacklist_parse_parameters(buf, free, 0); rc = blacklist_parse_parameters(buf, free, 0);
css_schedule_eval_all_unreg(0); /* There could be subchannels without proper devices connected.
* evaluate all the entries
*/
css_schedule_eval_all();
} else if (strcmp("add", parm) == 0) } else if (strcmp("add", parm) == 0)
rc = blacklist_parse_parameters(buf, add, 0); rc = blacklist_parse_parameters(buf, add, 0);
else if (strcmp("purge", parm) == 0) else if (strcmp("purge", parm) == 0)
......
...@@ -867,19 +867,6 @@ static void io_subchannel_register(struct ccw_device *cdev) ...@@ -867,19 +867,6 @@ static void io_subchannel_register(struct ccw_device *cdev)
wake_up(&ccw_device_init_wq); wake_up(&ccw_device_init_wq);
} }
static void ccw_device_call_sch_unregister(struct ccw_device *cdev)
{
struct subchannel *sch;
/* Get subchannel reference for local processing. */
if (!get_device(cdev->dev.parent))
return;
sch = to_subchannel(cdev->dev.parent);
css_sch_device_unregister(sch);
/* Release subchannel reference for local processing. */
put_device(&sch->dev);
}
/* /*
* subchannel recognition done. Called from the state machine. * subchannel recognition done. Called from the state machine.
*/ */
...@@ -1860,10 +1847,10 @@ static void ccw_device_todo(struct work_struct *work) ...@@ -1860,10 +1847,10 @@ static void ccw_device_todo(struct work_struct *work)
css_schedule_eval(sch->schid); css_schedule_eval(sch->schid);
fallthrough; fallthrough;
case CDEV_TODO_UNREG: case CDEV_TODO_UNREG:
if (sch_is_pseudo_sch(sch)) spin_lock_irq(sch->lock);
sch_set_cdev(sch, NULL);
spin_unlock_irq(sch->lock);
ccw_device_unregister(cdev); ccw_device_unregister(cdev);
else
ccw_device_call_sch_unregister(cdev);
break; break;
default: default:
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment