예제 #1
0
/*
 * ext4_new_meta_blocks() -- allocate block for meta data (indexing) blocks
 *
 * @handle:             handle to this transaction
 * @inode:              file inode
 * @goal:               given target block(filesystem wide)
 * @count:		total number of blocks need
 * @errp:               error code
 *
 * Return 1st allocated block numberon success, *count stores total account
 * error stores in errp pointer
 */
ext4_fsblk_t ext4_new_meta_blocks(handle_t *handle, struct inode *inode,
		ext4_fsblk_t goal, unsigned long *count, int *errp)
{
	ext4_fsblk_t ret;
	ret = do_blk_alloc(handle, inode, 0, goal,
				count, errp, EXT4_META_BLOCK);
	/*
	 * Account for the allocated meta blocks
	 */
	if (!(*errp) && EXT4_I(inode)->i_delalloc_reserved_flag) {
		spin_lock(&EXT4_I(inode)->i_block_reservation_lock);
		EXT4_I(inode)->i_allocated_meta_blocks += *count;
		spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
	}
	return ret;
}
예제 #2
0
ext4_fsblk_t ext4_new_blocks(handle_t *handle, struct inode *inode,
				ext4_lblk_t iblock, ext4_fsblk_t goal,
				unsigned long *count, int *errp)
{
	return do_blk_alloc(handle, inode, iblock, goal, count, errp, 0);
}
int _xlate_pro_add_range_ps32(xlate_table_pro tab,
        Block_s     **ppblk_head,
        Block_s     **ppblk_tail,
        Elf64_Addr    inew_addr,
        Elf64_Xword   inew_range,
        Elf64_Addr    iold_addr,
        Elf64_Xword   iold_range,
        highwater_mark *highwater)
{
	int retstatus = XLATE_TB_STATUS_NO_ERROR;

	Elf32_Addr new_addr = (Elf32_Addr)inew_addr;
	Elf32_Addr old_addr = (Elf32_Addr)iold_addr;
	Elf32_Word new_range = (Elf32_Addr)inew_range;
	Elf32_Word old_range = (Elf32_Addr)iold_range;
	Block_s *pblk_tail;
	char *range_buffer;
	Elf32_Word lnewaddr;
	Elf32_Sword loldaddr;
	int bufused;
	Uword byteoff;

        if(*ppblk_head == 0) {
	  retstatus = do_blk_alloc(tab,ppblk_head,ppblk_tail,
		inew_addr,inew_range,iold_addr,iold_range);
	  if(retstatus != XLATE_TB_STATUS_NO_ERROR) {
		return retstatus;
	  }
	  pblk_tail = *ppblk_tail;
	  byteoff = pblk_tail->bk_next_data_to_use;
	  range_buffer = pblk_tail->bk_data + byteoff;
	  lnewaddr = (Elf32_Word)inew_range;
	  loldaddr = 0;
        } else {
	  pblk_tail = *ppblk_tail;
	  if(inew_addr !=  (pblk_tail->bk_prev_new_addr
			+ pblk_tail->bk_prev_new_range)) {
		return XLATE_TB_STATUS_INVALID_SEQUENCE;
	  }
	  byteoff = pblk_tail->bk_next_data_to_use;
	  range_buffer = pblk_tail->bk_data + byteoff;
	  lnewaddr = (Elf32_Word)inew_range;
	  loldaddr = (Elf32_Sword)
		((Elf32_Addr)old_addr - 
			(Elf32_Addr)(pblk_tail->bk_prev_old_addr));
	}
	if(inew_range != iold_range) {
		return XLATE_TB_STATUS_UNEQUAL_RANGE;
	}


	bufused = _leb128_unsigned_encode32(lnewaddr>>2,range_buffer);
	bufused += _leb128_signed_encode32(loldaddr>>2,range_buffer + bufused);

	if((bufused + byteoff) > TB_BLOCK_SIZE) {
	  Block_s *newtail;
	  char * lclbuf;
	  /* Ran off end of desired area into slop area. 
	  */
	  _xlate_final_update_highwater_addrs(tab,pblk_tail,highwater);

	  /*
		Get new block 
	  */
	  retstatus = do_blk_alloc(tab,ppblk_head,ppblk_tail,
                inew_addr,inew_range,iold_addr,iold_range);
          if(retstatus != XLATE_TB_STATUS_NO_ERROR) {
                return retstatus;
          }
          newtail = *ppblk_tail;
	  lclbuf = newtail->bk_data;
	  lnewaddr = (Elf32_Word)inew_range;
	  loldaddr = 0;
  
	  bufused = _leb128_unsigned_encode32(lnewaddr>>2,lclbuf);
	  bufused += _leb128_signed_encode32(loldaddr>>2,lclbuf + bufused);
	  newtail->bk_next_data_to_use += bufused;
	  newtail->bk_numEntries++;
	  
	} else {