]> git.itanic.dy.fi Git - linux-stable/commitdiff
s390/dasd: set timestamps unconditionally
authorStefan Haberland <sth@linux.vnet.ibm.com>
Thu, 8 Feb 2018 15:55:28 +0000 (16:55 +0100)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Tue, 27 Feb 2018 07:05:29 +0000 (08:05 +0100)
Set the XRC timestamps even if XRC is not supported by the storage server
to help debugging the storage server firmware.
Do not advertise valid time stamps if the system time could not be
obtained.

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

index 29397a9dba68a37e85b587618249270fa4ba188e..85b6a70ce334a6a0f84a3dd3729ef23d7a2fb728 100644 (file)
@@ -214,24 +214,25 @@ static void set_ch_t(struct ch_t *geo, __u32 cyl, __u8 head)
        geo->head |= head;
 }
 
-static int check_XRC(struct ccw1 *ccw, struct DE_eckd_data *data,
+static int set_timestamp(struct ccw1 *ccw, struct DE_eckd_data *data,
                     struct dasd_device *device)
 {
        struct dasd_eckd_private *private = device->private;
        int rc;
 
-       if (!private->rdc_data.facilities.XRC_supported)
+       rc = get_phys_clock(&data->ep_sys_time);
+       /*
+        * Ignore return code if XRC is not supported or
+        * sync clock is switched off
+        */
+       if ((rc && !private->rdc_data.facilities.XRC_supported) ||
+           rc == -EOPNOTSUPP || rc == -EACCES)
                return 0;
 
        /* switch on System Time Stamp - needed for XRC Support */
        data->ga_extended |= 0x08; /* switch on 'Time Stamp Valid'   */
        data->ga_extended |= 0x02; /* switch on 'Extended Parameter' */
 
-       rc = get_phys_clock(&data->ep_sys_time);
-       /* Ignore return code if sync clock is switched off. */
-       if (rc == -EOPNOTSUPP || rc == -EACCES)
-               rc = 0;
-
        if (ccw) {
                ccw->count = sizeof(struct DE_eckd_data);
                ccw->flags |= CCW_FLAG_SLI;
@@ -286,12 +287,12 @@ define_extent(struct ccw1 *ccw, struct DE_eckd_data *data, unsigned int trk,
        case DASD_ECKD_CCW_WRITE_KD_MT:
                data->mask.perm = 0x02;
                data->attributes.operation = private->attrib.operation;
-               rc = check_XRC(ccw, data, device);
+               rc = set_timestamp(ccw, data, device);
                break;
        case DASD_ECKD_CCW_WRITE_CKD:
        case DASD_ECKD_CCW_WRITE_CKD_MT:
                data->attributes.operation = DASD_BYPASS_CACHE;
-               rc = check_XRC(ccw, data, device);
+               rc = set_timestamp(ccw, data, device);
                break;
        case DASD_ECKD_CCW_ERASE:
        case DASD_ECKD_CCW_WRITE_HOME_ADDRESS:
@@ -299,7 +300,7 @@ define_extent(struct ccw1 *ccw, struct DE_eckd_data *data, unsigned int trk,
                data->mask.perm = 0x3;
                data->mask.auth = 0x1;
                data->attributes.operation = DASD_BYPASS_CACHE;
-               rc = check_XRC(ccw, data, device);
+               rc = set_timestamp(ccw, data, device);
                break;
        case DASD_ECKD_CCW_WRITE_FULL_TRACK:
                data->mask.perm = 0x03;
@@ -310,7 +311,7 @@ define_extent(struct ccw1 *ccw, struct DE_eckd_data *data, unsigned int trk,
                data->mask.perm = 0x02;
                data->attributes.operation = private->attrib.operation;
                data->blk_size = blksize;
-               rc = check_XRC(ccw, data, device);
+               rc = set_timestamp(ccw, data, device);
                break;
        default:
                dev_err(&device->cdev->dev,
@@ -3440,7 +3441,7 @@ static int prepare_itcw(struct itcw *itcw,
                dedata->mask.perm = 0x02;
                dedata->attributes.operation = basepriv->attrib.operation;
                dedata->blk_size = blksize;
-               rc = check_XRC(NULL, dedata, basedev);
+               rc = set_timestamp(NULL, dedata, basedev);
                dedata->ga_extended |= 0x42;
                lredata->operation.orientation = 0x0;
                lredata->operation.operation = 0x3F;