From 25e2cf1c1ac52d5078cf8cc3fd2f2ad084669ddd Mon Sep 17 00:00:00 2001 From: Stefan Haberland Date: Sun, 11 Mar 2012 11:59:37 -0400 Subject: [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 Reviewed-by: Stefan Weinhuber Signed-off-by: Martin Schwidefsky --- drivers/s390/block/dasd_eckd.c | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'drivers/s390/block/dasd_eckd.c') diff --git a/drivers/s390/block/dasd_eckd.c b/drivers/s390/block/dasd_eckd.c index 2617b1ed4709..c21871a4e73d 100644 --- a/drivers/s390/block/dasd_eckd.c +++ b/drivers/s390/block/dasd_eckd.c @@ -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) { 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. */ 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) { cancel_work_sync(&device->reload_device); + cancel_work_sync(&device->kick_validate); 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 */ if (!device->block && private->lcu && + device->state == DASD_STATE_ONLINE && !test_bit(DASD_FLAG_OFFLINE, &device->flags) && !test_bit(DASD_FLAG_SUSPENDED, &device->flags)) { /* -- cgit v1.2.3