| From foo@baz Mon Apr 9 17:09:24 CEST 2018 |
| From: Stefan Haberland <sth@linux.vnet.ibm.com> |
| Date: Thu, 18 May 2017 13:24:45 +0200 |
| Subject: s390/dasd: fix hanging safe offline |
| |
| From: Stefan Haberland <sth@linux.vnet.ibm.com> |
| |
| |
| [ Upstream commit e8ac01555d9e464249e8bb122337d6d6e5589ccc ] |
| |
| The safe offline processing may hang forever because it waits for I/O |
| which can not be started because of the offline flag that prevents new |
| I/O from being started. |
| |
| Allow I/O to be started during safe offline processing because in this |
| special case we take care that the queues are empty before throwing away |
| the device. |
| |
| Signed-off-by: Stefan Haberland <sth@linux.vnet.ibm.com> |
| Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/s390/block/dasd.c | 8 ++++++-- |
| 1 file changed, 6 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/s390/block/dasd.c |
| +++ b/drivers/s390/block/dasd.c |
| @@ -1950,8 +1950,12 @@ static int __dasd_device_is_unusable(str |
| { |
| int mask = ~(DASD_STOPPED_DC_WAIT | DASD_UNRESUMED_PM); |
| |
| - if (test_bit(DASD_FLAG_OFFLINE, &device->flags)) { |
| - /* dasd is being set offline. */ |
| + if (test_bit(DASD_FLAG_OFFLINE, &device->flags) && |
| + !test_bit(DASD_FLAG_SAFE_OFFLINE_RUNNING, &device->flags)) { |
| + /* |
| + * dasd is being set offline |
| + * but it is no safe offline where we have to allow I/O |
| + */ |
| return 1; |
| } |
| if (device->stopped) { |