def __init__(self, data = None): if data: self.dva = [] dva_size = 16 for dva in split_records(data[0 : dva_size * 3], dva_size): self.dva.append(self._parse_dva(dva)) su = StreamUnpacker(data[dva_size * 3 :]) i = su.uint64() #see lib/libzfscommon/include/sys/spa.h self.lsize = (get_bits(i, 0, 16) + 1) << SPA_MINBLOCKSHIFT self.psize = (get_bits(i, 16, 16) + 1) << SPA_MINBLOCKSHIFT self.comp = get_bits(i, 32, 8) self.cksum = get_bits(i, 40, 8) self.type = get_bits(i, 48, 8) self.level = get_bits(i, 56, 5) if get_bits(i, 63, 1): self.endian = '<' # little endian else: self.endian = '>' # big self.cksum = ['unknown', 'on', 'off', 'label', 'gang header', 'zilog', 'fletcher2', 'fletcher4', 'SHA-256'][self.cksum] self.comp = ['unknown', 'on', 'off', 'lzjb'][self.comp] self.type = self.type su.rewind(-24) # skip 24b paddings self.birth_txg, self.fill_count = su.repeat('uint64', 2) self.checksum = [] for i in range(4): self.checksum.append(su.uint64())
def __init__(self, data=None): if data: self.dva = [] dva_size = 16 for dva in split_records(data[0:dva_size * 3], dva_size): self.dva.append(self._parse_dva(dva)) su = StreamUnpacker(data[dva_size * 3:]) i = su.uint64() #see lib/libzfscommon/include/sys/spa.h self.lsize = (get_bits(i, 0, 16) + 1) << SPA_MINBLOCKSHIFT self.psize = (get_bits(i, 16, 16) + 1) << SPA_MINBLOCKSHIFT self.comp = get_bits(i, 32, 8) self.cksum = get_bits(i, 40, 8) self.type = get_bits(i, 48, 8) self.level = get_bits(i, 56, 5) if get_bits(i, 63, 1): self.endian = '<' # little endian else: self.endian = '>' # big self.cksum = [ 'unknown', 'on', 'off', 'label', 'gang header', 'zilog', 'fletcher2', 'fletcher4', 'SHA-256' ][self.cksum] self.comp = ['unknown', 'on', 'off', 'lzjb'][self.comp] self.type = self.type su.rewind(-24) # skip 24b paddings self.birth_txg, self.fill_count = su.repeat('uint64', 2) self.checksum = [] for i in range(4): self.checksum.append(su.uint64())
def __init__(self, vdev, data): if not data: return self.vdev = vdev su = StreamUnpacker(data) self.type, self.indblkshift, self.nlevels, self.nblkptr, self.bonustype, \ self.checksum, self.compress, pad = su.repeat('uint8', 8) self.type = DMU_OBJTYPE[self.type] self.datablkszsec, self.bonuslen = su.repeat('uint16', 2) su.rewind(-4) self.maxblkid, self.secphys, pad = su.repeat('uint64', 3) bonus_offset = DNODE_CORE_SIZE + BlockPtr_SIZE * self.nblkptr self.blkptr = [] for blk in split_records(data[DNODE_CORE_SIZE : bonus_offset], BlockPtr_SIZE): bp = BlockPtr(blk) if not bp.is_hole(): self.blkptr.append(bp) self.bonus = data[bonus_offset : bonus_offset + self.bonuslen] debug('dnode type=%s nlevels=%s nblkptr=%s bonustype=%s maxblkid=%s' % \ (self.type, self.nlevels, self.nblkptr, self.bonustype, self.maxblkid))
def __init__(self, vdev, data): if not data: return self.vdev = vdev su = StreamUnpacker(data) self.type, self.indblkshift, self.nlevels, self.nblkptr, self.bonustype, \ self.checksum, self.compress, pad = su.repeat('uint8', 8) self.type = DMU_OBJTYPE[self.type] self.datablkszsec, self.bonuslen = su.repeat('uint16', 2) su.rewind(-4) self.maxblkid, self.secphys, pad = su.repeat('uint64', 3) bonus_offset = DNODE_CORE_SIZE + BlockPtr_SIZE * self.nblkptr self.blkptr = [] for blk in split_records(data[DNODE_CORE_SIZE:bonus_offset], BlockPtr_SIZE): bp = BlockPtr(blk) if not bp.is_hole(): self.blkptr.append(bp) self.bonus = data[bonus_offset:bonus_offset + self.bonuslen] debug('dnode type=%s nlevels=%s nblkptr=%s bonustype=%s maxblkid=%s' % \ (self.type, self.nlevels, self.nblkptr, self.bonustype, self.maxblkid))