]>
Commit | Line | Data |
---|---|---|
2cb7cef9 BS |
1 | From: Gerald Schaefer <geraldsc@de.ibm.com> |
2 | Subject: dasd: Add 'failfast' device feature. | |
3 | References: bnc#464466,LTC#43066 | |
4 | ||
5 | Symptom: md-raid1 cannot operate and manage md array, when no path is | |
6 | operational. | |
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 | |
19 | set. | |
20 | ||
21 | Acked-by: John Jolly <jjolly@suse.de> | |
22 | ||
23 | --- | |
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(-) | |
30 | ||
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; | |
41 | else { | |
42 | MESSAGE(KERN_WARNING, | |
43 | "unsupported feature: %*s, " | |
44 | @@ -666,6 +668,51 @@ dasd_device_from_cdev(struct ccw_device | |
45 | */ | |
46 | ||
47 | /* | |
48 | + * failfast controls the behaviour, if no path is available | |
49 | + */ | |
50 | +static ssize_t dasd_ff_show(struct device *dev, struct device_attribute *attr, | |
51 | + char *buf) | |
52 | +{ | |
53 | + struct dasd_devmap *devmap; | |
54 | + int ff_flag; | |
55 | + | |
56 | + devmap = dasd_find_busid(dev->bus_id); | |
57 | + if (!IS_ERR(devmap)) | |
58 | + ff_flag = (devmap->features & DASD_FEATURE_FAILFAST) != 0; | |
59 | + else | |
60 | + ff_flag = (DASD_FEATURE_DEFAULT & DASD_FEATURE_FAILFAST) != 0; | |
61 | + return snprintf(buf, PAGE_SIZE, ff_flag ? "1\n" : "0\n"); | |
62 | +} | |
63 | + | |
64 | +static ssize_t dasd_ff_store(struct device *dev, struct device_attribute *attr, | |
65 | + const char *buf, size_t count) | |
66 | +{ | |
67 | + struct dasd_devmap *devmap; | |
68 | + int val; | |
69 | + char *endp; | |
70 | + | |
71 | + devmap = dasd_devmap_from_cdev(to_ccwdev(dev)); | |
72 | + if (IS_ERR(devmap)) | |
73 | + return PTR_ERR(devmap); | |
74 | + | |
75 | + val = simple_strtoul(buf, &endp, 0); | |
76 | + if (((endp + 1) < (buf + count)) || (val > 1)) | |
77 | + return -EINVAL; | |
78 | + | |
79 | + spin_lock(&dasd_devmap_lock); | |
80 | + if (val) | |
81 | + devmap->features |= DASD_FEATURE_FAILFAST; | |
82 | + else | |
83 | + devmap->features &= ~DASD_FEATURE_FAILFAST; | |
84 | + if (devmap->device) | |
85 | + devmap->device->features = devmap->features; | |
86 | + spin_unlock(&dasd_devmap_lock); | |
87 | + return count; | |
88 | +} | |
89 | + | |
90 | +static DEVICE_ATTR(failfast, 0644, dasd_ff_show, dasd_ff_store); | |
91 | + | |
92 | +/* | |
93 | * readonly controls the readonly status of a dasd | |
94 | */ | |
95 | static ssize_t | |
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, | |
101 | NULL, | |
102 | }; | |
103 | ||
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 | |
109 | } | |
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 | |
123 | recid++; | |
124 | } | |
125 | } | |
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 | |
137 | recid++; | |
138 | } | |
139 | } | |
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 | |
155 | ||
156 | #define DASD_PARTN_BITS 2 | |
157 |