@@ -110,6 +110,24 @@ static void end_reshape(struct r10conf *conf);
110
110
#define raid10_log (md , fmt , args ...) \
111
111
do { if ((md)->queue) blk_add_trace_msg((md)->queue, "raid10 " fmt, ##args); } while (0)
112
112
113
+ /*
114
+ * 'strct resync_pages' stores actual pages used for doing the resync
115
+ * IO, and it is per-bio, so make .bi_private points to it.
116
+ */
117
+ static inline struct resync_pages * get_resync_pages (struct bio * bio )
118
+ {
119
+ return bio -> bi_private ;
120
+ }
121
+
122
+ /*
123
+ * for resync bio, r10bio pointer can be retrieved from the per-bio
124
+ * 'struct resync_pages'.
125
+ */
126
+ static inline struct r10bio * get_resync_r10bio (struct bio * bio )
127
+ {
128
+ return get_resync_pages (bio )-> raid_bio ;
129
+ }
130
+
113
131
static void * r10bio_pool_alloc (gfp_t gfp_flags , void * data )
114
132
{
115
133
struct r10conf * conf = data ;
@@ -140,11 +158,11 @@ static void r10bio_pool_free(void *r10_bio, void *data)
140
158
static void * r10buf_pool_alloc (gfp_t gfp_flags , void * data )
141
159
{
142
160
struct r10conf * conf = data ;
143
- struct page * page ;
144
161
struct r10bio * r10_bio ;
145
162
struct bio * bio ;
146
- int i , j ;
147
- int nalloc ;
163
+ int j ;
164
+ int nalloc , nalloc_rp ;
165
+ struct resync_pages * rps ;
148
166
149
167
r10_bio = r10bio_pool_alloc (gfp_flags , conf );
150
168
if (!r10_bio )
@@ -156,6 +174,15 @@ static void * r10buf_pool_alloc(gfp_t gfp_flags, void *data)
156
174
else
157
175
nalloc = 2 ; /* recovery */
158
176
177
+ /* allocate once for all bios */
178
+ if (!conf -> have_replacement )
179
+ nalloc_rp = nalloc ;
180
+ else
181
+ nalloc_rp = nalloc * 2 ;
182
+ rps = kmalloc (sizeof (struct resync_pages ) * nalloc_rp , gfp_flags );
183
+ if (!rps )
184
+ goto out_free_r10bio ;
185
+
159
186
/*
160
187
* Allocate bios.
161
188
*/
@@ -175,36 +202,40 @@ static void * r10buf_pool_alloc(gfp_t gfp_flags, void *data)
175
202
* Allocate RESYNC_PAGES data pages and attach them
176
203
* where needed.
177
204
*/
178
- for (j = 0 ; j < nalloc ; j ++ ) {
205
+ for (j = 0 ; j < nalloc ; j ++ ) {
179
206
struct bio * rbio = r10_bio -> devs [j ].repl_bio ;
207
+ struct resync_pages * rp , * rp_repl ;
208
+
209
+ rp = & rps [j ];
210
+ if (rbio )
211
+ rp_repl = & rps [nalloc + j ];
212
+
180
213
bio = r10_bio -> devs [j ].bio ;
181
- for (i = 0 ; i < RESYNC_PAGES ; i ++ ) {
182
- if (j > 0 && !test_bit (MD_RECOVERY_SYNC ,
183
- & conf -> mddev -> recovery )) {
184
- /* we can share bv_page's during recovery
185
- * and reshape */
186
- struct bio * rbio = r10_bio -> devs [0 ].bio ;
187
- page = rbio -> bi_io_vec [i ].bv_page ;
188
- get_page (page );
189
- } else
190
- page = alloc_page (gfp_flags );
191
- if (unlikely (!page ))
214
+
215
+ if (!j || test_bit (MD_RECOVERY_SYNC ,
216
+ & conf -> mddev -> recovery )) {
217
+ if (resync_alloc_pages (rp , gfp_flags ))
192
218
goto out_free_pages ;
219
+ } else {
220
+ memcpy (rp , & rps [0 ], sizeof (* rp ));
221
+ resync_get_all_pages (rp );
222
+ }
193
223
194
- bio -> bi_io_vec [i ].bv_page = page ;
195
- if (rbio )
196
- rbio -> bi_io_vec [i ].bv_page = page ;
224
+ rp -> idx = 0 ;
225
+ rp -> raid_bio = r10_bio ;
226
+ bio -> bi_private = rp ;
227
+ if (rbio ) {
228
+ memcpy (rp_repl , rp , sizeof (* rp ));
229
+ rbio -> bi_private = rp_repl ;
197
230
}
198
231
}
199
232
200
233
return r10_bio ;
201
234
202
235
out_free_pages :
203
- for ( ; i > 0 ; i -- )
204
- safe_put_page (bio -> bi_io_vec [i - 1 ].bv_page );
205
- while (j -- )
206
- for (i = 0 ; i < RESYNC_PAGES ; i ++ )
207
- safe_put_page (r10_bio -> devs [j ].bio -> bi_io_vec [i ].bv_page );
236
+ while (-- j >= 0 )
237
+ resync_free_pages (& rps [j * 2 ]);
238
+
208
239
j = 0 ;
209
240
out_free_bio :
210
241
for ( ; j < nalloc ; j ++ ) {
@@ -213,30 +244,34 @@ static void * r10buf_pool_alloc(gfp_t gfp_flags, void *data)
213
244
if (r10_bio -> devs [j ].repl_bio )
214
245
bio_put (r10_bio -> devs [j ].repl_bio );
215
246
}
247
+ kfree (rps );
248
+ out_free_r10bio :
216
249
r10bio_pool_free (r10_bio , conf );
217
250
return NULL ;
218
251
}
219
252
220
253
static void r10buf_pool_free (void * __r10_bio , void * data )
221
254
{
222
- int i ;
223
255
struct r10conf * conf = data ;
224
256
struct r10bio * r10bio = __r10_bio ;
225
257
int j ;
258
+ struct resync_pages * rp = NULL ;
226
259
227
- for (j = 0 ; j < conf -> copies ; j ++ ) {
260
+ for (j = conf -> copies ; j -- ; ) {
228
261
struct bio * bio = r10bio -> devs [j ].bio ;
229
- if (bio ) {
230
- for (i = 0 ; i < RESYNC_PAGES ; i ++ ) {
231
- safe_put_page (bio -> bi_io_vec [i ].bv_page );
232
- bio -> bi_io_vec [i ].bv_page = NULL ;
233
- }
234
- bio_put (bio );
235
- }
262
+
263
+ rp = get_resync_pages (bio );
264
+ resync_free_pages (rp );
265
+ bio_put (bio );
266
+
236
267
bio = r10bio -> devs [j ].repl_bio ;
237
268
if (bio )
238
269
bio_put (bio );
239
270
}
271
+
272
+ /* resync pages array stored in the 1st bio's .bi_private */
273
+ kfree (rp );
274
+
240
275
r10bio_pool_free (r10bio , conf );
241
276
}
242
277
@@ -1917,7 +1952,7 @@ static void __end_sync_read(struct r10bio *r10_bio, struct bio *bio, int d)
1917
1952
1918
1953
static void end_sync_read (struct bio * bio )
1919
1954
{
1920
- struct r10bio * r10_bio = bio -> bi_private ;
1955
+ struct r10bio * r10_bio = get_resync_r10bio ( bio ) ;
1921
1956
struct r10conf * conf = r10_bio -> mddev -> private ;
1922
1957
int d = find_bio_disk (conf , r10_bio , bio , NULL , NULL );
1923
1958
@@ -1926,6 +1961,7 @@ static void end_sync_read(struct bio *bio)
1926
1961
1927
1962
static void end_reshape_read (struct bio * bio )
1928
1963
{
1964
+ /* reshape read bio isn't allocated from r10buf_pool */
1929
1965
struct r10bio * r10_bio = bio -> bi_private ;
1930
1966
1931
1967
__end_sync_read (r10_bio , bio , r10_bio -> read_slot );
@@ -1960,7 +1996,7 @@ static void end_sync_request(struct r10bio *r10_bio)
1960
1996
1961
1997
static void end_sync_write (struct bio * bio )
1962
1998
{
1963
- struct r10bio * r10_bio = bio -> bi_private ;
1999
+ struct r10bio * r10_bio = get_resync_r10bio ( bio ) ;
1964
2000
struct mddev * mddev = r10_bio -> mddev ;
1965
2001
struct r10conf * conf = mddev -> private ;
1966
2002
int d ;
@@ -2040,6 +2076,7 @@ static void sync_request_write(struct mddev *mddev, struct r10bio *r10_bio)
2040
2076
for (i = 0 ; i < conf -> copies ; i ++ ) {
2041
2077
int j , d ;
2042
2078
struct md_rdev * rdev ;
2079
+ struct resync_pages * rp ;
2043
2080
2044
2081
tbio = r10_bio -> devs [i ].bio ;
2045
2082
@@ -2081,11 +2118,13 @@ static void sync_request_write(struct mddev *mddev, struct r10bio *r10_bio)
2081
2118
* First we need to fixup bv_offset, bv_len and
2082
2119
* bi_vecs, as the read request might have corrupted these
2083
2120
*/
2121
+ rp = get_resync_pages (tbio );
2084
2122
bio_reset (tbio );
2085
2123
2086
2124
tbio -> bi_vcnt = vcnt ;
2087
2125
tbio -> bi_iter .bi_size = fbio -> bi_iter .bi_size ;
2088
- tbio -> bi_private = r10_bio ;
2126
+ rp -> raid_bio = r10_bio ;
2127
+ tbio -> bi_private = rp ;
2089
2128
tbio -> bi_iter .bi_sector = r10_bio -> devs [i ].addr ;
2090
2129
tbio -> bi_end_io = end_sync_write ;
2091
2130
bio_set_op_attrs (tbio , REQ_OP_WRITE , 0 );
@@ -3149,10 +3188,8 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr,
3149
3188
}
3150
3189
}
3151
3190
bio = r10_bio -> devs [0 ].bio ;
3152
- bio_reset (bio );
3153
3191
bio -> bi_next = biolist ;
3154
3192
biolist = bio ;
3155
- bio -> bi_private = r10_bio ;
3156
3193
bio -> bi_end_io = end_sync_read ;
3157
3194
bio_set_op_attrs (bio , REQ_OP_READ , 0 );
3158
3195
if (test_bit (FailFast , & rdev -> flags ))
@@ -3176,10 +3213,8 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr,
3176
3213
3177
3214
if (!test_bit (In_sync , & mrdev -> flags )) {
3178
3215
bio = r10_bio -> devs [1 ].bio ;
3179
- bio_reset (bio );
3180
3216
bio -> bi_next = biolist ;
3181
3217
biolist = bio ;
3182
- bio -> bi_private = r10_bio ;
3183
3218
bio -> bi_end_io = end_sync_write ;
3184
3219
bio_set_op_attrs (bio , REQ_OP_WRITE , 0 );
3185
3220
bio -> bi_iter .bi_sector = to_addr
@@ -3204,10 +3239,8 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr,
3204
3239
if (mreplace == NULL || bio == NULL ||
3205
3240
test_bit (Faulty , & mreplace -> flags ))
3206
3241
break ;
3207
- bio_reset (bio );
3208
3242
bio -> bi_next = biolist ;
3209
3243
biolist = bio ;
3210
- bio -> bi_private = r10_bio ;
3211
3244
bio -> bi_end_io = end_sync_write ;
3212
3245
bio_set_op_attrs (bio , REQ_OP_WRITE , 0 );
3213
3246
bio -> bi_iter .bi_sector = to_addr +
@@ -3329,7 +3362,6 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr,
3329
3362
r10_bio -> devs [i ].repl_bio -> bi_end_io = NULL ;
3330
3363
3331
3364
bio = r10_bio -> devs [i ].bio ;
3332
- bio_reset (bio );
3333
3365
bio -> bi_error = - EIO ;
3334
3366
rcu_read_lock ();
3335
3367
rdev = rcu_dereference (conf -> mirrors [d ].rdev );
@@ -3354,7 +3386,6 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr,
3354
3386
atomic_inc (& r10_bio -> remaining );
3355
3387
bio -> bi_next = biolist ;
3356
3388
biolist = bio ;
3357
- bio -> bi_private = r10_bio ;
3358
3389
bio -> bi_end_io = end_sync_read ;
3359
3390
bio_set_op_attrs (bio , REQ_OP_READ , 0 );
3360
3391
if (test_bit (FailFast , & conf -> mirrors [d ].rdev -> flags ))
@@ -3373,13 +3404,11 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr,
3373
3404
3374
3405
/* Need to set up for writing to the replacement */
3375
3406
bio = r10_bio -> devs [i ].repl_bio ;
3376
- bio_reset (bio );
3377
3407
bio -> bi_error = - EIO ;
3378
3408
3379
3409
sector = r10_bio -> devs [i ].addr ;
3380
3410
bio -> bi_next = biolist ;
3381
3411
biolist = bio ;
3382
- bio -> bi_private = r10_bio ;
3383
3412
bio -> bi_end_io = end_sync_write ;
3384
3413
bio_set_op_attrs (bio , REQ_OP_WRITE , 0 );
3385
3414
if (test_bit (FailFast , & conf -> mirrors [d ].rdev -> flags ))
@@ -3418,7 +3447,8 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr,
3418
3447
if (len == 0 )
3419
3448
break ;
3420
3449
for (bio = biolist ; bio ; bio = bio -> bi_next ) {
3421
- page = bio -> bi_io_vec [bio -> bi_vcnt ].bv_page ;
3450
+ struct resync_pages * rp = get_resync_pages (bio );
3451
+ page = resync_fetch_page (rp , rp -> idx ++ );
3422
3452
/*
3423
3453
* won't fail because the vec table is big enough
3424
3454
* to hold all these pages
@@ -3427,15 +3457,15 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr,
3427
3457
}
3428
3458
nr_sectors += len >>9 ;
3429
3459
sector_nr += len >>9 ;
3430
- } while (biolist -> bi_vcnt < RESYNC_PAGES );
3460
+ } while (get_resync_pages ( biolist ) -> idx < RESYNC_PAGES );
3431
3461
r10_bio -> sectors = nr_sectors ;
3432
3462
3433
3463
while (biolist ) {
3434
3464
bio = biolist ;
3435
3465
biolist = biolist -> bi_next ;
3436
3466
3437
3467
bio -> bi_next = NULL ;
3438
- r10_bio = bio -> bi_private ;
3468
+ r10_bio = get_resync_r10bio ( bio ) ;
3439
3469
r10_bio -> sectors = nr_sectors ;
3440
3470
3441
3471
if (bio -> bi_end_io == end_sync_read ) {
@@ -4326,6 +4356,7 @@ static sector_t reshape_request(struct mddev *mddev, sector_t sector_nr,
4326
4356
struct bio * blist ;
4327
4357
struct bio * bio , * read_bio ;
4328
4358
int sectors_done = 0 ;
4359
+ struct page * * pages ;
4329
4360
4330
4361
if (sector_nr == 0 ) {
4331
4362
/* If restarting in the middle, skip the initial sectors */
@@ -4476,11 +4507,9 @@ static sector_t reshape_request(struct mddev *mddev, sector_t sector_nr,
4476
4507
if (!rdev2 || test_bit (Faulty , & rdev2 -> flags ))
4477
4508
continue ;
4478
4509
4479
- bio_reset (b );
4480
4510
b -> bi_bdev = rdev2 -> bdev ;
4481
4511
b -> bi_iter .bi_sector = r10_bio -> devs [s /2 ].addr +
4482
4512
rdev2 -> new_data_offset ;
4483
- b -> bi_private = r10_bio ;
4484
4513
b -> bi_end_io = end_reshape_write ;
4485
4514
bio_set_op_attrs (b , REQ_OP_WRITE , 0 );
4486
4515
b -> bi_next = blist ;
@@ -4490,8 +4519,9 @@ static sector_t reshape_request(struct mddev *mddev, sector_t sector_nr,
4490
4519
/* Now add as many pages as possible to all of these bios. */
4491
4520
4492
4521
nr_sectors = 0 ;
4522
+ pages = get_resync_pages (r10_bio -> devs [0 ].bio )-> pages ;
4493
4523
for (s = 0 ; s < max_sectors ; s += PAGE_SIZE >> 9 ) {
4494
- struct page * page = r10_bio -> devs [ 0 ]. bio -> bi_io_vec [ s / (PAGE_SIZE >> 9 )]. bv_page ;
4524
+ struct page * page = pages [ s / (PAGE_SIZE >> 9 )];
4495
4525
int len = (max_sectors - s ) << 9 ;
4496
4526
if (len > PAGE_SIZE )
4497
4527
len = PAGE_SIZE ;
@@ -4675,7 +4705,7 @@ static int handle_reshape_read_error(struct mddev *mddev,
4675
4705
4676
4706
static void end_reshape_write (struct bio * bio )
4677
4707
{
4678
- struct r10bio * r10_bio = bio -> bi_private ;
4708
+ struct r10bio * r10_bio = get_resync_r10bio ( bio ) ;
4679
4709
struct mddev * mddev = r10_bio -> mddev ;
4680
4710
struct r10conf * conf = mddev -> private ;
4681
4711
int d ;
0 commit comments