@@ -577,18 +577,36 @@ int btrfs_check_chunk_valid(struct extent_buffer *leaf,
577
577
u64 type ;
578
578
u64 features ;
579
579
bool mixed = false;
580
+ int raid_index ;
581
+ int nparity ;
582
+ int ncopies ;
580
583
581
584
length = btrfs_chunk_length (leaf , chunk );
582
585
stripe_len = btrfs_chunk_stripe_len (leaf , chunk );
583
586
num_stripes = btrfs_chunk_num_stripes (leaf , chunk );
584
587
sub_stripes = btrfs_chunk_sub_stripes (leaf , chunk );
585
588
type = btrfs_chunk_type (leaf , chunk );
589
+ raid_index = btrfs_bg_flags_to_raid_index (type );
590
+ ncopies = btrfs_raid_array [raid_index ].ncopies ;
591
+ nparity = btrfs_raid_array [raid_index ].nparity ;
586
592
587
593
if (!num_stripes ) {
588
594
chunk_err (leaf , chunk , logical ,
589
595
"invalid chunk num_stripes, have %u" , num_stripes );
590
596
return - EUCLEAN ;
591
597
}
598
+ if (num_stripes < ncopies ) {
599
+ chunk_err (leaf , chunk , logical ,
600
+ "invalid chunk num_stripes < ncopies, have %u < %d" ,
601
+ num_stripes , ncopies );
602
+ return - EUCLEAN ;
603
+ }
604
+ if (nparity && num_stripes == nparity ) {
605
+ chunk_err (leaf , chunk , logical ,
606
+ "invalid chunk num_stripes == nparity, have %u == %d" ,
607
+ num_stripes , nparity );
608
+ return - EUCLEAN ;
609
+ }
592
610
if (!IS_ALIGNED (logical , fs_info -> sectorsize )) {
593
611
chunk_err (leaf , chunk , logical ,
594
612
"invalid chunk logical, have %llu should aligned to %u" ,
0 commit comments