@@ -545,68 +545,35 @@ static void raid0_handle_discard(struct mddev *mddev, struct bio *bio)
545
545
bio_endio (bio );
546
546
}
547
547
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 )
549
549
{
550
550
struct r0conf * conf = mddev -> private ;
551
551
struct strip_zone * zone ;
552
552
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 ;
587
555
588
556
if (bio -> bi_pool != & mddev -> bio_set )
589
557
md_account_bio (mddev , & bio );
590
558
591
- orig_sector = sector ;
592
559
zone = find_zone (mddev -> private , & sector );
593
560
switch (conf -> layout ) {
594
561
case RAID0_ORIG_LAYOUT :
595
- tmp_dev = map_sector (mddev , zone , orig_sector , & sector );
562
+ tmp_dev = map_sector (mddev , zone , bio_sector , & sector );
596
563
break ;
597
564
case RAID0_ALT_MULTIZONE_LAYOUT :
598
565
tmp_dev = map_sector (mddev , zone , sector , & sector );
599
566
break ;
600
567
default :
601
568
WARN (1 , "md/raid0:%s: Invalid layout\n" , mdname (mddev ));
602
569
bio_io_error (bio );
603
- return true ;
570
+ return ;
604
571
}
605
572
606
573
if (unlikely (is_rdev_broken (tmp_dev ))) {
607
574
bio_io_error (bio );
608
575
md_error (mddev , tmp_dev );
609
- return true ;
576
+ return ;
610
577
}
611
578
612
579
bio_set_dev (bio , tmp_dev -> bdev );
@@ -618,6 +585,40 @@ static bool raid0_make_request(struct mddev *mddev, struct bio *bio)
618
585
bio_sector );
619
586
mddev_check_write_zeroes (mddev , bio );
620
587
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 );
621
622
return true;
622
623
}
623
624
0 commit comments