/* * 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; }
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 {