mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
[S390] dasd: prevent validate server for offline devices
Calling validate server on devices in offline processing may cause an OOPS in the dasd_sleep_on function. Signed-off-by: Stefan Haberland <stefan.haberland@de.ibm.com> Reviewed-by: Stefan Weinhuber <wein@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
35424f636e
commit
25e2cf1c1a
@ -640,6 +640,10 @@ void dasd_enable_device(struct dasd_device *device)
|
|||||||
dasd_set_target_state(device, DASD_STATE_NEW);
|
dasd_set_target_state(device, DASD_STATE_NEW);
|
||||||
/* Now wait for the devices to come up. */
|
/* Now wait for the devices to come up. */
|
||||||
wait_event(dasd_init_waitq, _wait_for_device(device));
|
wait_event(dasd_init_waitq, _wait_for_device(device));
|
||||||
|
|
||||||
|
dasd_reload_device(device);
|
||||||
|
if (device->discipline->kick_validate)
|
||||||
|
device->discipline->kick_validate(device);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1564,6 +1564,12 @@ static void dasd_eckd_do_validate_server(struct work_struct *work)
|
|||||||
static void dasd_eckd_kick_validate_server(struct dasd_device *device)
|
static void dasd_eckd_kick_validate_server(struct dasd_device *device)
|
||||||
{
|
{
|
||||||
dasd_get_device(device);
|
dasd_get_device(device);
|
||||||
|
/* exit if device not online or in offline processing */
|
||||||
|
if (test_bit(DASD_FLAG_OFFLINE, &device->flags) ||
|
||||||
|
device->state < DASD_STATE_ONLINE) {
|
||||||
|
dasd_put_device(device);
|
||||||
|
return;
|
||||||
|
}
|
||||||
/* queue call to do_validate_server to the kernel event daemon. */
|
/* queue call to do_validate_server to the kernel event daemon. */
|
||||||
schedule_work(&device->kick_validate);
|
schedule_work(&device->kick_validate);
|
||||||
}
|
}
|
||||||
@ -1993,6 +1999,7 @@ static int dasd_eckd_ready_to_online(struct dasd_device *device)
|
|||||||
static int dasd_eckd_online_to_ready(struct dasd_device *device)
|
static int dasd_eckd_online_to_ready(struct dasd_device *device)
|
||||||
{
|
{
|
||||||
cancel_work_sync(&device->reload_device);
|
cancel_work_sync(&device->reload_device);
|
||||||
|
cancel_work_sync(&device->kick_validate);
|
||||||
return dasd_alias_remove_device(device);
|
return dasd_alias_remove_device(device);
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -2263,6 +2270,7 @@ static void dasd_eckd_check_for_device_change(struct dasd_device *device,
|
|||||||
* and only if not suspended
|
* and only if not suspended
|
||||||
*/
|
*/
|
||||||
if (!device->block && private->lcu &&
|
if (!device->block && private->lcu &&
|
||||||
|
device->state == DASD_STATE_ONLINE &&
|
||||||
!test_bit(DASD_FLAG_OFFLINE, &device->flags) &&
|
!test_bit(DASD_FLAG_OFFLINE, &device->flags) &&
|
||||||
!test_bit(DASD_FLAG_SUSPENDED, &device->flags)) {
|
!test_bit(DASD_FLAG_SUSPENDED, &device->flags)) {
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user