]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
S390: dasd: support DIAG access for read-only devices
authorStefan Weinhuber <wein@de.ibm.com>
Mon, 7 Dec 2009 11:51:48 +0000 (12:51 +0100)
committerGreg Kroah-Hartman <gregkh@suse.de>
Wed, 6 Jan 2010 23:17:15 +0000 (15:17 -0800)
commit 22825ab7693fd29769518a0d25ba43c01a50092a upstream.

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: Stefan Weinhuber <wein@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Stephen Powell <zlinuxman@wowway.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/s390/block/dasd_diag.c

index 85fcb43710541e4d1057bd06deeac90f29346992..b4ae447a92c88eb7e4421cbb599bc844885cafff 100644 (file)
@@ -143,6 +143,15 @@ dasd_diag_erp(struct dasd_device *device)
 
        mdsk_term_io(device);
        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)
                DEV_MESSAGE(KERN_WARNING, device, "DIAG ERP unsuccessful, "
                            "rc=%d", rc);
@@ -432,16 +441,20 @@ dasd_diag_check_device(struct dasd_device *device)
        for (sb = 512; sb < bsize; sb = sb << 1)
                block->s2b_shift++;
        rc = mdsk_init_io(device, block->bp_block, 0, NULL);
-       if (rc) {
+       if (rc && (rc != 4)) {
                DEV_MESSAGE(KERN_WARNING, device, "DIAG initialization "
                        "failed (rc=%d)", rc);
                rc = -EIO;
        } else {
+               if (rc == 4)
+                       device->features |= DASD_FEATURE_READONLY;
                DEV_MESSAGE(KERN_INFO, device,
-                           "(%ld B/blk): %ldkB",
+                           "(%ld B/blk): %ldkB%s",
                            (unsigned long) block->bp_block,
                            (unsigned long) (block->blocks <<
-                               block->s2b_shift) >> 1);
+                               block->s2b_shift) >> 1,
+                               (rc == 4) ? ", read-only device" : "");
+               rc = 0;
        }
 out_label:
        free_page((long) label);