]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blame - src/patches/suse-2.6.27.25/patches.fixes/0010-md-raid5-change-raid5_compute_sector-and-stripe_to_p.patch
Changed checkfs to auto reboot after correctable fsck fixes.
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.25 / patches.fixes / 0010-md-raid5-change-raid5_compute_sector-and-stripe_to_p.patch
CommitLineData
00e5a55c
BS
1From 112bf8970dbdfc00bd4667da5996e57c2ce58066 Mon Sep 17 00:00:00 2001
2From: NeilBrown <neilb@suse.de>
3Date: Tue, 31 Mar 2009 14:39:38 +1100
4Subject: [PATCH] md/raid5: change raid5_compute_sector and stripe_to_pdidx to take a 'previous' argument
5
6This similar to the recent change to get_active_stripe.
7There is no functional change, just come rearrangement to make
8future patches cleaner.
9
10Signed-off-by: NeilBrown <neilb@suse.de>
11---
12 drivers/md/raid5.c | 78 +++++++++++++++++++++++------------------------------
13 1 file changed, 34 insertions(+), 44 deletions(-)
14
15--- linux-2.6.27-SLE11_BRANCH.orig/drivers/md/raid5.c
16+++ linux-2.6.27-SLE11_BRANCH/drivers/md/raid5.c
17@@ -276,7 +276,7 @@ static int grow_buffers(struct stripe_he
18 }
19
20 static void raid5_build_block (struct stripe_head *sh, int i);
21-static int stripe_to_pdidx(sector_t stripe, raid5_conf_t *conf, int disks);
22+static int stripe_to_pdidx(sector_t stripe, raid5_conf_t *conf, int previous);
23
24 static void init_stripe(struct stripe_head *sh, sector_t sector, int previous)
25 {
26@@ -295,7 +295,7 @@ static void init_stripe(struct stripe_he
27
28 sh->disks = previous ? conf->previous_raid_disks : conf->raid_disks;
29 sh->sector = sector;
30- sh->pd_idx = stripe_to_pdidx(sector, conf, sh->disks);
31+ sh->pd_idx = stripe_to_pdidx(sector, conf, previous);
32 sh->state = 0;
33
34
35@@ -1235,15 +1235,18 @@ static void error(mddev_t *mddev, mdk_rd
36 * Input: a 'big' sector number,
37 * Output: index of the data and parity disk, and the sector # in them.
38 */
39-static sector_t raid5_compute_sector(sector_t r_sector, unsigned int raid_disks,
40- unsigned int data_disks, unsigned int * dd_idx,
41- unsigned int * pd_idx, raid5_conf_t *conf)
42+static sector_t raid5_compute_sector(raid5_conf_t *conf, sector_t r_sector,
43+ int previous,
44+ int *dd_idx, int *pd_idx)
45 {
46 long stripe;
47 unsigned long chunk_number;
48 unsigned int chunk_offset;
49 sector_t new_sector;
50 int sectors_per_chunk = conf->chunk_size >> 9;
51+ int raid_disks = previous ? conf->previous_raid_disks
52+ : conf->raid_disks;
53+ int data_disks = raid_disks - conf->max_degraded;
54
55 /* First compute the information on this sector */
56
57@@ -1408,7 +1411,9 @@ static sector_t compute_blocknr(struct s
58 chunk_number = stripe * data_disks + i;
59 r_sector = (sector_t)chunk_number * sectors_per_chunk + chunk_offset;
60
61- check = raid5_compute_sector (r_sector, raid_disks, data_disks, &dummy1, &dummy2, conf);
62+ check = raid5_compute_sector (conf, r_sector,
63+ (raid_disks != conf->raid_disks),
64+ &dummy1, &dummy2);
65 if (check != sh->sector || dummy1 != dd_idx || dummy2 != sh->pd_idx) {
66 printk(KERN_ERR "compute_blocknr: map not correct\n");
67 return 0;
68@@ -1808,16 +1813,18 @@ static int page_is_zero(struct page *p)
69 memcmp(a, a+4, STRIPE_SIZE-4)==0);
70 }
71
72-static int stripe_to_pdidx(sector_t stripe, raid5_conf_t *conf, int disks)
73+static int stripe_to_pdidx(sector_t stripe, raid5_conf_t *conf, int previous)
74 {
75 int sectors_per_chunk = conf->chunk_size >> 9;
76 int pd_idx, dd_idx;
77 int chunk_offset = sector_div(stripe, sectors_per_chunk);
78+ int disks = previous ? conf->previous_raid_disks : conf->raid_disks;
79
80- raid5_compute_sector(stripe * (disks - conf->max_degraded)
81+ raid5_compute_sector(conf,
82+ stripe * (disks - conf->max_degraded)
83 *sectors_per_chunk + chunk_offset,
84- disks, disks - conf->max_degraded,
85- &dd_idx, &pd_idx, conf);
86+ previous,
87+ &dd_idx, &pd_idx);
88 return pd_idx;
89 }
90
91@@ -2480,10 +2487,8 @@ static void handle_stripe_expansion(raid
92 struct stripe_head *sh2;
93
94 sector_t bn = compute_blocknr(sh, i);
95- sector_t s = raid5_compute_sector(bn, conf->raid_disks,
96- conf->raid_disks -
97- conf->max_degraded, &dd_idx,
98- &pd_idx, conf);
99+ sector_t s = raid5_compute_sector(conf, bn, 0,
100+ &dd_idx, &pd_idx);
101 sh2 = get_active_stripe(conf, s, 0, 1);
102 if (sh2 == NULL)
103 /* so far only the early blocks of this stripe
104@@ -2770,8 +2775,7 @@ static bool handle_stripe5(struct stripe
105 !sh->reconstruct_state) {
106 /* Need to write out all blocks after computing parity */
107 sh->disks = conf->raid_disks;
108- sh->pd_idx = stripe_to_pdidx(sh->sector, conf,
109- conf->raid_disks);
110+ sh->pd_idx = stripe_to_pdidx(sh->sector, conf, 0);
111 schedule_reconstruction5(sh, &s, 1, 1);
112 } else if (s.expanded && !sh->reconstruct_state && s.locked == 0) {
113 clear_bit(STRIPE_EXPAND_READY, &sh->state);
114@@ -2989,8 +2993,7 @@ static bool handle_stripe6(struct stripe
115 if (s.expanded && test_bit(STRIPE_EXPANDING, &sh->state)) {
116 /* Need to write out all blocks after computing P&Q */
117 sh->disks = conf->raid_disks;
118- sh->pd_idx = stripe_to_pdidx(sh->sector, conf,
119- conf->raid_disks);
120+ sh->pd_idx = stripe_to_pdidx(sh->sector, conf, 0);
121 compute_parity6(sh, RECONSTRUCT_WRITE);
122 for (i = conf->raid_disks ; i-- ; ) {
123 set_bit(R5_LOCKED, &sh->dev[i].flags);
124@@ -3262,8 +3265,6 @@ static int chunk_aligned_read(struct req
125 {
126 mddev_t *mddev = q->queuedata;
127 raid5_conf_t *conf = mddev_to_conf(mddev);
128- const unsigned int raid_disks = conf->raid_disks;
129- const unsigned int data_disks = raid_disks - conf->max_degraded;
130 unsigned int dd_idx, pd_idx;
131 struct bio* align_bi;
132 mdk_rdev_t *rdev;
133@@ -3287,12 +3288,9 @@ static int chunk_aligned_read(struct req
134 /*
135 * compute position
136 */
137- align_bi->bi_sector = raid5_compute_sector(raid_bio->bi_sector,
138- raid_disks,
139- data_disks,
140- &dd_idx,
141- &pd_idx,
142- conf);
143+ align_bi->bi_sector = raid5_compute_sector(conf, raid_bio->bi_sector,
144+ 0,
145+ &dd_idx, &pd_idx);
146
147 rcu_read_lock();
148 rdev = rcu_dereference(conf->disks[dd_idx].rdev);
149@@ -3446,8 +3444,9 @@ static int make_request(struct request_q
150 }
151 data_disks = disks - conf->max_degraded;
152
153- new_sector = raid5_compute_sector(logical_sector, disks, data_disks,
154- &dd_idx, &pd_idx, conf);
155+ new_sector = raid5_compute_sector(conf, logical_sector,
156+ previous,
157+ &dd_idx, &pd_idx);
158 pr_debug("raid5: make_request, sector %llu logical %llu\n",
159 (unsigned long long)new_sector,
160 (unsigned long long)logical_sector);
161@@ -3624,14 +3623,12 @@ static sector_t reshape_request(mddev_t
162 * block on the destination stripes.
163 */
164 first_sector =
165- raid5_compute_sector(sector_nr*(new_data_disks),
166- raid_disks, data_disks,
167- &dd_idx, &pd_idx, conf);
168+ raid5_compute_sector(conf, sector_nr*(new_data_disks),
169+ 1, &dd_idx, &pd_idx);
170 last_sector =
171- raid5_compute_sector((sector_nr+conf->chunk_size/512)
172- *(new_data_disks) -1,
173- raid_disks, data_disks,
174- &dd_idx, &pd_idx, conf);
175+ raid5_compute_sector(conf, ((sector_nr+conf->chunk_size/512)
176+ *(new_data_disks) - 1),
177+ 1, &dd_idx, &pd_idx);
178 if (last_sector >= (mddev->size<<1))
179 last_sector = (mddev->size<<1)-1;
180 while (first_sector <= last_sector) {
181@@ -3668,8 +3665,6 @@ static inline sector_t sync_request(mdde
182 {
183 raid5_conf_t *conf = (raid5_conf_t *) mddev->private;
184 struct stripe_head *sh;
185- int pd_idx;
186- int raid_disks = conf->raid_disks;
187 sector_t max_sector = mddev->size << 1;
188 int sync_blocks;
189 int still_degraded = 0;
190@@ -3724,7 +3719,6 @@ static inline sector_t sync_request(mdde
191
192 bitmap_cond_end_sync(mddev->bitmap, sector_nr);
193
194- pd_idx = stripe_to_pdidx(sector_nr, conf, raid_disks);
195 sh = get_active_stripe(conf, sector_nr, 0, 1);
196 if (sh == NULL) {
197 sh = get_active_stripe(conf, sector_nr, 0, 0);
198@@ -3776,12 +3770,8 @@ static int retry_aligned_read(raid5_con
199 int handled = 0;
200
201 logical_sector = raid_bio->bi_sector & ~((sector_t)STRIPE_SECTORS-1);
202- sector = raid5_compute_sector( logical_sector,
203- conf->raid_disks,
204- conf->raid_disks - conf->max_degraded,
205- &dd_idx,
206- &pd_idx,
207- conf);
208+ sector = raid5_compute_sector(conf, logical_sector,
209+ 0, &dd_idx, &pd_idx);
210 last_sector = raid_bio->bi_sector + (raid_bio->bi_size>>9);
211
212 for (; logical_sector < last_sector;