예제 #1
0
파일: spa.py 프로젝트: fhriley/zfspy
 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())
예제 #2
0
 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())
예제 #3
0
파일: spa.py 프로젝트: fhriley/zfspy
 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
예제 #4
0
 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