1 From: Gerald Schaefer <geraldsc@de.ibm.com>
2 Subject: dasd: Add 'failfast' device feature.
3 References: bnc#464466,LTC#43066
5 Symptom: md-raid1 cannot operate and manage md array, when no path is
7 Problem: md-raid1 does not set the FAILFAST flag, because that would
8 break SCSI functionality due to ambiguous meaning of the flag.
9 Solution: Add a new dasd feature 'failfast' which controls the dasd
10 driver handling of requests and can be configured per device
11 independently of the setting of the FAILFAST flag per request.
12 If the 'failfast' feature is enabled for a device, the dasd
13 driver will handle requests as if the request had the FAILFAST
14 flag set, particularly posting I/O failure, when no path is
15 operational to the device.
16 The 'failfast' feature can be configured via the new sysfs
17 attribute 'failfast' or via the 'dasd=' parameter, just like
18 any other feature. By default, the 'failfast' feature is not
21 Acked-by: John Jolly <jjolly@suse.de>
24 arch/s390/include/asm/dasd.h | 1
25 drivers/s390/block/dasd_devmap.c | 48 +++++++++++++++++++++++++++++++++++++++
26 drivers/s390/block/dasd_diag.c | 3 +-
27 drivers/s390/block/dasd_eckd.c | 3 +-
28 drivers/s390/block/dasd_fba.c | 3 +-
29 5 files changed, 55 insertions(+), 3 deletions(-)
31 Index: linux-sles11/drivers/s390/block/dasd_devmap.c
32 ===================================================================
33 --- linux-sles11.orig/drivers/s390/block/dasd_devmap.c
34 +++ linux-sles11/drivers/s390/block/dasd_devmap.c
35 @@ -205,6 +205,8 @@ dasd_feature_list(char *str, char **endp
36 features |= DASD_FEATURE_USEDIAG;
37 else if (len == 6 && !strncmp(str, "erplog", 6))
38 features |= DASD_FEATURE_ERPLOG;
39 + else if (len == 8 && !strncmp(str, "failfast", 8))
40 + features |= DASD_FEATURE_FAILFAST;
43 "unsupported feature: %*s, "
44 @@ -666,6 +668,51 @@ dasd_device_from_cdev(struct ccw_device
48 + * failfast controls the behaviour, if no path is available
50 +static ssize_t dasd_ff_show(struct device *dev, struct device_attribute *attr,
53 + struct dasd_devmap *devmap;
56 + devmap = dasd_find_busid(dev->bus_id);
57 + if (!IS_ERR(devmap))
58 + ff_flag = (devmap->features & DASD_FEATURE_FAILFAST) != 0;
60 + ff_flag = (DASD_FEATURE_DEFAULT & DASD_FEATURE_FAILFAST) != 0;
61 + return snprintf(buf, PAGE_SIZE, ff_flag ? "1\n" : "0\n");
64 +static ssize_t dasd_ff_store(struct device *dev, struct device_attribute *attr,
65 + const char *buf, size_t count)
67 + struct dasd_devmap *devmap;
71 + devmap = dasd_devmap_from_cdev(to_ccwdev(dev));
73 + return PTR_ERR(devmap);
75 + val = simple_strtoul(buf, &endp, 0);
76 + if (((endp + 1) < (buf + count)) || (val > 1))
79 + spin_lock(&dasd_devmap_lock);
81 + devmap->features |= DASD_FEATURE_FAILFAST;
83 + devmap->features &= ~DASD_FEATURE_FAILFAST;
85 + devmap->device->features = devmap->features;
86 + spin_unlock(&dasd_devmap_lock);
90 +static DEVICE_ATTR(failfast, 0644, dasd_ff_show, dasd_ff_store);
93 * readonly controls the readonly status of a dasd
96 @@ -1019,6 +1066,7 @@ static struct attribute * dasd_attrs[] =
97 &dev_attr_use_diag.attr,
98 &dev_attr_eer_enabled.attr,
99 &dev_attr_erplog.attr,
100 + &dev_attr_failfast.attr,
104 Index: linux-sles11/drivers/s390/block/dasd_diag.c
105 ===================================================================
106 --- linux-sles11.orig/drivers/s390/block/dasd_diag.c
107 +++ linux-sles11/drivers/s390/block/dasd_diag.c
108 @@ -544,7 +544,8 @@ static struct dasd_ccw_req *dasd_diag_bu
110 cqr->retries = DIAG_MAX_RETRIES;
111 cqr->buildclk = get_clock();
112 - if (blk_noretry_request(req))
113 + if (blk_noretry_request(req) ||
114 + block->base->features & DASD_FEATURE_FAILFAST)
115 set_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags);
116 cqr->startdev = memdev;
117 cqr->memdev = memdev;
118 Index: linux-sles11/drivers/s390/block/dasd_eckd.c
119 ===================================================================
120 --- linux-sles11.orig/drivers/s390/block/dasd_eckd.c
121 +++ linux-sles11/drivers/s390/block/dasd_eckd.c
122 @@ -1700,7 +1700,8 @@ static struct dasd_ccw_req *dasd_eckd_bu
126 - if (blk_noretry_request(req))
127 + if (blk_noretry_request(req) ||
128 + block->base->features & DASD_FEATURE_FAILFAST)
129 set_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags);
130 cqr->startdev = startdev;
131 cqr->memdev = startdev;
132 Index: linux-sles11/drivers/s390/block/dasd_fba.c
133 ===================================================================
134 --- linux-sles11.orig/drivers/s390/block/dasd_fba.c
135 +++ linux-sles11/drivers/s390/block/dasd_fba.c
136 @@ -355,7 +355,8 @@ static struct dasd_ccw_req *dasd_fba_bui
140 - if (blk_noretry_request(req))
141 + if (blk_noretry_request(req) ||
142 + block->base->features & DASD_FEATURE_FAILFAST)
143 set_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags);
144 cqr->startdev = memdev;
145 cqr->memdev = memdev;
146 Index: linux-sles11/arch/s390/include/asm/dasd.h
147 ===================================================================
148 --- linux-sles11.orig/arch/s390/include/asm/dasd.h
149 +++ linux-sles11/arch/s390/include/asm/dasd.h
150 @@ -78,6 +78,7 @@ typedef struct dasd_information2_t {
151 #define DASD_FEATURE_USEDIAG 0x02
152 #define DASD_FEATURE_INITIAL_ONLINE 0x04
153 #define DASD_FEATURE_ERPLOG 0x08
154 +#define DASD_FEATURE_FAILFAST 0x10
156 #define DASD_PARTN_BITS 2