]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blob - src/patches/suse-2.6.27.25/patches.fixes/0015-md-add-size-as-a-personality-method.patch
Reenabled linux-xen and xen-image build
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.25 / patches.fixes / 0015-md-add-size-as-a-personality-method.patch
1 From 80c3a6ce4ba4470379b9e6a4d9bcd9d2ee26ae03 Mon Sep 17 00:00:00 2001
2 From: Dan Williams <dan.j.williams@intel.com>
3 Date: Tue, 17 Mar 2009 18:10:40 -0700
4 Subject: [PATCH] md: add 'size' as a personality method
5
6 In preparation for giving userspace control over ->array_sectors we need
7 to be able to retrieve the 'default' size, and the 'anticipated' size
8 when a reshape is requested. For personalities that do not reshape emit
9 a warning if anything but the default size is requested.
10
11 In the raid5 case we need to update ->previous_raid_disks to make the
12 new 'default' size available.
13
14 Reviewed-by: Andre Noll <maan@systemlinux.org>
15 Signed-off-by: Dan Williams <dan.j.williams@intel.com>
16 Acked-by: NeilBrown <neilb@suse.de>
17 ---
18 drivers/md/faulty.c | 12 ++++++++++++
19 drivers/md/linear.c | 15 +++++++++++++--
20 drivers/md/multipath.c | 9 +++++++++
21 drivers/md/raid0.c | 21 ++++++++++++++++-----
22 drivers/md/raid1.c | 11 ++++++++++-
23 drivers/md/raid10.c | 24 ++++++++++++++++++++++--
24 drivers/md/raid5.c | 35 +++++++++++++++++++++++++----------
25 include/linux/raid/md_k.h | 1 +
26 8 files changed, 108 insertions(+), 20 deletions(-)
27
28 --- linux-2.6.27-SLE11_BRANCH.orig/drivers/md/faulty.c
29 +++ linux-2.6.27-SLE11_BRANCH/drivers/md/faulty.c
30 @@ -280,6 +280,17 @@ static int reconfig(mddev_t *mddev, int
31 return 0;
32 }
33
34 +static sector_t faulty_size(mddev_t *mddev, sector_t sectors, int raid_disks)
35 +{
36 + WARN_ONCE(raid_disks,
37 + "%s does not support generic reshape\n", __func__);
38 +
39 + if (sectors == 0)
40 + return mddev->size*2;
41 +
42 + return sectors;
43 +}
44 +
45 static int run(mddev_t *mddev)
46 {
47 mdk_rdev_t *rdev;
48 @@ -324,6 +335,7 @@ static struct mdk_personality faulty_per
49 .stop = stop,
50 .status = status,
51 .reconfig = reconfig,
52 + .size = faulty_size,
53 };
54
55 static int __init raid_init(void)
56 --- linux-2.6.27-SLE11_BRANCH.orig/drivers/md/linear.c
57 +++ linux-2.6.27-SLE11_BRANCH/drivers/md/linear.c
58 @@ -106,6 +106,16 @@ static int linear_congested(void *data,
59 return ret;
60 }
61
62 +static sector_t linear_size(mddev_t *mddev, sector_t sectors, int raid_disks)
63 +{
64 + linear_conf_t *conf = mddev_to_conf(mddev);
65 +
66 + WARN_ONCE(sectors || raid_disks,
67 + "%s does not support generic reshape\n", __func__);
68 +
69 + return conf->array_sectors;
70 +}
71 +
72 static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks)
73 {
74 linear_conf_t *conf;
75 @@ -260,7 +270,7 @@ static int linear_run (mddev_t *mddev)
76 if (!conf)
77 return 1;
78 mddev->private = conf;
79 - mddev->array_sectors = conf->array_sectors;
80 + mddev->array_sectors = linear_size(mddev, 0, 0);
81
82 blk_queue_merge_bvec(mddev->queue, linear_mergeable_bvec);
83 mddev->queue->unplug_fn = linear_unplug;
84 @@ -294,7 +304,7 @@ static int linear_add(mddev_t *mddev, md
85 newconf->prev = mddev_to_conf(mddev);
86 mddev->private = newconf;
87 mddev->raid_disks++;
88 - mddev->array_sectors = newconf->array_sectors;
89 + mddev->array_sectors = linear_size(mddev, 0, 0);
90 set_capacity(mddev->gendisk, mddev->array_sectors);
91 return 0;
92 }
93 @@ -407,6 +417,7 @@ static struct mdk_personality linear_per
94 .stop = linear_stop,
95 .status = linear_status,
96 .hot_add_disk = linear_add,
97 + .size = linear_size,
98 };
99
100 static int __init linear_init (void)
101 --- linux-2.6.27-SLE11_BRANCH.orig/drivers/md/multipath.c
102 +++ linux-2.6.27-SLE11_BRANCH/drivers/md/multipath.c
103 @@ -407,6 +407,14 @@ static void multipathd (mddev_t *mddev)
104 spin_unlock_irqrestore(&conf->device_lock, flags);
105 }
106
107 +static sector_t multipath_size(mddev_t *mddev, sector_t sectors, int raid_disks)
108 +{
109 + WARN_ONCE(sectors || raid_disks,
110 + "%s does not support generic reshape\n", __func__);
111 +
112 + return mddev->size*2;
113 +}
114 +
115 static int multipath_run (mddev_t *mddev)
116 {
117 multipath_conf_t *conf;
118 @@ -549,6 +557,7 @@ static struct mdk_personality multipath_
119 .error_handler = multipath_error,
120 .hot_add_disk = multipath_add_disk,
121 .hot_remove_disk= multipath_remove_disk,
122 + .size = multipath_size,
123 };
124
125 static int __init multipath_init (void)
126 --- linux-2.6.27-SLE11_BRANCH.orig/drivers/md/raid0.c
127 +++ linux-2.6.27-SLE11_BRANCH/drivers/md/raid0.c
128 @@ -264,13 +264,25 @@ static int raid0_mergeable_bvec(struct r
129 return max;
130 }
131
132 +static sector_t raid0_size(mddev_t *mddev, sector_t sectors, int raid_disks)
133 +{
134 + sector_t array_sectors = 0;
135 + mdk_rdev_t *rdev;
136 +
137 + WARN_ONCE(sectors || raid_disks,
138 + "%s does not support generic reshape\n", __func__);
139 +
140 + list_for_each_entry(rdev, &mddev->disks, same_set)
141 + array_sectors += rdev->size*2;
142 +
143 + return array_sectors;
144 +}
145 +
146 static int raid0_run (mddev_t *mddev)
147 {
148 unsigned cur=0, i=0, nb_zone;
149 s64 size;
150 raid0_conf_t *conf;
151 - mdk_rdev_t *rdev;
152 - struct list_head *tmp;
153
154 if (mddev->chunk_size == 0) {
155 printk(KERN_ERR "md/raid0: non-zero chunk size required.\n");
156 @@ -295,9 +307,7 @@ static int raid0_run (mddev_t *mddev)
157 goto out_free_conf;
158
159 /* calculate array device size */
160 - mddev->array_sectors = 0;
161 - rdev_for_each(rdev, tmp, mddev)
162 - mddev->array_sectors += rdev->size * 2;
163 + mddev->array_sectors = raid0_size(mddev, 0, 0);
164
165 printk("raid0 : md_size is %llu blocks.\n",
166 (unsigned long long)mddev->array_sectors / 2);
167 @@ -512,6 +522,7 @@ static struct mdk_personality raid0_pers
168 .run = raid0_run,
169 .stop = raid0_stop,
170 .status = raid0_status,
171 + .size = raid0_size,
172 };
173
174 static int __init raid0_init (void)
175 --- linux-2.6.27-SLE11_BRANCH.orig/drivers/md/raid1.c
176 +++ linux-2.6.27-SLE11_BRANCH/drivers/md/raid1.c
177 @@ -1915,6 +1915,14 @@ static sector_t sync_request(mddev_t *md
178 return nr_sectors;
179 }
180
181 +static sector_t raid1_size(mddev_t *mddev, sector_t sectors, int raid_disks)
182 +{
183 + if (sectors)
184 + return sectors;
185 +
186 + return mddev->size*2;
187 +}
188 +
189 static int run(mddev_t *mddev)
190 {
191 conf_t *conf;
192 @@ -2107,7 +2115,7 @@ static int raid1_resize(mddev_t *mddev,
193 * any io in the removed space completes, but it hardly seems
194 * worth it.
195 */
196 - mddev->array_sectors = sectors;
197 + mddev->array_sectors = raid1_size(mddev, sectors, 0);
198 set_capacity(mddev->gendisk, mddev->array_sectors);
199 mddev->changed = 1;
200 if (mddev->array_sectors / 2 > mddev->size &&
201 @@ -2261,6 +2269,7 @@ static struct mdk_personality raid1_pers
202 .spare_active = raid1_spare_active,
203 .sync_request = sync_request,
204 .resize = raid1_resize,
205 + .size = raid1_size,
206 .check_reshape = raid1_reshape,
207 .quiesce = raid1_quiesce,
208 };
209 --- linux-2.6.27-SLE11_BRANCH.orig/drivers/md/raid10.c
210 +++ linux-2.6.27-SLE11_BRANCH/drivers/md/raid10.c
211 @@ -2015,6 +2015,25 @@ static sector_t sync_request(mddev_t *md
212 goto skipped;
213 }
214
215 +static sector_t
216 +raid10_size(mddev_t *mddev, sector_t sectors, int raid_disks)
217 +{
218 + sector_t size;
219 + conf_t *conf = mddev_to_conf(mddev);
220 +
221 + if (!raid_disks)
222 + raid_disks = mddev->raid_disks;
223 + if (!sectors)
224 + sectors = mddev->size*2;
225 +
226 + size = sectors >> conf->chunk_shift;
227 + sector_div(size, conf->far_copies);
228 + size = size * raid_disks;
229 + sector_div(size, conf->near_copies);
230 +
231 + return size << conf->chunk_shift;
232 +}
233 +
234 static int run(mddev_t *mddev)
235 {
236 conf_t *conf;
237 @@ -2167,8 +2186,8 @@ static int run(mddev_t *mddev)
238 /*
239 * Ok, everything is just fine now
240 */
241 - mddev->array_sectors = size << conf->chunk_shift;
242 - mddev->resync_max_sectors = size << conf->chunk_shift;
243 + mddev->array_sectors = raid10_size(mddev, 0, 0);
244 + mddev->resync_max_sectors = mddev->array_sectors;
245
246 mddev->queue->unplug_fn = raid10_unplug;
247 mddev->queue->backing_dev_info.congested_fn = raid10_congested;
248 @@ -2251,6 +2270,7 @@ static struct mdk_personality raid10_per
249 .spare_active = raid10_spare_active,
250 .sync_request = sync_request,
251 .quiesce = raid10_quiesce,
252 + .size = raid10_size,
253 };
254
255 static int __init raid_init(void)
256 --- linux-2.6.27-SLE11_BRANCH.orig/drivers/md/raid5.c
257 +++ linux-2.6.27-SLE11_BRANCH/drivers/md/raid5.c
258 @@ -4163,6 +4163,20 @@ static struct attribute_group raid5_attr
259 .attrs = raid5_attrs,
260 };
261
262 +static sector_t
263 +raid5_size(mddev_t *mddev, sector_t sectors, int raid_disks)
264 +{
265 + raid5_conf_t *conf = mddev_to_conf(mddev);
266 +
267 + if (!sectors)
268 + sectors = mddev->size*2;
269 + if (!raid_disks)
270 + raid_disks = conf->previous_raid_disks;
271 +
272 + sectors &= ~((sector_t)mddev->chunk_size/512 - 1);
273 + return sectors * (raid_disks - conf->max_degraded);
274 +}
275 +
276 static int run(mddev_t *mddev)
277 {
278 raid5_conf_t *conf;
279 @@ -4423,8 +4437,7 @@ static int run(mddev_t *mddev)
280 mddev->queue->backing_dev_info.congested_data = mddev;
281 mddev->queue->backing_dev_info.congested_fn = raid5_congested;
282
283 - mddev->array_sectors = 2 * mddev->size * (conf->previous_raid_disks -
284 - conf->max_degraded);
285 + mddev->array_sectors = raid5_size(mddev, 0, 0);
286
287 blk_queue_merge_bvec(mddev->queue, raid5_mergeable_bvec);
288
289 @@ -4644,11 +4657,8 @@ static int raid5_resize(mddev_t *mddev,
290 * any io in the removed space completes, but it hardly seems
291 * worth it.
292 */
293 - raid5_conf_t *conf = mddev_to_conf(mddev);
294 -
295 sectors &= ~((sector_t)mddev->chunk_size/512 - 1);
296 - mddev->array_sectors = sectors * (mddev->raid_disks
297 - - conf->max_degraded);
298 + mddev->array_sectors = raid5_size(mddev, sectors, mddev->raid_disks);
299 set_capacity(mddev->gendisk, mddev->array_sectors);
300 mddev->changed = 1;
301 if (sectors/2 > mddev->size && mddev->recovery_cp == MaxSector) {
302 @@ -4785,10 +4795,12 @@ static void end_reshape(raid5_conf_t *co
303 struct block_device *bdev;
304
305 if (!test_bit(MD_RECOVERY_INTR, &conf->mddev->recovery)) {
306 - conf->mddev->array_sectors = 2 * conf->mddev->size *
307 - (conf->raid_disks - conf->max_degraded);
308 - set_capacity(conf->mddev->gendisk, conf->mddev->array_sectors);
309 - conf->mddev->changed = 1;
310 + mddev_t *mddev = conf->mddev;
311 +
312 + mddev->array_sectors = raid5_size(mddev, 0, conf->raid_disks);
313 + set_capacity(mddev->gendisk, mddev->array_sectors);
314 + mddev->changed = 1;
315 + conf->previous_raid_disks = conf->raid_disks;
316
317 bdev = bdget_disk(conf->mddev->gendisk, 0);
318 if (bdev) {
319 @@ -4860,6 +4872,7 @@ static struct mdk_personality raid6_pers
320 .spare_active = raid5_spare_active,
321 .sync_request = sync_request,
322 .resize = raid5_resize,
323 + .size = raid5_size,
324 #ifdef CONFIG_MD_RAID5_RESHAPE
325 .check_reshape = raid5_check_reshape,
326 .start_reshape = raid5_start_reshape,
327 @@ -4881,6 +4894,7 @@ static struct mdk_personality raid5_pers
328 .spare_active = raid5_spare_active,
329 .sync_request = sync_request,
330 .resize = raid5_resize,
331 + .size = raid5_size,
332 #ifdef CONFIG_MD_RAID5_RESHAPE
333 .check_reshape = raid5_check_reshape,
334 .start_reshape = raid5_start_reshape,
335 @@ -4903,6 +4917,7 @@ static struct mdk_personality raid4_pers
336 .spare_active = raid5_spare_active,
337 .sync_request = sync_request,
338 .resize = raid5_resize,
339 + .size = raid5_size,
340 #ifdef CONFIG_MD_RAID5_RESHAPE
341 .check_reshape = raid5_check_reshape,
342 .start_reshape = raid5_start_reshape,
343 --- linux-2.6.27-SLE11_BRANCH.orig/include/linux/raid/md_k.h
344 +++ linux-2.6.27-SLE11_BRANCH/include/linux/raid/md_k.h
345 @@ -305,6 +305,7 @@ struct mdk_personality
346 int (*spare_active) (mddev_t *mddev);
347 sector_t (*sync_request)(mddev_t *mddev, sector_t sector_nr, int *skipped, int go_faster);
348 int (*resize) (mddev_t *mddev, sector_t sectors);
349 + sector_t (*size) (mddev_t *mddev, sector_t sectors, int raid_disks);
350 int (*check_reshape) (mddev_t *mddev);
351 int (*start_reshape) (mddev_t *mddev);
352 int (*reconfig) (mddev_t *mddev, int layout, int chunk_size);