]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blob - src/patches/suse-2.6.27.25/patches.fixes/0010-md-raid5-change-raid5_compute_sector-and-stripe_to_p.patch
Updated xen patches taken from suse.
[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
1 From 112bf8970dbdfc00bd4667da5996e57c2ce58066 Mon Sep 17 00:00:00 2001
2 From: NeilBrown <neilb@suse.de>
3 Date: Tue, 31 Mar 2009 14:39:38 +1100
4 Subject: [PATCH] md/raid5: change raid5_compute_sector and stripe_to_pdidx to take a 'previous' argument
5
6 This similar to the recent change to get_active_stripe.
7 There is no functional change, just come rearrangement to make
8 future patches cleaner.
9
10 Signed-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;