aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorCornelia Huck <cornelia.huck@de.ibm.com>2007-03-05 17:35:59 -0500
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2007-03-05 17:35:59 -0500
commit7c8427c3fa1b2e77c5bd8cf219c1d55dccd0f167 (patch)
tree62bb33587220f4676684ed7f3e2a00a7c06ba323 /drivers
parentee04bbccdeb11bdbc54015be8dca30a0deeca5e4 (diff)
[S390] cio: Use path verification to check for path state.
After I/O has been killed by the common I/O layer, trigger path verification which will queue cio_device_nopath_notify itself if it finds a device to be without paths. Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/s390/cio/device_fsm.c46
1 files changed, 6 insertions, 40 deletions
diff --git a/drivers/s390/cio/device_fsm.c b/drivers/s390/cio/device_fsm.c
index 8baa9cd3794c..5172060acdbe 100644
--- a/drivers/s390/cio/device_fsm.c
+++ b/drivers/s390/cio/device_fsm.c
@@ -996,18 +996,12 @@ ccw_device_killing_irq(struct ccw_device *cdev, enum dev_event dev_event)
996 996
997 sch = to_subchannel(cdev->dev.parent); 997 sch = to_subchannel(cdev->dev.parent);
998 ccw_device_set_timeout(cdev, 0); 998 ccw_device_set_timeout(cdev, 0);
999 /* Start delayed path verification. */
1000 ccw_device_online_verify(cdev, 0);
999 /* OK, i/o is dead now. Call interrupt handler. */ 1001 /* OK, i/o is dead now. Call interrupt handler. */
1000 cdev->private->state = DEV_STATE_ONLINE;
1001 if (cdev->handler) 1002 if (cdev->handler)
1002 cdev->handler(cdev, cdev->private->intparm, 1003 cdev->handler(cdev, cdev->private->intparm,
1003 ERR_PTR(-EIO)); 1004 ERR_PTR(-EIO));
1004 if (!sch->lpm) {
1005 PREPARE_WORK(&cdev->private->kick_work,
1006 ccw_device_nopath_notify);
1007 queue_work(ccw_device_notify_work, &cdev->private->kick_work);
1008 } else if (cdev->private->flags.doverify)
1009 /* Start delayed path verification. */
1010 ccw_device_online_verify(cdev, 0);
1011} 1005}
1012 1006
1013static void 1007static void
@@ -1020,21 +1014,8 @@ ccw_device_killing_timeout(struct ccw_device *cdev, enum dev_event dev_event)
1020 ccw_device_set_timeout(cdev, 3*HZ); 1014 ccw_device_set_timeout(cdev, 3*HZ);
1021 return; 1015 return;
1022 } 1016 }
1023 if (ret == -ENODEV) { 1017 /* Start delayed path verification. */
1024 struct subchannel *sch; 1018 ccw_device_online_verify(cdev, 0);
1025
1026 sch = to_subchannel(cdev->dev.parent);
1027 if (!sch->lpm) {
1028 PREPARE_WORK(&cdev->private->kick_work,
1029 ccw_device_nopath_notify);
1030 queue_work(ccw_device_notify_work,
1031 &cdev->private->kick_work);
1032 } else
1033 dev_fsm_event(cdev, DEV_EVENT_NOTOPER);
1034 return;
1035 }
1036 //FIXME: Can we get here?
1037 cdev->private->state = DEV_STATE_ONLINE;
1038 if (cdev->handler) 1019 if (cdev->handler)
1039 cdev->handler(cdev, cdev->private->intparm, 1020 cdev->handler(cdev, cdev->private->intparm,
1040 ERR_PTR(-EIO)); 1021 ERR_PTR(-EIO));
@@ -1052,26 +1033,11 @@ void device_kill_io(struct subchannel *sch)
1052 cdev->private->state = DEV_STATE_TIMEOUT_KILL; 1033 cdev->private->state = DEV_STATE_TIMEOUT_KILL;
1053 return; 1034 return;
1054 } 1035 }
1055 if (ret == -ENODEV) { 1036 /* Start delayed path verification. */
1056 if (!sch->lpm) { 1037 ccw_device_online_verify(cdev, 0);
1057 PREPARE_WORK(&cdev->private->kick_work,
1058 ccw_device_nopath_notify);
1059 queue_work(ccw_device_notify_work,
1060 &cdev->private->kick_work);
1061 } else
1062 dev_fsm_event(cdev, DEV_EVENT_NOTOPER);
1063 return;
1064 }
1065 if (cdev->handler) 1038 if (cdev->handler)
1066 cdev->handler(cdev, cdev->private->intparm, 1039 cdev->handler(cdev, cdev->private->intparm,
1067 ERR_PTR(-EIO)); 1040 ERR_PTR(-EIO));
1068 if (!sch->lpm) {
1069 PREPARE_WORK(&cdev->private->kick_work,
1070 ccw_device_nopath_notify);
1071 queue_work(ccw_device_notify_work, &cdev->private->kick_work);
1072 } else
1073 /* Start delayed path verification. */
1074 ccw_device_online_verify(cdev, 0);
1075} 1041}
1076 1042
1077static void 1043static void