Skip to content

Commit af50e20

Browse files
jankaraliu-song-6
authored andcommitted
md/raid0: Factor out helper for mapping and submitting a bio
Factor out helper function for mapping and submitting a bio out of raid0_make_request(). We will use it later for submitting both parts of a split bio. Signed-off-by: Jan Kara <[email protected]> Reviewed-by: Yu Kuai <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Song Liu <[email protected]>
1 parent 6b2460e commit af50e20

File tree

1 file changed

+40
-39
lines changed

1 file changed

+40
-39
lines changed

drivers/md/raid0.c

Lines changed: 40 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -545,68 +545,35 @@ static void raid0_handle_discard(struct mddev *mddev, struct bio *bio)
545545
bio_endio(bio);
546546
}
547547

548-
static bool raid0_make_request(struct mddev *mddev, struct bio *bio)
548+
static void raid0_map_submit_bio(struct mddev *mddev, struct bio *bio)
549549
{
550550
struct r0conf *conf = mddev->private;
551551
struct strip_zone *zone;
552552
struct md_rdev *tmp_dev;
553-
sector_t bio_sector;
554-
sector_t sector;
555-
sector_t orig_sector;
556-
unsigned chunk_sects;
557-
unsigned sectors;
558-
559-
if (unlikely(bio->bi_opf & REQ_PREFLUSH)
560-
&& md_flush_request(mddev, bio))
561-
return true;
562-
563-
if (unlikely((bio_op(bio) == REQ_OP_DISCARD))) {
564-
raid0_handle_discard(mddev, bio);
565-
return true;
566-
}
567-
568-
bio_sector = bio->bi_iter.bi_sector;
569-
sector = bio_sector;
570-
chunk_sects = mddev->chunk_sectors;
571-
572-
sectors = chunk_sects -
573-
(likely(is_power_of_2(chunk_sects))
574-
? (sector & (chunk_sects-1))
575-
: sector_div(sector, chunk_sects));
576-
577-
/* Restore due to sector_div */
578-
sector = bio_sector;
579-
580-
if (sectors < bio_sectors(bio)) {
581-
struct bio *split = bio_split(bio, sectors, GFP_NOIO,
582-
&mddev->bio_set);
583-
bio_chain(split, bio);
584-
submit_bio_noacct(bio);
585-
bio = split;
586-
}
553+
sector_t bio_sector = bio->bi_iter.bi_sector;
554+
sector_t sector = bio_sector;
587555

588556
if (bio->bi_pool != &mddev->bio_set)
589557
md_account_bio(mddev, &bio);
590558

591-
orig_sector = sector;
592559
zone = find_zone(mddev->private, &sector);
593560
switch (conf->layout) {
594561
case RAID0_ORIG_LAYOUT:
595-
tmp_dev = map_sector(mddev, zone, orig_sector, &sector);
562+
tmp_dev = map_sector(mddev, zone, bio_sector, &sector);
596563
break;
597564
case RAID0_ALT_MULTIZONE_LAYOUT:
598565
tmp_dev = map_sector(mddev, zone, sector, &sector);
599566
break;
600567
default:
601568
WARN(1, "md/raid0:%s: Invalid layout\n", mdname(mddev));
602569
bio_io_error(bio);
603-
return true;
570+
return;
604571
}
605572

606573
if (unlikely(is_rdev_broken(tmp_dev))) {
607574
bio_io_error(bio);
608575
md_error(mddev, tmp_dev);
609-
return true;
576+
return;
610577
}
611578

612579
bio_set_dev(bio, tmp_dev->bdev);
@@ -618,6 +585,40 @@ static bool raid0_make_request(struct mddev *mddev, struct bio *bio)
618585
bio_sector);
619586
mddev_check_write_zeroes(mddev, bio);
620587
submit_bio_noacct(bio);
588+
}
589+
590+
static bool raid0_make_request(struct mddev *mddev, struct bio *bio)
591+
{
592+
sector_t sector;
593+
unsigned chunk_sects;
594+
unsigned sectors;
595+
596+
if (unlikely(bio->bi_opf & REQ_PREFLUSH)
597+
&& md_flush_request(mddev, bio))
598+
return true;
599+
600+
if (unlikely((bio_op(bio) == REQ_OP_DISCARD))) {
601+
raid0_handle_discard(mddev, bio);
602+
return true;
603+
}
604+
605+
sector = bio->bi_iter.bi_sector;
606+
chunk_sects = mddev->chunk_sectors;
607+
608+
sectors = chunk_sects -
609+
(likely(is_power_of_2(chunk_sects))
610+
? (sector & (chunk_sects-1))
611+
: sector_div(sector, chunk_sects));
612+
613+
if (sectors < bio_sectors(bio)) {
614+
struct bio *split = bio_split(bio, sectors, GFP_NOIO,
615+
&mddev->bio_set);
616+
bio_chain(split, bio);
617+
submit_bio_noacct(bio);
618+
bio = split;
619+
}
620+
621+
raid0_map_submit_bio(mddev, bio);
621622
return true;
622623
}
623624

0 commit comments

Comments
 (0)