s390/dasd: fix disconnected device with valid path mask
authorStefan Haberland <stefan.haberland@de.ibm.com>
Fri, 23 Oct 2015 10:10:51 +0000 (12:10 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Tue, 3 Nov 2015 13:40:47 +0000 (14:40 +0100)
Path verification is either done via dasd_eckd_read_conf() which is
triggered during online processing and resume or via
do_path_verification_work() which is triggered after path events.
The dasd_eckd_read_conf() version added paths unconditionally and did
not check if the path mask was empty. This led to devices having the
disconnected stop flag set but a valid path mask. So they where not
working although they had paths validated successfully. After a resume
this state could even not be solved with additional paths added.

Fix by checking for an empty path mask in dasd_eckd_read_conf() and
clearing the device stop bits for a newly added channel path.

Reviewed-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: Stefan Haberland <stefan.haberland@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
drivers/s390/block/dasd_eckd.c

index 3d929abb52c759cb8a3fa7d4001119bf7d513eb4..9083247f55a817cc2592d6b874cf624e09d82cf5 100644 (file)
@@ -1171,7 +1171,12 @@ static int dasd_eckd_read_conf(struct dasd_device *device)
                        path_data->ppm |= lpm;
                        break;
                }
-               path_data->opm |= lpm;
+               if (!path_data->opm) {
+                       path_data->opm = lpm;
+                       dasd_generic_path_operational(device);
+               } else {
+                       path_data->opm |= lpm;
+               }
                /*
                 * if the path is used
                 * it should not be in one of the negative lists