@@ -1145,25 +1145,29 @@ zhack_repair_one_label_large(const zhack_repair_op_t op, const int fd,
1145
1145
}
1146
1146
1147
1147
uint32_t bootenv_size , vc_size , sc_size ;
1148
- if ((err = nvlist_lookup_uint32 (toc , VDEV_TOC_BOOT_REGION ,
1149
- & bootenv_size )) || (err = nvlist_lookup_uint32 (toc ,
1150
- VDEV_TOC_VDEV_CONFIG , & vc_size )) || (err = nvlist_lookup_uint32 (toc ,
1151
- VDEV_TOC_POOL_CONFIG , & sc_size ))) {
1148
+ uint32_t bootenv_offset , vc_offset , sc_offset ;
1149
+ if (!vdev_toc_get_secinfo (toc , VDEV_TOC_BOOT_REGION ,
1150
+ & bootenv_size , & bootenv_offset ) || !vdev_toc_get_secinfo (toc ,
1151
+ VDEV_TOC_VDEV_CONFIG , & vc_size , & vc_offset ) ||
1152
+ !vdev_toc_get_secinfo (toc , VDEV_TOC_POOL_CONFIG , & sc_size ,
1153
+ & sc_offset )) {
1154
+ fnvlist_free (toc );
1152
1155
(void ) fprintf (stderr ,
1153
1156
"error: TOC missing core fields %d\n" , l );
1154
1157
goto out ;
1155
1158
}
1159
+ fnvlist_free (toc );
1156
1160
bootenv = malloc (bootenv_size );
1157
1161
zio_eck_t * bootenv_eck = (zio_eck_t * )(bootenv + bootenv_size ) - 1 ;
1158
1162
vdev_config = malloc (vc_size );
1159
1163
zio_eck_t * vc_eck = (zio_eck_t * )(vdev_config + vc_size ) - 1 ;
1160
1164
spa_config = malloc (sc_size );
1161
1165
zio_eck_t * sc_eck = (zio_eck_t * )(spa_config + sc_size ) - 1 ;
1162
1166
1163
- uint64_t offset = label_offset + VDEV_TOC_SIZE ;
1167
+ uint64_t base_offset = label_offset ;
1164
1168
if (bootenv_size != 0 ) {
1165
1169
if ((err = zhack_repair_read (fd , bootenv ,
1166
- bootenv_size , offset , l )))
1170
+ bootenv_size , base_offset + bootenv_offset , l )))
1167
1171
goto out ;
1168
1172
if (byteswap ) {
1169
1173
byteswap_uint64_array (& bootenv_eck -> zec_cksum ,
@@ -1173,15 +1177,15 @@ zhack_repair_one_label_large(const zhack_repair_op_t op, const int fd,
1173
1177
}
1174
1178
if ((op & ZHACK_REPAIR_OP_CKSUM ) == 0 &&
1175
1179
zhack_repair_test_cksum (byteswap , bootenv , bootenv_size ,
1176
- bootenv_eck , offset , l ) != 0 ) {
1180
+ bootenv_eck , base_offset + bootenv_offset , l ) != 0 ) {
1177
1181
(void ) fprintf (stderr , "It would appear checksums are "
1178
1182
"corrupted. Try zhack repair label -c <device>\n" );
1179
1183
goto out ;
1180
1184
}
1181
1185
}
1182
1186
1183
- offset += bootenv_size ;
1184
- if (( err = zhack_repair_read ( fd , vdev_config , vc_size , offset , l )))
1187
+ if (( err = zhack_repair_read ( fd , vdev_config , vc_size ,
1188
+ base_offset + vc_offset , l )))
1185
1189
goto out ;
1186
1190
1187
1191
if (byteswap ) {
@@ -1191,13 +1195,13 @@ zhack_repair_one_label_large(const zhack_repair_op_t op, const int fd,
1191
1195
}
1192
1196
if ((op & ZHACK_REPAIR_OP_CKSUM ) == 0 &&
1193
1197
zhack_repair_test_cksum (byteswap , vdev_config , vc_size ,
1194
- vc_eck , offset , l ) != 0 ) {
1198
+ vc_eck , base_offset + vc_offset , l ) != 0 ) {
1195
1199
(void ) fprintf (stderr , "It would appear checksums are "
1196
1200
"corrupted. Try zhack repair label -c <device>\n" );
1197
1201
goto out ;
1198
1202
}
1199
- offset += vc_size ;
1200
- if (( err = zhack_repair_read ( fd , spa_config , sc_size , offset , l )))
1203
+ if (( err = zhack_repair_read ( fd , spa_config , sc_size ,
1204
+ base_offset + sc_offset , l )))
1201
1205
goto out ;
1202
1206
1203
1207
if (byteswap ) {
@@ -1207,7 +1211,7 @@ zhack_repair_one_label_large(const zhack_repair_op_t op, const int fd,
1207
1211
}
1208
1212
if ((op & ZHACK_REPAIR_OP_CKSUM ) == 0 &&
1209
1213
zhack_repair_test_cksum (byteswap , spa_config , sc_size ,
1210
- sc_eck , offset , l ) != 0 ) {
1214
+ sc_eck , base_offset + sc_offset , l ) != 0 ) {
1211
1215
(void ) fprintf (stderr , "It would appear checksums are "
1212
1216
"corrupted. Try zhack repair label -c <device>\n" );
1213
1217
goto out ;
@@ -1256,21 +1260,17 @@ zhack_repair_one_label_large(const zhack_repair_op_t op, const int fd,
1256
1260
label_offset , labels_repaired );
1257
1261
}
1258
1262
1259
- offset = label_offset ;
1260
1263
if (zhack_repair_write_label (l , fd , byteswap , toc_data , toc_eck ,
1261
- offset , VDEV_TOC_SIZE ))
1264
+ base_offset , VDEV_TOC_SIZE ))
1262
1265
labels_repaired [l ] |= REPAIR_LABEL_STATUS_CKSUM ;
1263
- offset += VDEV_TOC_SIZE ;
1264
1266
if (zhack_repair_write_label (l , fd , byteswap , bootenv , bootenv_eck ,
1265
- offset , bootenv_size ))
1267
+ base_offset + bootenv_offset , bootenv_size ))
1266
1268
labels_repaired [l ] |= REPAIR_LABEL_STATUS_CKSUM ;
1267
- offset += bootenv_size ;
1268
1269
if (zhack_repair_write_label (l , fd , byteswap , vdev_config , vc_eck ,
1269
- offset , vc_size ))
1270
+ base_offset + vc_offset , vc_size ))
1270
1271
labels_repaired [l ] |= REPAIR_LABEL_STATUS_CKSUM ;
1271
- offset += vc_size ;
1272
1272
if (zhack_repair_write_label (l , fd , byteswap , spa_config , sc_eck ,
1273
- offset , sc_size ))
1273
+ base_offset + sc_offset , sc_size ))
1274
1274
labels_repaired [l ] |= REPAIR_LABEL_STATUS_CKSUM ;
1275
1275
1276
1276
fsync (fd );
0 commit comments