@@ -5918,6 +5918,54 @@ static enum reshape_loc get_reshape_loc(struct mddev *mddev,
5918
5918
return LOC_BEHIND_RESHAPE ;
5919
5919
}
5920
5920
5921
+ static void raid5_bitmap_sector (struct mddev * mddev , sector_t * offset ,
5922
+ unsigned long * sectors )
5923
+ {
5924
+ struct r5conf * conf = mddev -> private ;
5925
+ sector_t start = * offset ;
5926
+ sector_t end = start + * sectors ;
5927
+ sector_t prev_start = start ;
5928
+ sector_t prev_end = end ;
5929
+ int sectors_per_chunk ;
5930
+ enum reshape_loc loc ;
5931
+ int dd_idx ;
5932
+
5933
+ sectors_per_chunk = conf -> chunk_sectors *
5934
+ (conf -> raid_disks - conf -> max_degraded );
5935
+ start = round_down (start , sectors_per_chunk );
5936
+ end = round_up (end , sectors_per_chunk );
5937
+
5938
+ start = raid5_compute_sector (conf , start , 0 , & dd_idx , NULL );
5939
+ end = raid5_compute_sector (conf , end , 0 , & dd_idx , NULL );
5940
+
5941
+ /*
5942
+ * For LOC_INSIDE_RESHAPE, this IO will wait for reshape to make
5943
+ * progress, hence it's the same as LOC_BEHIND_RESHAPE.
5944
+ */
5945
+ loc = get_reshape_loc (mddev , conf , prev_start );
5946
+ if (likely (loc != LOC_AHEAD_OF_RESHAPE )) {
5947
+ * offset = start ;
5948
+ * sectors = end - start ;
5949
+ return ;
5950
+ }
5951
+
5952
+ sectors_per_chunk = conf -> prev_chunk_sectors *
5953
+ (conf -> previous_raid_disks - conf -> max_degraded );
5954
+ prev_start = round_down (prev_start , sectors_per_chunk );
5955
+ prev_end = round_down (prev_end , sectors_per_chunk );
5956
+
5957
+ prev_start = raid5_compute_sector (conf , prev_start , 1 , & dd_idx , NULL );
5958
+ prev_end = raid5_compute_sector (conf , prev_end , 1 , & dd_idx , NULL );
5959
+
5960
+ /*
5961
+ * for LOC_AHEAD_OF_RESHAPE, reshape can make progress before this IO
5962
+ * is handled in make_stripe_request(), we can't know this here hence
5963
+ * we set bits for both.
5964
+ */
5965
+ * offset = min (start , prev_start );
5966
+ * sectors = max (end , prev_end ) - * offset ;
5967
+ }
5968
+
5921
5969
static enum stripe_result make_stripe_request (struct mddev * mddev ,
5922
5970
struct r5conf * conf , struct stripe_request_ctx * ctx ,
5923
5971
sector_t logical_sector , struct bio * bi )
@@ -8966,6 +9014,7 @@ static struct md_personality raid6_personality =
8966
9014
.takeover = raid6_takeover ,
8967
9015
.change_consistency_policy = raid5_change_consistency_policy ,
8968
9016
.prepare_suspend = raid5_prepare_suspend ,
9017
+ .bitmap_sector = raid5_bitmap_sector ,
8969
9018
};
8970
9019
static struct md_personality raid5_personality =
8971
9020
{
@@ -8991,6 +9040,7 @@ static struct md_personality raid5_personality =
8991
9040
.takeover = raid5_takeover ,
8992
9041
.change_consistency_policy = raid5_change_consistency_policy ,
8993
9042
.prepare_suspend = raid5_prepare_suspend ,
9043
+ .bitmap_sector = raid5_bitmap_sector ,
8994
9044
};
8995
9045
8996
9046
static struct md_personality raid4_personality =
@@ -9017,6 +9067,7 @@ static struct md_personality raid4_personality =
9017
9067
.takeover = raid4_takeover ,
9018
9068
.change_consistency_policy = raid5_change_consistency_policy ,
9019
9069
.prepare_suspend = raid5_prepare_suspend ,
9070
+ .bitmap_sector = raid5_bitmap_sector ,
9020
9071
};
9021
9072
9022
9073
static int __init raid5_init (void )
0 commit comments