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 Matuskazdb_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 Matuskalivelist_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