xref: /freebsd/sys/contrib/openzfs/lib/libzdb/libzdb.c (revision 783d3ff6d7fae619db8a7990b8a6387de0c677b5)
1a4e5e010SMartin Matuska #include <stdio.h>
2a4e5e010SMartin Matuska #include <unistd.h>
3a4e5e010SMartin Matuska #include <stdlib.h>
4a4e5e010SMartin Matuska #include <ctype.h>
5a4e5e010SMartin Matuska #include <getopt.h>
6a4e5e010SMartin Matuska #include <openssl/evp.h>
7a4e5e010SMartin Matuska #include <sys/zfs_context.h>
8a4e5e010SMartin Matuska #include <sys/spa.h>
9a4e5e010SMartin Matuska #include <sys/spa_impl.h>
10a4e5e010SMartin Matuska #include <sys/dmu.h>
11a4e5e010SMartin Matuska #include <sys/zap.h>
12a4e5e010SMartin Matuska #include <sys/fs/zfs.h>
13a4e5e010SMartin Matuska #include <sys/zfs_znode.h>
14a4e5e010SMartin Matuska #include <sys/zfs_sa.h>
15a4e5e010SMartin Matuska #include <sys/sa.h>
16a4e5e010SMartin Matuska #include <sys/sa_impl.h>
17a4e5e010SMartin Matuska #include <sys/vdev.h>
18a4e5e010SMartin Matuska #include <sys/vdev_impl.h>
19a4e5e010SMartin Matuska #include <sys/metaslab_impl.h>
20a4e5e010SMartin Matuska #include <sys/dmu_objset.h>
21a4e5e010SMartin Matuska #include <sys/dsl_dir.h>
22a4e5e010SMartin Matuska #include <sys/dsl_dataset.h>
23a4e5e010SMartin Matuska #include <sys/dsl_pool.h>
24a4e5e010SMartin Matuska #include <sys/dsl_bookmark.h>
25a4e5e010SMartin Matuska #include <sys/dbuf.h>
26a4e5e010SMartin Matuska #include <sys/zil.h>
27a4e5e010SMartin Matuska #include <sys/zil_impl.h>
28a4e5e010SMartin Matuska #include <sys/stat.h>
29a4e5e010SMartin Matuska #include <sys/resource.h>
30a4e5e010SMartin Matuska #include <sys/dmu_send.h>
31a4e5e010SMartin Matuska #include <sys/dmu_traverse.h>
32a4e5e010SMartin Matuska #include <sys/zio_checksum.h>
33a4e5e010SMartin Matuska #include <sys/zio_compress.h>
34a4e5e010SMartin Matuska #include <sys/zfs_fuid.h>
35a4e5e010SMartin Matuska #include <sys/arc.h>
36a4e5e010SMartin Matuska #include <sys/arc_impl.h>
37a4e5e010SMartin Matuska #include <sys/ddt.h>
38a4e5e010SMartin Matuska #include <sys/zfeature.h>
39a4e5e010SMartin Matuska #include <sys/abd.h>
40a4e5e010SMartin Matuska #include <sys/blkptr.h>
41a4e5e010SMartin Matuska #include <sys/dsl_crypt.h>
42a4e5e010SMartin Matuska #include <sys/dsl_scan.h>
43a4e5e010SMartin Matuska #include <sys/btree.h>
44a4e5e010SMartin Matuska #include <sys/brt.h>
45a4e5e010SMartin Matuska #include <sys/brt_impl.h>
46a4e5e010SMartin Matuska #include <zfs_comutil.h>
47a4e5e010SMartin Matuska #include <sys/zstd/zstd.h>
48a4e5e010SMartin Matuska 
49a4e5e010SMartin Matuska #include <libnvpair.h>
50a4e5e010SMartin Matuska #include <libzutil.h>
51a4e5e010SMartin Matuska 
52a4e5e010SMartin Matuska #include <libzdb.h>
53a4e5e010SMartin Matuska 
54a4e5e010SMartin Matuska const char *
zdb_ot_name(dmu_object_type_t type)55a4e5e010SMartin Matuska zdb_ot_name(dmu_object_type_t type)
56a4e5e010SMartin Matuska {
57a4e5e010SMartin Matuska 	if (type < DMU_OT_NUMTYPES)
58a4e5e010SMartin Matuska 		return (dmu_ot[type].ot_name);
59a4e5e010SMartin Matuska 	else if ((type & DMU_OT_NEWTYPE) &&
60a4e5e010SMartin Matuska 	    ((type & DMU_OT_BYTESWAP_MASK) < DMU_BSWAP_NUMFUNCS))
61a4e5e010SMartin Matuska 		return (dmu_ot_byteswap[type & DMU_OT_BYTESWAP_MASK].ob_name);
62a4e5e010SMartin Matuska 	else
63a4e5e010SMartin Matuska 		return ("UNKNOWN");
64a4e5e010SMartin Matuska }
65a4e5e010SMartin Matuska 
66a4e5e010SMartin Matuska int
livelist_compare(const void * larg,const void * rarg)67a4e5e010SMartin Matuska livelist_compare(const void *larg, const void *rarg)
68a4e5e010SMartin Matuska {
69a4e5e010SMartin Matuska 	const blkptr_t *l = larg;
70a4e5e010SMartin Matuska 	const blkptr_t *r = rarg;
71a4e5e010SMartin Matuska 
72a4e5e010SMartin Matuska 	/* Sort them according to dva[0] */
73a4e5e010SMartin Matuska 	uint64_t l_dva0_vdev, r_dva0_vdev;
74a4e5e010SMartin Matuska 	l_dva0_vdev = DVA_GET_VDEV(&l->blk_dva[0]);
75a4e5e010SMartin Matuska 	r_dva0_vdev = DVA_GET_VDEV(&r->blk_dva[0]);
76a4e5e010SMartin Matuska 	if (l_dva0_vdev < r_dva0_vdev)
77a4e5e010SMartin Matuska 		return (-1);
78a4e5e010SMartin Matuska 	else if (l_dva0_vdev > r_dva0_vdev)
79a4e5e010SMartin Matuska 		return (+1);
80a4e5e010SMartin Matuska 
81a4e5e010SMartin Matuska 	/* if vdevs are equal, sort by offsets. */
82a4e5e010SMartin Matuska 	uint64_t l_dva0_offset;
83a4e5e010SMartin Matuska 	uint64_t r_dva0_offset;
84a4e5e010SMartin Matuska 	l_dva0_offset = DVA_GET_OFFSET(&l->blk_dva[0]);
85a4e5e010SMartin Matuska 	r_dva0_offset = DVA_GET_OFFSET(&r->blk_dva[0]);
86a4e5e010SMartin Matuska 	if (l_dva0_offset < r_dva0_offset) {
87a4e5e010SMartin Matuska 		return (-1);
88a4e5e010SMartin Matuska 	} else if (l_dva0_offset > r_dva0_offset) {
89a4e5e010SMartin Matuska 		return (+1);
90a4e5e010SMartin Matuska 	}
91a4e5e010SMartin Matuska 
92a4e5e010SMartin Matuska 	/*
93a4e5e010SMartin Matuska 	 * Since we're storing blkptrs without cancelling FREE/ALLOC pairs,
94a4e5e010SMartin Matuska 	 * it's possible the offsets are equal. In that case, sort by txg
95a4e5e010SMartin Matuska 	 */
96*783d3ff6SMartin Matuska 	if (BP_GET_LOGICAL_BIRTH(l) < BP_GET_LOGICAL_BIRTH(r)) {
97a4e5e010SMartin Matuska 		return (-1);
98*783d3ff6SMartin Matuska 	} else if (BP_GET_LOGICAL_BIRTH(l) > BP_GET_LOGICAL_BIRTH(r)) {
99a4e5e010SMartin Matuska 		return (+1);
100a4e5e010SMartin Matuska 	}
101a4e5e010SMartin Matuska 	return (0);
102a4e5e010SMartin Matuska }
103