def _dircache_add_block(self, update_myself): # allocate block blk_nums = self.volume.bitmap.alloc_n(1) if blk_nums == None: return None # setup dir cache block dcb_num = blk_nums[0] dcb = DirCacheBlock(self.blkdev, dcb_num) dcb.create(parent=self.block.blk_num) # link new cache block if len(self.dcache_blks) == 0: self.block.extension = dcb_num if update_myself: self.block.write() else: last_dcb = self.dcache_blks[-1] last_dcb.next_cache = dcb_num last_dcb.write() self.dcache_blks.append(dcb) return dcb
def read(self, recursive=False): self._init_name_hash() self.entries = [] # create initial list with blk_num/hash_index for dir scan blocks = [] for i in xrange(self.block.hash_size): blk_num = self.block.hash_table[i] if blk_num != 0: blocks.append((blk_num,i)) for blk_num,hash_idx in blocks: # read anonymous block blk = Block(self.blkdev, blk_num) blk.read() if not blk.valid: self.valid = False return # create file/dir node hash_chain,node = self._read_add_node(blk, recursive) # store node in entries self.entries.append(node) # store node in name_hash self.name_hash[hash_idx].append(node) # follow hash chain if hash_chain != 0: blocks.append((hash_chain,hash_idx)) # dircaches available? if self.volume.is_dircache: self.dcache_blks = [] dcb_num = self.block.extension while dcb_num != 0: dcb = DirCacheBlock(self.blkdev, dcb_num) dcb.read() if not dcb.valid: self.valid = False return self.dcache_blks.append(dcb) dcb_num = dcb.next_cache