@@ -802,13 +802,10 @@ abd_iterate_func(abd_t *abd, size_t off, size_t size,
802
802
abd_verify (abd );
803
803
ASSERT3U (off + size , <=, abd -> abd_size );
804
804
805
- boolean_t gang = abd_is_gang (abd );
806
805
abd_t * c_abd = abd_init_abd_iter (abd , & aiter , off );
807
806
808
807
while (size > 0 ) {
809
- /* If we are at the end of the gang ABD we are done */
810
- if (gang && !c_abd )
811
- break ;
808
+ IMPLY (abd_is_gang (abd ), c_abd != NULL );
812
809
813
810
abd_iter_map (& aiter );
814
811
@@ -930,7 +927,6 @@ abd_iterate_func2(abd_t *dabd, abd_t *sabd, size_t doff, size_t soff,
930
927
{
931
928
int ret = 0 ;
932
929
struct abd_iter daiter , saiter ;
933
- boolean_t dabd_is_gang_abd , sabd_is_gang_abd ;
934
930
abd_t * c_dabd , * c_sabd ;
935
931
936
932
if (size == 0 )
@@ -942,16 +938,12 @@ abd_iterate_func2(abd_t *dabd, abd_t *sabd, size_t doff, size_t soff,
942
938
ASSERT3U (doff + size , <=, dabd -> abd_size );
943
939
ASSERT3U (soff + size , <=, sabd -> abd_size );
944
940
945
- dabd_is_gang_abd = abd_is_gang (dabd );
946
- sabd_is_gang_abd = abd_is_gang (sabd );
947
941
c_dabd = abd_init_abd_iter (dabd , & daiter , doff );
948
942
c_sabd = abd_init_abd_iter (sabd , & saiter , soff );
949
943
950
944
while (size > 0 ) {
951
- /* if we are at the end of the gang ABD we are done */
952
- if ((dabd_is_gang_abd && !c_dabd ) ||
953
- (sabd_is_gang_abd && !c_sabd ))
954
- break ;
945
+ IMPLY (abd_is_gang (dabd ), c_dabd != NULL );
946
+ IMPLY (abd_is_gang (sabd ), c_sabd != NULL );
955
947
956
948
abd_iter_map (& daiter );
957
949
abd_iter_map (& saiter );
@@ -1032,66 +1024,40 @@ abd_raidz_gen_iterate(abd_t **cabds, abd_t *dabd,
1032
1024
int i ;
1033
1025
ssize_t len , dlen ;
1034
1026
struct abd_iter caiters [3 ];
1035
- struct abd_iter daiter = { 0 } ;
1027
+ struct abd_iter daiter ;
1036
1028
void * caddrs [3 ];
1037
1029
unsigned long flags __maybe_unused = 0 ;
1038
1030
abd_t * c_cabds [3 ];
1039
1031
abd_t * c_dabd = NULL ;
1040
- boolean_t cabds_is_gang_abd [3 ];
1041
- boolean_t dabd_is_gang_abd = B_FALSE ;
1042
1032
1043
1033
ASSERT3U (parity , <=, 3 );
1044
-
1045
1034
for (i = 0 ; i < parity ; i ++ ) {
1046
- cabds_is_gang_abd [i ] = abd_is_gang (cabds [i ]);
1035
+ abd_verify (cabds [i ]);
1036
+ ASSERT3U (csize , <=, cabds [i ]-> abd_size );
1047
1037
c_cabds [i ] = abd_init_abd_iter (cabds [i ], & caiters [i ], 0 );
1048
1038
}
1049
1039
1050
- if (dabd ) {
1051
- dabd_is_gang_abd = abd_is_gang (dabd );
1040
+ ASSERT3S (dsize , >=, 0 );
1041
+ if (dsize > 0 ) {
1042
+ ASSERT (dabd );
1043
+ abd_verify (dabd );
1044
+ ASSERT3U (dsize , <=, dabd -> abd_size );
1052
1045
c_dabd = abd_init_abd_iter (dabd , & daiter , 0 );
1053
1046
}
1054
1047
1055
- ASSERT3S (dsize , >=, 0 );
1056
-
1057
1048
abd_enter_critical (flags );
1058
1049
while (csize > 0 ) {
1059
- /* if we are at the end of the gang ABD we are done */
1060
- if (dabd_is_gang_abd && !c_dabd )
1061
- break ;
1062
-
1050
+ len = csize ;
1063
1051
for (i = 0 ; i < parity ; i ++ ) {
1064
- /*
1065
- * If we are at the end of the gang ABD we are
1066
- * done.
1067
- */
1068
- if (cabds_is_gang_abd [i ] && !c_cabds [i ])
1069
- break ;
1052
+ IMPLY (abd_is_gang (cabds [i ]), c_cabds [i ] != NULL );
1070
1053
abd_iter_map (& caiters [i ]);
1071
1054
caddrs [i ] = caiters [i ].iter_mapaddr ;
1055
+ len = MIN (caiters [i ].iter_mapsize , len );
1072
1056
}
1073
1057
1074
- len = csize ;
1075
-
1076
- if (dabd && dsize > 0 )
1058
+ if (dsize > 0 ) {
1059
+ IMPLY (abd_is_gang (dabd ), c_dabd != NULL );
1077
1060
abd_iter_map (& daiter );
1078
-
1079
- switch (parity ) {
1080
- case 3 :
1081
- len = MIN (caiters [2 ].iter_mapsize , len );
1082
- zfs_fallthrough ;
1083
- case 2 :
1084
- len = MIN (caiters [1 ].iter_mapsize , len );
1085
- zfs_fallthrough ;
1086
- case 1 :
1087
- len = MIN (caiters [0 ].iter_mapsize , len );
1088
- }
1089
-
1090
- /* must be progressive */
1091
- ASSERT3S (len , > , 0 );
1092
-
1093
- if (dabd && dsize > 0 ) {
1094
- /* this needs precise iter.length */
1095
1061
len = MIN (daiter .iter_mapsize , len );
1096
1062
dlen = len ;
1097
1063
} else
@@ -1114,7 +1080,7 @@ abd_raidz_gen_iterate(abd_t **cabds, abd_t *dabd,
1114
1080
& caiters [i ], len );
1115
1081
}
1116
1082
1117
- if (dabd && dsize > 0 ) {
1083
+ if (dsize > 0 ) {
1118
1084
abd_iter_unmap (& daiter );
1119
1085
c_dabd =
1120
1086
abd_advance_abd_iter (dabd , c_dabd , & daiter ,
@@ -1153,16 +1119,16 @@ abd_raidz_rec_iterate(abd_t **cabds, abd_t **tabds,
1153
1119
struct abd_iter xiters [3 ];
1154
1120
void * caddrs [3 ], * xaddrs [3 ];
1155
1121
unsigned long flags __maybe_unused = 0 ;
1156
- boolean_t cabds_is_gang_abd [3 ];
1157
- boolean_t tabds_is_gang_abd [3 ];
1158
1122
abd_t * c_cabds [3 ];
1159
1123
abd_t * c_tabds [3 ];
1160
1124
1161
1125
ASSERT3U (parity , <=, 3 );
1162
1126
1163
1127
for (i = 0 ; i < parity ; i ++ ) {
1164
- cabds_is_gang_abd [i ] = abd_is_gang (cabds [i ]);
1165
- tabds_is_gang_abd [i ] = abd_is_gang (tabds [i ]);
1128
+ abd_verify (cabds [i ]);
1129
+ abd_verify (tabds [i ]);
1130
+ ASSERT3U (tsize , <=, cabds [i ]-> abd_size );
1131
+ ASSERT3U (tsize , <=, tabds [i ]-> abd_size );
1166
1132
c_cabds [i ] =
1167
1133
abd_init_abd_iter (cabds [i ], & citers [i ], 0 );
1168
1134
c_tabds [i ] =
@@ -1171,36 +1137,18 @@ abd_raidz_rec_iterate(abd_t **cabds, abd_t **tabds,
1171
1137
1172
1138
abd_enter_critical (flags );
1173
1139
while (tsize > 0 ) {
1174
-
1140
+ len = tsize ;
1175
1141
for (i = 0 ; i < parity ; i ++ ) {
1176
- /*
1177
- * If we are at the end of the gang ABD we
1178
- * are done.
1179
- */
1180
- if (cabds_is_gang_abd [i ] && !c_cabds [i ])
1181
- break ;
1182
- if (tabds_is_gang_abd [i ] && !c_tabds [i ])
1183
- break ;
1142
+ IMPLY (abd_is_gang (cabds [i ]), c_cabds [i ] != NULL );
1143
+ IMPLY (abd_is_gang (tabds [i ]), c_tabds [i ] != NULL );
1184
1144
abd_iter_map (& citers [i ]);
1185
1145
abd_iter_map (& xiters [i ]);
1186
1146
caddrs [i ] = citers [i ].iter_mapaddr ;
1187
1147
xaddrs [i ] = xiters [i ].iter_mapaddr ;
1148
+ len = MIN (citers [i ].iter_mapsize , len );
1149
+ len = MIN (xiters [i ].iter_mapsize , len );
1188
1150
}
1189
1151
1190
- len = tsize ;
1191
- switch (parity ) {
1192
- case 3 :
1193
- len = MIN (xiters [2 ].iter_mapsize , len );
1194
- len = MIN (citers [2 ].iter_mapsize , len );
1195
- zfs_fallthrough ;
1196
- case 2 :
1197
- len = MIN (xiters [1 ].iter_mapsize , len );
1198
- len = MIN (citers [1 ].iter_mapsize , len );
1199
- zfs_fallthrough ;
1200
- case 1 :
1201
- len = MIN (xiters [0 ].iter_mapsize , len );
1202
- len = MIN (citers [0 ].iter_mapsize , len );
1203
- }
1204
1152
/* must be progressive */
1205
1153
ASSERT3S (len , > , 0 );
1206
1154
/*
0 commit comments