@@ -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