/**********************************************************************//**
Allocates a new file segment inode.
@return segment inode, or NULL if not enough space*/
staticfseg_inode_t*fsp_alloc_seg_inode(/*================*/fsp_header_t* space_header, /*!< in: space header*/mtr_t* mtr) /*!< in/out: mini-transaction*/{
ulint page_no;
buf_block_t*block;
page_t*page;
fseg_inode_t*inode;
ibool success;
ulint zip_size;
ulint n;
ut_ad(page_offset(space_header)==FSP_HEADER_OFFSET);if (flst_get_len(space_header + FSP_SEG_INODES_FREE, mtr) == 0) {/*Allocate a new segment inode page*/success=fsp_alloc_seg_inode_page(space_header, mtr);if (!success) {return(NULL);
}
}
page_no= flst_get_first(space_header +FSP_SEG_INODES_FREE, mtr).page;
zip_size=fsp_flags_get_zip_size(
mach_read_from_4(FSP_SPACE_FLAGS+space_header));
block=buf_page_get(page_get_space_id(page_align(space_header)),
zip_size, page_no, RW_X_LATCH, mtr);
buf_block_dbg_add_level(block, SYNC_FSP_PAGE);
page=buf_block_get_frame(block);
n= fsp_seg_inode_page_find_free(page, 0, zip_size, mtr);
ut_a(n!=ULINT_UNDEFINED);
inode=fsp_seg_inode_page_get_nth_inode(page, n, zip_size, mtr);if (ULINT_UNDEFINED == fsp_seg_inode_page_find_free(page, n + 1,
zip_size, mtr)) {/*There are no other unused headers left on the page: move it
to another list*/flst_remove(space_header+FSP_SEG_INODES_FREE,
page+FSEG_INODE_PAGE_NODE, mtr);
flst_add_last(space_header+FSP_SEG_INODES_FULL,
page+FSEG_INODE_PAGE_NODE, mtr);
}
ut_ad(!mach_read_from_8(inode +FSEG_ID)|| mach_read_from_4(inode + FSEG_MAGIC_N) ==FSEG_MAGIC_N_VALUE);return(inode);
}