diff options
Diffstat (limited to 'drivers/s390/cio/css.c')
-rw-r--r-- | drivers/s390/cio/css.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/drivers/s390/cio/css.c b/drivers/s390/cio/css.c index 366affcd9bbf..169a27723c4f 100644 --- a/drivers/s390/cio/css.c +++ b/drivers/s390/cio/css.c | |||
@@ -1016,19 +1016,22 @@ static int css_settle(struct device_driver *drv, void *unused) | |||
1016 | struct css_driver *cssdrv = to_cssdriver(drv); | 1016 | struct css_driver *cssdrv = to_cssdriver(drv); |
1017 | 1017 | ||
1018 | if (cssdrv->settle) | 1018 | if (cssdrv->settle) |
1019 | cssdrv->settle(); | 1019 | return cssdrv->settle(); |
1020 | return 0; | 1020 | return 0; |
1021 | } | 1021 | } |
1022 | 1022 | ||
1023 | static inline void css_complete_work(void) | 1023 | static inline int css_complete_work(void) |
1024 | { | 1024 | { |
1025 | int ret; | 1025 | int ret; |
1026 | 1026 | ||
1027 | /* Wait for the evaluation of subchannels to finish. */ | 1027 | /* Wait for the evaluation of subchannels to finish. */ |
1028 | wait_event(css_eval_wq, atomic_read(&css_eval_scheduled) == 0); | 1028 | ret = wait_event_interruptible(css_eval_wq, |
1029 | atomic_read(&css_eval_scheduled) == 0); | ||
1030 | if (ret) | ||
1031 | return -EINTR; | ||
1029 | flush_workqueue(cio_work_q); | 1032 | flush_workqueue(cio_work_q); |
1030 | /* Wait for the subchannel type specific initialization to finish */ | 1033 | /* Wait for the subchannel type specific initialization to finish */ |
1031 | ret = bus_for_each_drv(&css_bus_type, NULL, NULL, css_settle); | 1034 | return bus_for_each_drv(&css_bus_type, NULL, NULL, css_settle); |
1032 | } | 1035 | } |
1033 | 1036 | ||
1034 | 1037 | ||
@@ -1049,10 +1052,13 @@ subsys_initcall_sync(channel_subsystem_init_sync); | |||
1049 | static ssize_t cio_settle_write(struct file *file, const char __user *buf, | 1052 | static ssize_t cio_settle_write(struct file *file, const char __user *buf, |
1050 | size_t count, loff_t *ppos) | 1053 | size_t count, loff_t *ppos) |
1051 | { | 1054 | { |
1055 | int ret; | ||
1056 | |||
1052 | /* Handle pending CRW's. */ | 1057 | /* Handle pending CRW's. */ |
1053 | crw_wait_for_channel_report(); | 1058 | crw_wait_for_channel_report(); |
1054 | css_complete_work(); | 1059 | ret = css_complete_work(); |
1055 | return count; | 1060 | |
1061 | return ret ? ret : count; | ||
1056 | } | 1062 | } |
1057 | 1063 | ||
1058 | static const struct file_operations cio_settle_proc_fops = { | 1064 | static const struct file_operations cio_settle_proc_fops = { |