s390/dasd: fix failing path verification
DASD path verification requires the usage of sleep_on_immediatly to ensure that no other I/O request is blocking the recovery of disconnected devices. But two concurrent path verification workers for the same device may kill each others requests due to the usage of the immediate sleep_on function. This may lead to unsuccessful path verifications. Prevent that two parallel path verification workers conflict with each other by implementing a device flag signalling a already running worker. Signed-off-by: Stefan Haberland <stefan.haberland@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
aad1b688c9
commit
1eb38023dd
|
@ -1259,7 +1259,11 @@ static void do_path_verification_work(struct work_struct *work)
|
|||
schedule_work(work);
|
||||
return;
|
||||
}
|
||||
|
||||
/* check if path verification already running and delay if so */
|
||||
if (test_and_set_bit(DASD_FLAG_PATH_VERIFY, &device->flags)) {
|
||||
schedule_work(work);
|
||||
return;
|
||||
}
|
||||
opm = 0;
|
||||
npm = 0;
|
||||
ppm = 0;
|
||||
|
@ -1402,7 +1406,7 @@ static void do_path_verification_work(struct work_struct *work)
|
|||
device->path_data.hpfpm |= hpfpm;
|
||||
spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags);
|
||||
}
|
||||
|
||||
clear_bit(DASD_FLAG_PATH_VERIFY, &device->flags);
|
||||
dasd_put_device(device);
|
||||
if (data->isglobal)
|
||||
mutex_unlock(&dasd_path_verification_mutex);
|
||||
|
|
|
@ -534,6 +534,7 @@ struct dasd_attention_data {
|
|||
#define DASD_FLAG_SAFE_OFFLINE 10 /* safe offline processing requested*/
|
||||
#define DASD_FLAG_SAFE_OFFLINE_RUNNING 11 /* safe offline running */
|
||||
#define DASD_FLAG_ABORTALL 12 /* Abort all noretry requests */
|
||||
#define DASD_FLAG_PATH_VERIFY 13 /* Path verification worker running */
|
||||
|
||||
#define DASD_SLEEPON_START_TAG ((void *) 1)
|
||||
#define DASD_SLEEPON_END_TAG ((void *) 2)
|
||||
|
|
Loading…
Reference in New Issue