]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blame - src/patches/suse-2.6.27.25/patches.arch/s390-07-04-dasd-failfast.patch
Revert "Move xen patchset to new version's subdir."
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.25 / patches.arch / s390-07-04-dasd-failfast.patch
CommitLineData
00e5a55c
BS
1From: Gerald Schaefer <geraldsc@de.ibm.com>
2Subject: dasd: Add 'failfast' device feature.
3References: 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
21Acked-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
31Index: 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
104Index: 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;
118Index: 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;
132Index: 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;
146Index: 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