diff options
author | Stefan Haberland <sth@linux.vnet.ibm.com> | 2016-08-09 09:58:48 -0400 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2016-08-11 03:29:14 -0400 |
commit | af7752106e4f12b4ee47b4eca3e7ba4bcec6e7e5 (patch) | |
tree | b2a576c4338d47658886d3263a6d7e6983bcba70 | |
parent | 4d81aaa53c2dea220ddf88e19c33033d6cf4f8cb (diff) |
s390/dasd: fix failing CUIR assignment under LPAR
On LPAR the read message buffer command should be executed on the path
it was received on otherwise there is a chance that the CUIR assignment
might be faulty and the wrong channel path is set online/offline.
Fix by setting the path mask accordingly.
On z/VM we might not be able to do I/O on this path but there it does
not matter on which path the read message buffer command is executed.
Therefor implement a retry with an open path mask.
Signed-off-by: Stefan Haberland <sth@linux.vnet.ibm.com>
-rw-r--r-- | drivers/s390/block/dasd_eckd.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/s390/block/dasd_eckd.c b/drivers/s390/block/dasd_eckd.c index fd2eff440098..98bbec44bcd0 100644 --- a/drivers/s390/block/dasd_eckd.c +++ b/drivers/s390/block/dasd_eckd.c | |||
@@ -5078,6 +5078,8 @@ static int dasd_eckd_read_message_buffer(struct dasd_device *device, | |||
5078 | return PTR_ERR(cqr); | 5078 | return PTR_ERR(cqr); |
5079 | } | 5079 | } |
5080 | 5080 | ||
5081 | cqr->lpm = lpum; | ||
5082 | retry: | ||
5081 | cqr->startdev = device; | 5083 | cqr->startdev = device; |
5082 | cqr->memdev = device; | 5084 | cqr->memdev = device; |
5083 | cqr->block = NULL; | 5085 | cqr->block = NULL; |
@@ -5122,6 +5124,14 @@ static int dasd_eckd_read_message_buffer(struct dasd_device *device, | |||
5122 | (prssdp + 1); | 5124 | (prssdp + 1); |
5123 | memcpy(messages, message_buf, | 5125 | memcpy(messages, message_buf, |
5124 | sizeof(struct dasd_rssd_messages)); | 5126 | sizeof(struct dasd_rssd_messages)); |
5127 | } else if (cqr->lpm) { | ||
5128 | /* | ||
5129 | * on z/VM we might not be able to do I/O on the requested path | ||
5130 | * but instead we get the required information on any path | ||
5131 | * so retry with open path mask | ||
5132 | */ | ||
5133 | cqr->lpm = 0; | ||
5134 | goto retry; | ||
5125 | } else | 5135 | } else |
5126 | DBF_EVENT_DEVID(DBF_WARNING, device->cdev, | 5136 | DBF_EVENT_DEVID(DBF_WARNING, device->cdev, |
5127 | "Reading messages failed with rc=%d\n" | 5137 | "Reading messages failed with rc=%d\n" |