* [S390] cio: Use path verification for last path gone after vary off.
@ 2006-12-04 14:57 Martin Schwidefsky
0 siblings, 0 replies; only message in thread
From: Martin Schwidefsky @ 2006-12-04 14:57 UTC (permalink / raw)
To: linux-kernel, cornelia.huck
From: Cornelia Huck <cornelia.huck@de.ibm.com>
[S390] cio: Use path verification for last path gone after vary off.
If the last path to a device is gone after a chpid has been varied
off, putting it on the slow queue doesn't prevent a device driver
from still attempting to use it (it may stay on the slow queue for a
long time). Instead, trigger a verify event which will prevent I/O
attempts from the device driver immediately.
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
---
drivers/s390/cio/chsc.c | 22 ++++++++++++----------
drivers/s390/cio/css.h | 1 +
drivers/s390/cio/device_fsm.c | 11 +++++++++++
3 files changed, 24 insertions(+), 10 deletions(-)
diff -urpN linux-2.6/drivers/s390/cio/chsc.c linux-2.6-patched/drivers/s390/cio/chsc.c
--- linux-2.6/drivers/s390/cio/chsc.c 2006-12-04 14:50:48.000000000 +0100
+++ linux-2.6-patched/drivers/s390/cio/chsc.c 2006-12-04 14:51:04.000000000 +0100
@@ -744,20 +744,22 @@ __s390_subchannel_vary_chpid(struct subc
device_trigger_reprobe(sch);
else if (sch->driver && sch->driver->verify)
sch->driver->verify(&sch->dev);
- } else {
- sch->opm &= ~(0x80 >> chp);
- sch->lpm &= ~(0x80 >> chp);
- if (check_for_io_on_path(sch, chp))
- /* Path verification is done after killing. */
- device_kill_io(sch);
- else if (!sch->lpm) {
+ break;
+ }
+ sch->opm &= ~(0x80 >> chp);
+ sch->lpm &= ~(0x80 >> chp);
+ if (check_for_io_on_path(sch, chp))
+ /* Path verification is done after killing. */
+ device_kill_io(sch);
+ else if (!sch->lpm) {
+ if (device_trigger_verify(sch) != 0) {
if (css_enqueue_subchannel_slow(sch->schid)) {
css_clear_subchannel_slow_list();
need_rescan = 1;
}
- } else if (sch->driver && sch->driver->verify)
- sch->driver->verify(&sch->dev);
- }
+ }
+ } else if (sch->driver && sch->driver->verify)
+ sch->driver->verify(&sch->dev);
break;
}
spin_unlock_irqrestore(&sch->lock, flags);
diff -urpN linux-2.6/drivers/s390/cio/css.h linux-2.6-patched/drivers/s390/cio/css.h
--- linux-2.6/drivers/s390/cio/css.h 2006-11-29 22:57:37.000000000 +0100
+++ linux-2.6-patched/drivers/s390/cio/css.h 2006-12-04 14:51:04.000000000 +0100
@@ -171,6 +171,7 @@ void device_trigger_reprobe(struct subch
/* Helper functions for vary on/off. */
int device_is_online(struct subchannel *);
void device_kill_io(struct subchannel *);
+int device_trigger_verify(struct subchannel *sch);
/* Machine check helper function. */
void device_kill_pending_timer(struct subchannel *);
diff -urpN linux-2.6/drivers/s390/cio/device_fsm.c linux-2.6-patched/drivers/s390/cio/device_fsm.c
--- linux-2.6/drivers/s390/cio/device_fsm.c 2006-11-29 22:57:37.000000000 +0100
+++ linux-2.6-patched/drivers/s390/cio/device_fsm.c 2006-12-04 14:51:04.000000000 +0100
@@ -59,6 +59,17 @@ device_set_disconnected(struct subchanne
cdev->private->state = DEV_STATE_DISCONNECTED;
}
+int device_trigger_verify(struct subchannel *sch)
+{
+ struct ccw_device *cdev;
+
+ cdev = sch->dev.driver_data;
+ if (!cdev || !cdev->online)
+ return -EINVAL;
+ dev_fsm_event(cdev, DEV_EVENT_VERIFY);
+ return 0;
+}
+
/*
* Timeout function. It just triggers a DEV_EVENT_TIMEOUT.
*/
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2006-12-04 14:57 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-12-04 14:57 [S390] cio: Use path verification for last path gone after vary off Martin Schwidefsky
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.