Commit 22825ab7 authored by Stefan Weinhuber's avatar Stefan Weinhuber Committed by Martin Schwidefsky

[S390] dasd: support DIAG access for read-only devices

When a DASD device is used with the DIAG discipline, the DIAG
initialization will indicate success or error with a respective
return code. So far we have interpreted a return code of 4 as error,
but it actually means that the initialization was successful, but
the device is read-only. To allow read-only devices to be used with
DIAG we need to accept a return code of 4 as success.

Re-initialization of the DIAG access is also part of the DIAG error
recovery. If we find that the access mode of a device has been
changed from writable to read-only while the device was in use,
we print an error message.
Signed-off-by: default avatarStefan Weinhuber <wein@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 6c1e3e79
...@@ -145,6 +145,15 @@ dasd_diag_erp(struct dasd_device *device) ...@@ -145,6 +145,15 @@ dasd_diag_erp(struct dasd_device *device)
mdsk_term_io(device); mdsk_term_io(device);
rc = mdsk_init_io(device, device->block->bp_block, 0, NULL); rc = mdsk_init_io(device, device->block->bp_block, 0, NULL);
if (rc == 4) {
if (!(device->features & DASD_FEATURE_READONLY)) {
dev_warn(&device->cdev->dev,
"The access mode of a DIAG device changed"
" to read-only");
device->features |= DASD_FEATURE_READONLY;
}
rc = 0;
}
if (rc) if (rc)
dev_warn(&device->cdev->dev, "DIAG ERP failed with " dev_warn(&device->cdev->dev, "DIAG ERP failed with "
"rc=%d\n", rc); "rc=%d\n", rc);
...@@ -433,16 +442,20 @@ dasd_diag_check_device(struct dasd_device *device) ...@@ -433,16 +442,20 @@ dasd_diag_check_device(struct dasd_device *device)
for (sb = 512; sb < bsize; sb = sb << 1) for (sb = 512; sb < bsize; sb = sb << 1)
block->s2b_shift++; block->s2b_shift++;
rc = mdsk_init_io(device, block->bp_block, 0, NULL); rc = mdsk_init_io(device, block->bp_block, 0, NULL);
if (rc) { if (rc && (rc != 4)) {
dev_warn(&device->cdev->dev, "DIAG initialization " dev_warn(&device->cdev->dev, "DIAG initialization "
"failed with rc=%d\n", rc); "failed with rc=%d\n", rc);
rc = -EIO; rc = -EIO;
} else { } else {
if (rc == 4)
device->features |= DASD_FEATURE_READONLY;
dev_info(&device->cdev->dev, dev_info(&device->cdev->dev,
"New DASD with %ld byte/block, total size %ld KB\n", "New DASD with %ld byte/block, total size %ld KB%s\n",
(unsigned long) block->bp_block, (unsigned long) block->bp_block,
(unsigned long) (block->blocks << (unsigned long) (block->blocks <<
block->s2b_shift) >> 1); block->s2b_shift) >> 1,
(rc == 4) ? ", read-only device" : "");
rc = 0;
} }
out_label: out_label:
free_page((long) label); free_page((long) label);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment