aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Weinhuber <wein@de.ibm.com>2008-02-05 10:50:47 -0500
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2008-02-05 10:51:00 -0500
commitfe6b8e76d920b93fd445382aff7ff24082af8874 (patch)
tree1b7d18d66c30e346c21ffa1b851487f10dd4378e
parent6c5f57c7884a7e0806ae9af86de243321cab4953 (diff)
[S390] dasd: fix panic caused by alias device offline
When an alias device is set offline while it is in use this may result in a panic in the cleanup part of the dasd_block_tasklet. The problem here is that there may exist some ccw requests that were originally created for the alias device and transferred to the base device when the alias was set offline. When these request are cleaned up later, the discipline pointer in the alias device may not be valid anymore. To fix this use the base device discipline to find the cleanup function. Signed-off-by: Stefan Weinhuber <wein@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
-rw-r--r--drivers/s390/block/dasd.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c
index ab4f64c49829..d984e0fae630 100644
--- a/drivers/s390/block/dasd.c
+++ b/drivers/s390/block/dasd.c
@@ -1706,7 +1706,7 @@ static void __dasd_cleanup_cqr(struct dasd_ccw_req *cqr)
1706 1706
1707 req = (struct request *) cqr->callback_data; 1707 req = (struct request *) cqr->callback_data;
1708 dasd_profile_end(cqr->block, cqr, req); 1708 dasd_profile_end(cqr->block, cqr, req);
1709 status = cqr->memdev->discipline->free_cp(cqr, req); 1709 status = cqr->block->base->discipline->free_cp(cqr, req);
1710 if (status <= 0) 1710 if (status <= 0)
1711 error = status ? status : -EIO; 1711 error = status ? status : -EIO;
1712 dasd_end_request(req, error); 1712 dasd_end_request(req, error);