]> git.ipfire.org Git - ipfire-2.x.git/blame - src/patches/suse-2.6.27.39/patches.fixes/0015-md-add-size-as-a-personality-method.patch
Fix oinkmaster patch.
[ipfire-2.x.git] / src / patches / suse-2.6.27.39 / patches.fixes / 0015-md-add-size-as-a-personality-method.patch
CommitLineData
2cb7cef9
BS
1From 80c3a6ce4ba4470379b9e6a4d9bcd9d2ee26ae03 Mon Sep 17 00:00:00 2001
2From: Dan Williams <dan.j.williams@intel.com>
3Date: Tue, 17 Mar 2009 18:10:40 -0700
4Subject: [PATCH] md: add 'size' as a personality method
5
6In preparation for giving userspace control over ->array_sectors we need
7to be able to retrieve the 'default' size, and the 'anticipated' size
8when a reshape is requested. For personalities that do not reshape emit
9a warning if anything but the default size is requested.
10
11In the raid5 case we need to update ->previous_raid_disks to make the
12new 'default' size available.
13
14Reviewed-by: Andre Noll <maan@systemlinux.org>
15Signed-off-by: Dan Williams <dan.j.williams@intel.com>
16Acked-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);