16 * fields enclosed by brackets "[]" replaced with your own identifying |
16 * fields enclosed by brackets "[]" replaced with your own identifying |
17 * information: Portions Copyright [yyyy] [name of copyright owner] |
17 * information: Portions Copyright [yyyy] [name of copyright owner] |
18 * |
18 * |
19 * CDDL HEADER END |
19 * CDDL HEADER END |
20 */ |
20 */ |
|
21 |
21 /* |
22 /* |
22 * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. |
23 * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. |
|
24 * Copyright (c) 2012 by Delphix. All rights reserved. |
23 */ |
25 */ |
24 |
26 |
25 #include <stdio.h> |
27 #include <stdio.h> |
26 #include <stdio_ext.h> |
28 #include <stdio_ext.h> |
27 #include <stdlib.h> |
29 #include <stdlib.h> |
52 #include <sys/zio_checksum.h> |
54 #include <sys/zio_checksum.h> |
53 #include <sys/zio_compress.h> |
55 #include <sys/zio_compress.h> |
54 #include <sys/zfs_fuid.h> |
56 #include <sys/zfs_fuid.h> |
55 #include <sys/arc.h> |
57 #include <sys/arc.h> |
56 #include <sys/ddt.h> |
58 #include <sys/ddt.h> |
|
59 #include <sys/zfeature.h> |
57 #undef ZFS_MAXNAMELEN |
60 #undef ZFS_MAXNAMELEN |
58 #undef verify |
61 #undef verify |
59 #include <libzfs.h> |
62 #include <libzfs.h> |
60 |
63 |
61 #define ZDB_COMPRESS_NAME(idx) ((idx) < ZIO_COMPRESS_FUNCTIONS ? \ |
64 #define ZDB_COMPRESS_NAME(idx) ((idx) < ZIO_COMPRESS_FUNCTIONS ? \ |
62 zio_compress_table[(idx)].ci_name : "UNKNOWN") |
65 zio_compress_table[(idx)].ci_name : "UNKNOWN") |
63 #define ZDB_CHECKSUM_NAME(idx) ((idx) < ZIO_CHECKSUM_FUNCTIONS ? \ |
66 #define ZDB_CHECKSUM_NAME(idx) ((idx) < ZIO_CHECKSUM_FUNCTIONS ? \ |
64 zio_checksum_table[(idx)].ci_name : "UNKNOWN") |
67 zio_checksum_table[(idx)].ci_name : "UNKNOWN") |
65 #define ZDB_OT_NAME(idx) ((idx) < DMU_OT_NUMTYPES ? \ |
68 #define ZDB_OT_NAME(idx) ((idx) < DMU_OT_NUMTYPES ? \ |
66 dmu_ot[(idx)].ot_name : "UNKNOWN") |
69 dmu_ot[(idx)].ot_name : DMU_OT_IS_VALID(idx) ? \ |
|
70 dmu_ot_byteswap[DMU_OT_BYTESWAP(idx)].ob_name : "UNKNOWN") |
67 #define ZDB_OT_TYPE(idx) ((idx) < DMU_OT_NUMTYPES ? (idx) : DMU_OT_NUMTYPES) |
71 #define ZDB_OT_TYPE(idx) ((idx) < DMU_OT_NUMTYPES ? (idx) : DMU_OT_NUMTYPES) |
68 |
72 |
69 #ifndef lint |
73 #ifndef lint |
70 extern int zfs_recover; |
74 extern int zfs_recover; |
71 #else |
75 #else |
1086 if (ds == NULL) |
1090 if (ds == NULL) |
1087 return; |
1091 return; |
1088 |
1092 |
1089 ASSERT(size == sizeof (*ds)); |
1093 ASSERT(size == sizeof (*ds)); |
1090 crtime = ds->ds_creation_time; |
1094 crtime = ds->ds_creation_time; |
1091 zdb_nicenum(ds->ds_used_bytes, used); |
1095 zdb_nicenum(ds->ds_referenced_bytes, used); |
1092 zdb_nicenum(ds->ds_compressed_bytes, compressed); |
1096 zdb_nicenum(ds->ds_compressed_bytes, compressed); |
1093 zdb_nicenum(ds->ds_uncompressed_bytes, uncompressed); |
1097 zdb_nicenum(ds->ds_uncompressed_bytes, uncompressed); |
1094 zdb_nicenum(ds->ds_unique_bytes, unique); |
1098 zdb_nicenum(ds->ds_unique_bytes, unique); |
1095 sprintf_blkptr(blkbuf, &ds->ds_bp); |
1099 sprintf_blkptr(blkbuf, &ds->ds_bp); |
1096 |
1100 |
1126 (void) printf("\t\tnext_clones_obj = %llu\n", |
1130 (void) printf("\t\tnext_clones_obj = %llu\n", |
1127 (u_longlong_t)ds->ds_next_clones_obj); |
1131 (u_longlong_t)ds->ds_next_clones_obj); |
1128 (void) printf("\t\tprops_obj = %llu\n", |
1132 (void) printf("\t\tprops_obj = %llu\n", |
1129 (u_longlong_t)ds->ds_props_obj); |
1133 (u_longlong_t)ds->ds_props_obj); |
1130 (void) printf("\t\tbp = %s\n", blkbuf); |
1134 (void) printf("\t\tbp = %s\n", blkbuf); |
|
1135 } |
|
1136 |
|
1137 /* ARGSUSED */ |
|
1138 static int |
|
1139 dump_bptree_cb(void *arg, const blkptr_t *bp, dmu_tx_t *tx) |
|
1140 { |
|
1141 char blkbuf[BP_SPRINTF_LEN]; |
|
1142 |
|
1143 if (bp->blk_birth != 0) { |
|
1144 sprintf_blkptr(blkbuf, bp); |
|
1145 (void) printf("\t%s\n", blkbuf); |
|
1146 } |
|
1147 return (0); |
|
1148 } |
|
1149 |
|
1150 static void |
|
1151 dump_bptree(objset_t *os, uint64_t obj, char *name) |
|
1152 { |
|
1153 char bytes[32]; |
|
1154 bptree_phys_t *bt; |
|
1155 dmu_buf_t *db; |
|
1156 |
|
1157 if (dump_opt['d'] < 3) |
|
1158 return; |
|
1159 |
|
1160 VERIFY3U(0, ==, dmu_bonus_hold(os, obj, FTAG, &db)); |
|
1161 bt = db->db_data; |
|
1162 zdb_nicenum(bt->bt_bytes, bytes); |
|
1163 (void) printf("\n %s: %llu datasets, %s\n", |
|
1164 name, (unsigned long long)(bt->bt_end - bt->bt_begin), bytes); |
|
1165 dmu_buf_rele(db, FTAG); |
|
1166 |
|
1167 if (dump_opt['d'] < 5) |
|
1168 return; |
|
1169 |
|
1170 (void) printf("\n"); |
|
1171 |
|
1172 (void) bptree_iterate(os, obj, B_FALSE, dump_bptree_cb, NULL, NULL); |
1131 } |
1173 } |
1132 |
1174 |
1133 /* ARGSUSED */ |
1175 /* ARGSUSED */ |
1134 static int |
1176 static int |
1135 dump_bpobj_cb(void *arg, const blkptr_t *bp, dmu_tx_t *tx) |
1177 dump_bpobj_cb(void *arg, const blkptr_t *bp, dmu_tx_t *tx) |
1881 /* |
1923 /* |
1882 * Extended object types to report deferred frees and dedup auto-ditto blocks. |
1924 * Extended object types to report deferred frees and dedup auto-ditto blocks. |
1883 */ |
1925 */ |
1884 #define ZDB_OT_DEFERRED (DMU_OT_NUMTYPES + 0) |
1926 #define ZDB_OT_DEFERRED (DMU_OT_NUMTYPES + 0) |
1885 #define ZDB_OT_DITTO (DMU_OT_NUMTYPES + 1) |
1927 #define ZDB_OT_DITTO (DMU_OT_NUMTYPES + 1) |
1886 #define ZDB_OT_TOTAL (DMU_OT_NUMTYPES + 2) |
1928 #define ZDB_OT_OTHER (DMU_OT_NUMTYPES + 2) |
|
1929 #define ZDB_OT_TOTAL (DMU_OT_NUMTYPES + 3) |
1887 |
1930 |
1888 static char *zdb_ot_extname[] = { |
1931 static char *zdb_ot_extname[] = { |
1889 "deferred free", |
1932 "deferred free", |
1890 "dedup ditto", |
1933 "dedup ditto", |
|
1934 "other", |
1891 "Total", |
1935 "Total", |
1892 }; |
1936 }; |
1893 |
1937 |
1894 #define ZB_TOTAL DN_MAX_LEVELS |
1938 #define ZB_TOTAL DN_MAX_LEVELS |
1895 |
1939 |
1966 if (bp == NULL) |
2010 if (bp == NULL) |
1967 return (0); |
2011 return (0); |
1968 |
2012 |
1969 type = BP_GET_TYPE(bp); |
2013 type = BP_GET_TYPE(bp); |
1970 |
2014 |
1971 zdb_count_block(zcb, zilog, bp, type); |
2015 zdb_count_block(zcb, zilog, bp, |
1972 |
2016 (type & DMU_OT_NEWTYPE) ? ZDB_OT_OTHER : type); |
1973 is_metadata = (BP_GET_LEVEL(bp) != 0 || dmu_ot[type].ot_metadata); |
2017 |
|
2018 is_metadata = (BP_GET_LEVEL(bp) != 0 || DMU_OT_IS_METADATA(type)); |
1974 |
2019 |
1975 if (dump_opt['c'] > 1 || (dump_opt['c'] && is_metadata)) { |
2020 if (dump_opt['c'] > 1 || (dump_opt['c'] && is_metadata)) { |
1976 int ioerr; |
2021 int ioerr; |
1977 size_t size = BP_GET_PSIZE(bp); |
2022 size_t size = BP_GET_PSIZE(bp); |
1978 void *data = malloc(size); |
2023 void *data = malloc(size); |
2193 */ |
2238 */ |
2194 (void) bpobj_iterate_nofree(&spa->spa_deferred_bpobj, |
2239 (void) bpobj_iterate_nofree(&spa->spa_deferred_bpobj, |
2195 count_block_cb, &zcb, NULL); |
2240 count_block_cb, &zcb, NULL); |
2196 (void) bpobj_iterate_nofree(&spa->spa_dsl_pool->dp_free_bpobj, |
2241 (void) bpobj_iterate_nofree(&spa->spa_dsl_pool->dp_free_bpobj, |
2197 count_block_cb, &zcb, NULL); |
2242 count_block_cb, &zcb, NULL); |
|
2243 if (spa_feature_is_active(spa, |
|
2244 &spa_feature_table[SPA_FEATURE_ASYNC_DESTROY])) { |
|
2245 VERIFY3U(0, ==, bptree_iterate(spa->spa_meta_objset, |
|
2246 spa->spa_dsl_pool->dp_bptree_obj, B_FALSE, count_block_cb, |
|
2247 &zcb, NULL)); |
|
2248 } |
2198 |
2249 |
2199 if (dump_opt['c'] > 1) |
2250 if (dump_opt['c'] > 1) |
2200 flags |= TRAVERSE_PREFETCH_DATA; |
2251 flags |= TRAVERSE_PREFETCH_DATA; |
2201 |
2252 |
2202 zcb.zcb_haderrors |= traverse_pool(spa, 0, flags, zdb_blkptr_cb, &zcb); |
2253 zcb.zcb_haderrors |= traverse_pool(spa, 0, flags, zdb_blkptr_cb, &zcb); |
2369 (u_longlong_t)bp->blk_fill, |
2420 (u_longlong_t)bp->blk_fill, |
2370 avl_numnodes(t)); |
2421 avl_numnodes(t)); |
2371 } |
2422 } |
2372 |
2423 |
2373 if (BP_IS_HOLE(bp) || BP_GET_CHECKSUM(bp) == ZIO_CHECKSUM_OFF || |
2424 if (BP_IS_HOLE(bp) || BP_GET_CHECKSUM(bp) == ZIO_CHECKSUM_OFF || |
2374 BP_GET_LEVEL(bp) > 0 || dmu_ot[BP_GET_TYPE(bp)].ot_metadata) |
2425 BP_GET_LEVEL(bp) > 0 || DMU_OT_IS_METADATA(BP_GET_TYPE(bp))) |
2375 return (0); |
2426 return (0); |
2376 |
2427 |
2377 ddt_key_fill(&zdde_search.zdde_key, bp); |
2428 ddt_key_fill(&zdde_search.zdde_key, bp); |
2378 |
2429 |
2379 zdde = avl_find(t, &zdde_search, &where); |
2430 zdde = avl_find(t, &zdde_search, &where); |
2474 dump_dir(dp->dp_meta_objset); |
2525 dump_dir(dp->dp_meta_objset); |
2475 if (dump_opt['d'] >= 3) { |
2526 if (dump_opt['d'] >= 3) { |
2476 dump_bpobj(&spa->spa_deferred_bpobj, "Deferred frees"); |
2527 dump_bpobj(&spa->spa_deferred_bpobj, "Deferred frees"); |
2477 if (spa_version(spa) >= SPA_VERSION_DEADLISTS) { |
2528 if (spa_version(spa) >= SPA_VERSION_DEADLISTS) { |
2478 dump_bpobj(&spa->spa_dsl_pool->dp_free_bpobj, |
2529 dump_bpobj(&spa->spa_dsl_pool->dp_free_bpobj, |
2479 "Pool frees"); |
2530 "Pool snapshot frees"); |
|
2531 } |
|
2532 |
|
2533 if (spa_feature_is_active(spa, |
|
2534 &spa_feature_table[SPA_FEATURE_ASYNC_DESTROY])) { |
|
2535 dump_bptree(spa->spa_meta_objset, |
|
2536 spa->spa_dsl_pool->dp_bptree_obj, |
|
2537 "Pool dataset frees"); |
2480 } |
2538 } |
2481 dump_dtl(spa->spa_root_vdev, 0); |
2539 dump_dtl(spa->spa_root_vdev, 0); |
2482 } |
2540 } |
2483 (void) dmu_objset_find(spa_name(spa), dump_one_dir, |
2541 (void) dmu_objset_find(spa_name(spa), dump_one_dir, |
2484 NULL, DS_FIND_SNAPSHOTS | DS_FIND_CHILDREN); |
2542 NULL, DS_FIND_SNAPSHOTS | DS_FIND_CHILDREN); |