]>
Commit | Line | Data |
---|---|---|
2cb7cef9 BS |
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 | @@ -3625,14 +3624,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 | @@ -3669,8 +3666,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 | @@ -3725,7 +3720,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 | @@ -3777,12 +3771,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; |