aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390/block/dasd_eckd.c
diff options
context:
space:
mode:
authorStefan Haberland <stefan.haberland@de.ibm.com>2011-10-30 10:17:09 -0400
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2011-10-30 10:16:45 -0400
commitc8d1c0ff840bbf06c60ff4235202a4b1457d8f59 (patch)
treeb183231aa76a1268141c68cf8566f9e07915800b /drivers/s390/block/dasd_eckd.c
parent6ffed94ea73c0c15e3201d4d479b6efe8343fb96 (diff)
[S390] dasd: prevent path verification before resume
Mark the device as suspended and delay execution of the path verification worker to prevent mix-up. Signed-off-by: Stefan Haberland <stefan.haberland@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'drivers/s390/block/dasd_eckd.c')
-rw-r--r--drivers/s390/block/dasd_eckd.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/drivers/s390/block/dasd_eckd.c b/drivers/s390/block/dasd_eckd.c
index cb1bbc2947e3..cca25096efce 100644
--- a/drivers/s390/block/dasd_eckd.c
+++ b/drivers/s390/block/dasd_eckd.c
@@ -1101,6 +1101,12 @@ static void do_path_verification_work(struct work_struct *work)
1101 data = container_of(work, struct path_verification_work_data, worker); 1101 data = container_of(work, struct path_verification_work_data, worker);
1102 device = data->device; 1102 device = data->device;
1103 1103
1104 /* delay path verification until device was resumed */
1105 if (test_bit(DASD_FLAG_SUSPENDED, &device->flags)) {
1106 schedule_work(work);
1107 return;
1108 }
1109
1104 opm = 0; 1110 opm = 0;
1105 npm = 0; 1111 npm = 0;
1106 ppm = 0; 1112 ppm = 0;
@@ -2047,9 +2053,13 @@ static void dasd_eckd_check_for_device_change(struct dasd_device *device,
2047 /* first of all check for state change pending interrupt */ 2053 /* first of all check for state change pending interrupt */
2048 mask = DEV_STAT_ATTENTION | DEV_STAT_DEV_END | DEV_STAT_UNIT_EXCEP; 2054 mask = DEV_STAT_ATTENTION | DEV_STAT_DEV_END | DEV_STAT_UNIT_EXCEP;
2049 if ((scsw_dstat(&irb->scsw) & mask) == mask) { 2055 if ((scsw_dstat(&irb->scsw) & mask) == mask) {
2050 /* for alias only and not in offline processing*/ 2056 /*
2057 * for alias only, not in offline processing
2058 * and only if not suspended
2059 */
2051 if (!device->block && private->lcu && 2060 if (!device->block && private->lcu &&
2052 !test_bit(DASD_FLAG_OFFLINE, &device->flags)) { 2061 !test_bit(DASD_FLAG_OFFLINE, &device->flags) &&
2062 !test_bit(DASD_FLAG_SUSPENDED, &device->flags)) {
2053 /* 2063 /*
2054 * the state change could be caused by an alias 2064 * the state change could be caused by an alias
2055 * reassignment remove device from alias handling 2065 * reassignment remove device from alias handling