@@ -960,25 +960,29 @@ zhack_repair_one_label_large(const zhack_repair_op_t op, const int fd,
960
960
}
961
961
962
962
uint32_t bootenv_size , vc_size , sc_size ;
963
- if ((err = nvlist_lookup_uint32 (toc , VDEV_TOC_BOOT_REGION ,
964
- & bootenv_size )) || (err = nvlist_lookup_uint32 (toc ,
965
- VDEV_TOC_VDEV_CONFIG , & vc_size )) || (err = nvlist_lookup_uint32 (toc ,
966
- VDEV_TOC_POOL_CONFIG , & sc_size ))) {
963
+ uint32_t bootenv_offset , vc_offset , sc_offset ;
964
+ if (!vdev_toc_get_secinfo (toc , VDEV_TOC_BOOT_REGION ,
965
+ & bootenv_size , & bootenv_offset ) || !vdev_toc_get_secinfo (toc ,
966
+ VDEV_TOC_VDEV_CONFIG , & vc_size , & vc_offset ) ||
967
+ !vdev_toc_get_secinfo (toc , VDEV_TOC_POOL_CONFIG , & sc_size ,
968
+ & sc_offset )) {
969
+ fnvlist_free (toc );
967
970
(void ) fprintf (stderr ,
968
971
"error: TOC missing core fields %d\n" , l );
969
972
goto out ;
970
973
}
974
+ fnvlist_free (toc );
971
975
bootenv = malloc (bootenv_size );
972
976
zio_eck_t * bootenv_eck = (zio_eck_t * )(bootenv + bootenv_size ) - 1 ;
973
977
vdev_config = malloc (vc_size );
974
978
zio_eck_t * vc_eck = (zio_eck_t * )(vdev_config + vc_size ) - 1 ;
975
979
spa_config = malloc (sc_size );
976
980
zio_eck_t * sc_eck = (zio_eck_t * )(spa_config + sc_size ) - 1 ;
977
981
978
- uint64_t offset = label_offset + VDEV_TOC_SIZE ;
982
+ uint64_t base_offset = label_offset ;
979
983
if (bootenv_size != 0 ) {
980
984
if ((err = zhack_repair_read (fd , bootenv ,
981
- bootenv_size , offset , l )))
985
+ bootenv_size , base_offset + bootenv_offset , l )))
982
986
goto out ;
983
987
if (byteswap ) {
984
988
byteswap_uint64_array (& bootenv_eck -> zec_cksum ,
@@ -988,15 +992,15 @@ zhack_repair_one_label_large(const zhack_repair_op_t op, const int fd,
988
992
}
989
993
if ((op & ZHACK_REPAIR_OP_CKSUM ) == 0 &&
990
994
zhack_repair_test_cksum (byteswap , bootenv , bootenv_size ,
991
- bootenv_eck , offset , l ) != 0 ) {
995
+ bootenv_eck , base_offset + bootenv_offset , l ) != 0 ) {
992
996
(void ) fprintf (stderr , "It would appear checksums are "
993
997
"corrupted. Try zhack repair label -c <device>\n" );
994
998
goto out ;
995
999
}
996
1000
}
997
1001
998
- offset += bootenv_size ;
999
- if (( err = zhack_repair_read ( fd , vdev_config , vc_size , offset , l )))
1002
+ if (( err = zhack_repair_read ( fd , vdev_config , vc_size ,
1003
+ base_offset + vc_offset , l )))
1000
1004
goto out ;
1001
1005
1002
1006
if (byteswap ) {
@@ -1006,13 +1010,13 @@ zhack_repair_one_label_large(const zhack_repair_op_t op, const int fd,
1006
1010
}
1007
1011
if ((op & ZHACK_REPAIR_OP_CKSUM ) == 0 &&
1008
1012
zhack_repair_test_cksum (byteswap , vdev_config , vc_size ,
1009
- vc_eck , offset , l ) != 0 ) {
1013
+ vc_eck , base_offset + vc_offset , l ) != 0 ) {
1010
1014
(void ) fprintf (stderr , "It would appear checksums are "
1011
1015
"corrupted. Try zhack repair label -c <device>\n" );
1012
1016
goto out ;
1013
1017
}
1014
- offset += vc_size ;
1015
- if (( err = zhack_repair_read ( fd , spa_config , sc_size , offset , l )))
1018
+ if (( err = zhack_repair_read ( fd , spa_config , sc_size ,
1019
+ base_offset + sc_offset , l )))
1016
1020
goto out ;
1017
1021
1018
1022
if (byteswap ) {
@@ -1022,7 +1026,7 @@ zhack_repair_one_label_large(const zhack_repair_op_t op, const int fd,
1022
1026
}
1023
1027
if ((op & ZHACK_REPAIR_OP_CKSUM ) == 0 &&
1024
1028
zhack_repair_test_cksum (byteswap , spa_config , sc_size ,
1025
- sc_eck , offset , l ) != 0 ) {
1029
+ sc_eck , base_offset + sc_offset , l ) != 0 ) {
1026
1030
(void ) fprintf (stderr , "It would appear checksums are "
1027
1031
"corrupted. Try zhack repair label -c <device>\n" );
1028
1032
goto out ;
@@ -1071,21 +1075,17 @@ zhack_repair_one_label_large(const zhack_repair_op_t op, const int fd,
1071
1075
label_offset , labels_repaired );
1072
1076
}
1073
1077
1074
- offset = label_offset ;
1075
1078
if (zhack_repair_write_label (l , fd , byteswap , toc_data , toc_eck ,
1076
- offset , VDEV_TOC_SIZE ))
1079
+ base_offset , VDEV_TOC_SIZE ))
1077
1080
labels_repaired [l ] |= REPAIR_LABEL_STATUS_CKSUM ;
1078
- offset += VDEV_TOC_SIZE ;
1079
1081
if (zhack_repair_write_label (l , fd , byteswap , bootenv , bootenv_eck ,
1080
- offset , bootenv_size ))
1082
+ base_offset + bootenv_offset , bootenv_size ))
1081
1083
labels_repaired [l ] |= REPAIR_LABEL_STATUS_CKSUM ;
1082
- offset += bootenv_size ;
1083
1084
if (zhack_repair_write_label (l , fd , byteswap , vdev_config , vc_eck ,
1084
- offset , vc_size ))
1085
+ base_offset + vc_offset , vc_size ))
1085
1086
labels_repaired [l ] |= REPAIR_LABEL_STATUS_CKSUM ;
1086
- offset += vc_size ;
1087
1087
if (zhack_repair_write_label (l , fd , byteswap , spa_config , sc_eck ,
1088
- offset , sc_size ))
1088
+ base_offset + sc_offset , sc_size ))
1089
1089
labels_repaired [l ] |= REPAIR_LABEL_STATUS_CKSUM ;
1090
1090
1091
1091
fsync (fd );
0 commit comments