示例#1
0
 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
示例#2
0
 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