Skip to content

Commit

Permalink
s390/dasd: fix unaccessible device after resume
Browse files Browse the repository at this point in the history
If a channel path is cabled incorrectly and the device is suspended and
resumed the device may be inaccessible afterwards.
Make the path connection check not interrupt the resume callback there
could be other valid paths available.

Signed-off-by: Stefan Haberland <stefan.haberland@de.ibm.com>
Reference-ID: RQM 1262
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
  • Loading branch information
Stefan Haberland authored and Martin Schwidefsky committed Nov 30, 2012
1 parent 683c3dc commit 55d3a85
Showing 1 changed file with 7 additions and 9 deletions.
16 changes: 7 additions & 9 deletions drivers/s390/block/dasd_eckd.c
Original file line number Diff line number Diff line change
Expand Up @@ -1026,7 +1026,7 @@ static int dasd_eckd_read_conf(struct dasd_device *device)
{
void *conf_data;
int conf_len, conf_data_saved;
int rc;
int rc, path_err;
__u8 lpm, opm;
struct dasd_eckd_private *private, path_private;
struct dasd_path *path_data;
Expand All @@ -1037,6 +1037,7 @@ static int dasd_eckd_read_conf(struct dasd_device *device)
path_data = &device->path_data;
opm = ccw_device_get_path_mask(device->cdev);
conf_data_saved = 0;
path_err = 0;
/* get configuration data per operational path */
for (lpm = 0x80; lpm; lpm>>= 1) {
if (!(lpm & opm))
Expand Down Expand Up @@ -1122,7 +1123,8 @@ static int dasd_eckd_read_conf(struct dasd_device *device)
"the same device, path %02X leads to "
"device %s instead of %s\n", lpm,
print_path_uid, print_device_uid);
return -EINVAL;
path_err = -EINVAL;
continue;
}

path_private.conf_data = NULL;
Expand All @@ -1142,7 +1144,7 @@ static int dasd_eckd_read_conf(struct dasd_device *device)
kfree(conf_data);
}

return 0;
return path_err;
}

static int verify_fcx_max_data(struct dasd_device *device, __u8 lpm)
Expand Down Expand Up @@ -4159,9 +4161,7 @@ static int dasd_eckd_restore_device(struct dasd_device *device)
private = (struct dasd_eckd_private *) device->private;

/* Read Configuration Data */
rc = dasd_eckd_read_conf(device);
if (rc)
goto out_err;
dasd_eckd_read_conf(device);

dasd_eckd_get_uid(device, &temp_uid);
/* Generate device unique id */
Expand All @@ -4181,9 +4181,7 @@ static int dasd_eckd_restore_device(struct dasd_device *device)
dasd_eckd_validate_server(device, DASD_CQR_FLAGS_FAILFAST);

/* RE-Read Configuration Data */
rc = dasd_eckd_read_conf(device);
if (rc)
goto out_err;
dasd_eckd_read_conf(device);

/* Read Feature Codes */
dasd_eckd_read_features(device);
Expand Down

0 comments on commit 55d3a85

Please sign in to comment.