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 _parse_dva(self, data): dva = OODict() su = StreamUnpacker(data) i = su.uint64() dva.asize = get_bits(i, 0, 24) << SPA_MINBLOCKSHIFT dva.grid = get_bits(i, 24, 8) dva.vdev = get_bits(i, 32, 32) i = su.uint64() dva.offset = get_bits(i, 0, 63) << SPA_MINBLOCKSHIFT if get_bits(i, 63, 1): dva.G = True else: dva.G = False return dva
def _parse_dva(self, data): dva = OODict() su = StreamUnpacker(data) i = su.uint64() dva.asize = get_bits(i, 0, 24) << SPA_MINBLOCKSHIFT dva.grid = get_bits(i, 24, 8) dva.vdev = get_bits(i, 32, 32) i = su.uint64() dva.offset = get_bits(i, 0, 63) << SPA_MINBLOCKSHIFT if get_bits(i, 63, 1): dva.G = True else: dva.G = False return dva