def read(self): self.bitmap_blks = [] bitmap_data = "" # get bitmap blocks from root block blocks = self.root_blk.bitmap_ptrs for blk in blocks: if blk == 0: break bm = BitmapBlock(self.blkdev, blk) bm.read() if not bm.valid: raise FSError(INVALID_BITMAP_BLOCK, block=bm) self.bitmap_blks.append(bm) bitmap_data += bm.get_bitmap_data() # now check extended bitmap blocks ext_blk = self.root_blk.bitmap_ext_blk while ext_blk != 0: bm_ext = BitmapExtBlock(self.blkdev, ext_blk) bm_ext.read() self.ext_blks.append(bm_ext) blocks = bm_ext.bitmap_ptrs for blk in blocks: if blk == 0: break bm = BitmapBlock(self.blkdev, blk) bm.read() if not bm.valid: raise FSError(INVALID_BITMAP_BLOCK, block=bm) bitmap_data += bm.get_bitmap_data() self.bitmap_blks.append(bm) ext_blk = bm_ext.bitmap_ext_blk # check bitmap data num_bm_blks = len(self.bitmap_blks) num_bytes = self.bitmap_blk_bytes * num_bm_blks if num_bytes != len(bitmap_data): raise FSError(BITMAP_SIZE_MISMATCH, node=self, extra="got=%d want=%d" % (len(bitmap_data), num_bytes)) if num_bm_blks != self.bitmap_num_blks: raise FSError(BITMAP_BLOCK_COUNT_MISMATCH, node=self, extra="got=%d want=%d" % (self.bitmap_num_blks, num_bm_blks)) # create a modyfiable bitmap self.bitmap_data = ctypes.create_string_buffer(bitmap_data) self.valid = True