Commit 34a6f80e authored by NeilBrown's avatar NeilBrown

md/raid5: use bio_list for the list of bios to return.

This will make it easier to splice two lists together which will
be needed in future patch.
Signed-off-by: default avatarNeilBrown <neilb@suse.com>
parent 95af587e
...@@ -223,18 +223,14 @@ static int raid6_idx_to_slot(int idx, struct stripe_head *sh, ...@@ -223,18 +223,14 @@ static int raid6_idx_to_slot(int idx, struct stripe_head *sh,
return slot; return slot;
} }
static void return_io(struct bio *return_bi) static void return_io(struct bio_list *return_bi)
{ {
struct bio *bi = return_bi; struct bio *bi;
while (bi) { while ((bi = bio_list_pop(return_bi)) != NULL) {
return_bi = bi->bi_next;
bi->bi_next = NULL;
bi->bi_iter.bi_size = 0; bi->bi_iter.bi_size = 0;
trace_block_bio_complete(bdev_get_queue(bi->bi_bdev), trace_block_bio_complete(bdev_get_queue(bi->bi_bdev),
bi, 0); bi, 0);
bio_endio(bi, 0); bio_endio(bi, 0);
bi = return_bi;
} }
} }
...@@ -1177,7 +1173,7 @@ async_copy_data(int frombio, struct bio *bio, struct page **page, ...@@ -1177,7 +1173,7 @@ async_copy_data(int frombio, struct bio *bio, struct page **page,
static void ops_complete_biofill(void *stripe_head_ref) static void ops_complete_biofill(void *stripe_head_ref)
{ {
struct stripe_head *sh = stripe_head_ref; struct stripe_head *sh = stripe_head_ref;
struct bio *return_bi = NULL; struct bio_list return_bi = BIO_EMPTY_LIST;
int i; int i;
pr_debug("%s: stripe %llu\n", __func__, pr_debug("%s: stripe %llu\n", __func__,
...@@ -1201,17 +1197,15 @@ static void ops_complete_biofill(void *stripe_head_ref) ...@@ -1201,17 +1197,15 @@ static void ops_complete_biofill(void *stripe_head_ref)
while (rbi && rbi->bi_iter.bi_sector < while (rbi && rbi->bi_iter.bi_sector <
dev->sector + STRIPE_SECTORS) { dev->sector + STRIPE_SECTORS) {
rbi2 = r5_next_bio(rbi, dev->sector); rbi2 = r5_next_bio(rbi, dev->sector);
if (!raid5_dec_bi_active_stripes(rbi)) { if (!raid5_dec_bi_active_stripes(rbi))
rbi->bi_next = return_bi; bio_list_add(&return_bi, rbi);
return_bi = rbi;
}
rbi = rbi2; rbi = rbi2;
} }
} }
} }
clear_bit(STRIPE_BIOFILL_RUN, &sh->state); clear_bit(STRIPE_BIOFILL_RUN, &sh->state);
return_io(return_bi); return_io(&return_bi);
set_bit(STRIPE_HANDLE, &sh->state); set_bit(STRIPE_HANDLE, &sh->state);
release_stripe(sh); release_stripe(sh);
...@@ -3071,7 +3065,7 @@ static void stripe_set_idx(sector_t stripe, struct r5conf *conf, int previous, ...@@ -3071,7 +3065,7 @@ static void stripe_set_idx(sector_t stripe, struct r5conf *conf, int previous,
static void static void
handle_failed_stripe(struct r5conf *conf, struct stripe_head *sh, handle_failed_stripe(struct r5conf *conf, struct stripe_head *sh,
struct stripe_head_state *s, int disks, struct stripe_head_state *s, int disks,
struct bio **return_bi) struct bio_list *return_bi)
{ {
int i; int i;
BUG_ON(sh->batch_head); BUG_ON(sh->batch_head);
...@@ -3115,8 +3109,7 @@ handle_failed_stripe(struct r5conf *conf, struct stripe_head *sh, ...@@ -3115,8 +3109,7 @@ handle_failed_stripe(struct r5conf *conf, struct stripe_head *sh,
clear_bit(BIO_UPTODATE, &bi->bi_flags); clear_bit(BIO_UPTODATE, &bi->bi_flags);
if (!raid5_dec_bi_active_stripes(bi)) { if (!raid5_dec_bi_active_stripes(bi)) {
md_write_end(conf->mddev); md_write_end(conf->mddev);
bi->bi_next = *return_bi; bio_list_add(return_bi, bi);
*return_bi = bi;
} }
bi = nextbi; bi = nextbi;
} }
...@@ -3139,8 +3132,7 @@ handle_failed_stripe(struct r5conf *conf, struct stripe_head *sh, ...@@ -3139,8 +3132,7 @@ handle_failed_stripe(struct r5conf *conf, struct stripe_head *sh,
clear_bit(BIO_UPTODATE, &bi->bi_flags); clear_bit(BIO_UPTODATE, &bi->bi_flags);
if (!raid5_dec_bi_active_stripes(bi)) { if (!raid5_dec_bi_active_stripes(bi)) {
md_write_end(conf->mddev); md_write_end(conf->mddev);
bi->bi_next = *return_bi; bio_list_add(return_bi, bi);
*return_bi = bi;
} }
bi = bi2; bi = bi2;
} }
...@@ -3162,10 +3154,8 @@ handle_failed_stripe(struct r5conf *conf, struct stripe_head *sh, ...@@ -3162,10 +3154,8 @@ handle_failed_stripe(struct r5conf *conf, struct stripe_head *sh,
struct bio *nextbi = struct bio *nextbi =
r5_next_bio(bi, sh->dev[i].sector); r5_next_bio(bi, sh->dev[i].sector);
clear_bit(BIO_UPTODATE, &bi->bi_flags); clear_bit(BIO_UPTODATE, &bi->bi_flags);
if (!raid5_dec_bi_active_stripes(bi)) { if (!raid5_dec_bi_active_stripes(bi))
bi->bi_next = *return_bi; bio_list_add(return_bi, bi);
*return_bi = bi;
}
bi = nextbi; bi = nextbi;
} }
} }
...@@ -3444,7 +3434,7 @@ static void break_stripe_batch_list(struct stripe_head *head_sh, ...@@ -3444,7 +3434,7 @@ static void break_stripe_batch_list(struct stripe_head *head_sh,
* never LOCKED, so we don't need to test 'failed' directly. * never LOCKED, so we don't need to test 'failed' directly.
*/ */
static void handle_stripe_clean_event(struct r5conf *conf, static void handle_stripe_clean_event(struct r5conf *conf,
struct stripe_head *sh, int disks, struct bio **return_bi) struct stripe_head *sh, int disks, struct bio_list *return_bi)
{ {
int i; int i;
struct r5dev *dev; struct r5dev *dev;
...@@ -3478,8 +3468,7 @@ static void handle_stripe_clean_event(struct r5conf *conf, ...@@ -3478,8 +3468,7 @@ static void handle_stripe_clean_event(struct r5conf *conf,
wbi2 = r5_next_bio(wbi, dev->sector); wbi2 = r5_next_bio(wbi, dev->sector);
if (!raid5_dec_bi_active_stripes(wbi)) { if (!raid5_dec_bi_active_stripes(wbi)) {
md_write_end(conf->mddev); md_write_end(conf->mddev);
wbi->bi_next = *return_bi; bio_list_add(return_bi, wbi);
*return_bi = wbi;
} }
wbi = wbi2; wbi = wbi2;
} }
...@@ -4612,7 +4601,7 @@ static void handle_stripe(struct stripe_head *sh) ...@@ -4612,7 +4601,7 @@ static void handle_stripe(struct stripe_head *sh)
md_wakeup_thread(conf->mddev->thread); md_wakeup_thread(conf->mddev->thread);
} }
return_io(s.return_bi); return_io(&s.return_bi);
clear_bit_unlock(STRIPE_ACTIVE, &sh->state); clear_bit_unlock(STRIPE_ACTIVE, &sh->state);
} }
......
...@@ -265,7 +265,7 @@ struct stripe_head_state { ...@@ -265,7 +265,7 @@ struct stripe_head_state {
int dec_preread_active; int dec_preread_active;
unsigned long ops_request; unsigned long ops_request;
struct bio *return_bi; struct bio_list return_bi;
struct md_rdev *blocked_rdev; struct md_rdev *blocked_rdev;
int handle_bad_blocks; int handle_bad_blocks;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment