@@ -524,13 +524,16 @@ int bch2_replicas_gc_start(struct bch_fs *c, unsigned typemask)
524
524
c -> replicas_gc .nr = 0 ;
525
525
c -> replicas_gc .entry_size = 0 ;
526
526
527
- for_each_cpu_replicas_entry (& c -> replicas , e )
528
- if (!((1 << e -> data_type ) & typemask )) {
527
+ for_each_cpu_replicas_entry (& c -> replicas , e ) {
528
+ /* Preserve unknown data types */
529
+ if (e -> data_type >= BCH_DATA_NR ||
530
+ !((1 << e -> data_type ) & typemask )) {
529
531
c -> replicas_gc .nr ++ ;
530
532
c -> replicas_gc .entry_size =
531
533
max_t (unsigned , c -> replicas_gc .entry_size ,
532
534
replicas_entry_bytes (e ));
533
535
}
536
+ }
534
537
535
538
c -> replicas_gc .entries = kcalloc (c -> replicas_gc .nr ,
536
539
c -> replicas_gc .entry_size ,
@@ -542,7 +545,8 @@ int bch2_replicas_gc_start(struct bch_fs *c, unsigned typemask)
542
545
}
543
546
544
547
for_each_cpu_replicas_entry (& c -> replicas , e )
545
- if (!((1 << e -> data_type ) & typemask ))
548
+ if (e -> data_type >= BCH_DATA_NR ||
549
+ !((1 << e -> data_type ) & typemask ))
546
550
memcpy (cpu_replicas_entry (& c -> replicas_gc , i ++ ),
547
551
e , c -> replicas_gc .entry_size );
548
552
@@ -998,25 +1002,34 @@ unsigned bch2_sb_dev_has_data(struct bch_sb *sb, unsigned dev)
998
1002
{
999
1003
struct bch_sb_field_replicas * replicas ;
1000
1004
struct bch_sb_field_replicas_v0 * replicas_v0 ;
1001
- unsigned i , data_has = 0 ;
1005
+ unsigned data_has = 0 ;
1002
1006
1003
1007
replicas = bch2_sb_field_get (sb , replicas );
1004
1008
replicas_v0 = bch2_sb_field_get (sb , replicas_v0 );
1005
1009
1006
1010
if (replicas ) {
1007
1011
struct bch_replicas_entry_v1 * r ;
1008
1012
1009
- for_each_replicas_entry (replicas , r )
1010
- for (i = 0 ; i < r -> nr_devs ; i ++ )
1013
+ for_each_replicas_entry (replicas , r ) {
1014
+ if (r -> data_type >= sizeof (data_has ) * 8 )
1015
+ continue ;
1016
+
1017
+ for (unsigned i = 0 ; i < r -> nr_devs ; i ++ )
1011
1018
if (r -> devs [i ] == dev )
1012
1019
data_has |= 1 << r -> data_type ;
1020
+ }
1021
+
1013
1022
} else if (replicas_v0 ) {
1014
1023
struct bch_replicas_entry_v0 * r ;
1015
1024
1016
- for_each_replicas_entry_v0 (replicas_v0 , r )
1017
- for (i = 0 ; i < r -> nr_devs ; i ++ )
1025
+ for_each_replicas_entry_v0 (replicas_v0 , r ) {
1026
+ if (r -> data_type >= sizeof (data_has ) * 8 )
1027
+ continue ;
1028
+
1029
+ for (unsigned i = 0 ; i < r -> nr_devs ; i ++ )
1018
1030
if (r -> devs [i ] == dev )
1019
1031
data_has |= 1 << r -> data_type ;
1032
+ }
1020
1033
}
1021
1034
1022
1035
0 commit comments