ocfs2: Use ocfs2_extent_list instead of ocfs2_dinode.
ocfs2_extend_meta_needed(), ocfs2_calc_extend_credits() and ocfs2_reserve_new_metadata() are all useful for extent tree operations. But they are all limited to an inode btree because they use a struct ocfs2_dinode parameter. Change their parameter to struct ocfs2_extent_list (the part of an ocfs2_dinode they actually use) so that the xattr btree code can use these functions. Signed-off-by: Tao Ma <tao.ma@oracle.com> Signed-off-by: Mark Fasheh <mfasheh@suse.com>
This commit is contained in:
@@ -4527,7 +4527,8 @@ static int ocfs2_split_tree(struct inode *inode, struct buffer_head *di_bh,
|
|||||||
} else
|
} else
|
||||||
rightmost_el = path_leaf_el(path);
|
rightmost_el = path_leaf_el(path);
|
||||||
|
|
||||||
credits += path->p_tree_depth + ocfs2_extend_meta_needed(di);
|
credits += path->p_tree_depth +
|
||||||
|
ocfs2_extend_meta_needed(&di->id2.i_list);
|
||||||
ret = ocfs2_extend_trans(handle, credits);
|
ret = ocfs2_extend_trans(handle, credits);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
mlog_errno(ret);
|
mlog_errno(ret);
|
||||||
|
@@ -48,8 +48,14 @@ int ocfs2_remove_extent(struct inode *inode, struct buffer_head *di_bh,
|
|||||||
int ocfs2_num_free_extents(struct ocfs2_super *osb,
|
int ocfs2_num_free_extents(struct ocfs2_super *osb,
|
||||||
struct inode *inode,
|
struct inode *inode,
|
||||||
struct buffer_head *bh);
|
struct buffer_head *bh);
|
||||||
/* how many new metadata chunks would an allocation need at maximum? */
|
/*
|
||||||
static inline int ocfs2_extend_meta_needed(struct ocfs2_dinode *fe)
|
* how many new metadata chunks would an allocation need at maximum?
|
||||||
|
*
|
||||||
|
* Please note that the caller must make sure that root_el is the root
|
||||||
|
* of extent tree. So for an inode, it should be &fe->id2.i_list. Otherwise
|
||||||
|
* the result may be wrong.
|
||||||
|
*/
|
||||||
|
static inline int ocfs2_extend_meta_needed(struct ocfs2_extent_list *root_el)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Rather than do all the work of determining how much we need
|
* Rather than do all the work of determining how much we need
|
||||||
@@ -59,7 +65,7 @@ static inline int ocfs2_extend_meta_needed(struct ocfs2_dinode *fe)
|
|||||||
* new tree_depth==0 extent_block, and one block at the new
|
* new tree_depth==0 extent_block, and one block at the new
|
||||||
* top-of-the tree.
|
* top-of-the tree.
|
||||||
*/
|
*/
|
||||||
return le16_to_cpu(fe->id2.i_list.l_tree_depth) + 2;
|
return le16_to_cpu(root_el->l_tree_depth) + 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ocfs2_dinode_new_extent_list(struct inode *inode, struct ocfs2_dinode *di);
|
void ocfs2_dinode_new_extent_list(struct inode *inode, struct ocfs2_dinode *di);
|
||||||
|
@@ -1720,7 +1720,8 @@ int ocfs2_write_begin_nolock(struct address_space *mapping,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
credits = ocfs2_calc_extend_credits(inode->i_sb, di,
|
credits = ocfs2_calc_extend_credits(inode->i_sb,
|
||||||
|
&di->id2.i_list,
|
||||||
clusters_to_alloc);
|
clusters_to_alloc);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -1430,6 +1430,7 @@ static int ocfs2_extend_dir(struct ocfs2_super *osb,
|
|||||||
int credits, num_free_extents, drop_alloc_sem = 0;
|
int credits, num_free_extents, drop_alloc_sem = 0;
|
||||||
loff_t dir_i_size;
|
loff_t dir_i_size;
|
||||||
struct ocfs2_dinode *fe = (struct ocfs2_dinode *) parent_fe_bh->b_data;
|
struct ocfs2_dinode *fe = (struct ocfs2_dinode *) parent_fe_bh->b_data;
|
||||||
|
struct ocfs2_extent_list *el = &fe->id2.i_list;
|
||||||
struct ocfs2_alloc_context *data_ac = NULL;
|
struct ocfs2_alloc_context *data_ac = NULL;
|
||||||
struct ocfs2_alloc_context *meta_ac = NULL;
|
struct ocfs2_alloc_context *meta_ac = NULL;
|
||||||
handle_t *handle = NULL;
|
handle_t *handle = NULL;
|
||||||
@@ -1488,7 +1489,7 @@ static int ocfs2_extend_dir(struct ocfs2_super *osb,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!num_free_extents) {
|
if (!num_free_extents) {
|
||||||
status = ocfs2_reserve_new_metadata(osb, fe, &meta_ac);
|
status = ocfs2_reserve_new_metadata(osb, el, &meta_ac);
|
||||||
if (status < 0) {
|
if (status < 0) {
|
||||||
if (status != -ENOSPC)
|
if (status != -ENOSPC)
|
||||||
mlog_errno(status);
|
mlog_errno(status);
|
||||||
@@ -1503,7 +1504,7 @@ static int ocfs2_extend_dir(struct ocfs2_super *osb,
|
|||||||
goto bail;
|
goto bail;
|
||||||
}
|
}
|
||||||
|
|
||||||
credits = ocfs2_calc_extend_credits(sb, fe, 1);
|
credits = ocfs2_calc_extend_credits(sb, el, 1);
|
||||||
} else {
|
} else {
|
||||||
spin_unlock(&OCFS2_I(dir)->ip_lock);
|
spin_unlock(&OCFS2_I(dir)->ip_lock);
|
||||||
credits = OCFS2_SIMPLE_DIR_EXTEND_CREDITS;
|
credits = OCFS2_SIMPLE_DIR_EXTEND_CREDITS;
|
||||||
|
@@ -540,7 +540,7 @@ int ocfs2_do_extend_allocation(struct ocfs2_super *osb,
|
|||||||
goto leave;
|
goto leave;
|
||||||
} else if ((!free_extents)
|
} else if ((!free_extents)
|
||||||
&& (ocfs2_alloc_context_bits_left(meta_ac)
|
&& (ocfs2_alloc_context_bits_left(meta_ac)
|
||||||
< ocfs2_extend_meta_needed(fe))) {
|
< ocfs2_extend_meta_needed(&fe->id2.i_list))) {
|
||||||
mlog(0, "filesystem is really fragmented...\n");
|
mlog(0, "filesystem is really fragmented...\n");
|
||||||
status = -EAGAIN;
|
status = -EAGAIN;
|
||||||
reason = RESTART_META;
|
reason = RESTART_META;
|
||||||
@@ -652,7 +652,7 @@ int ocfs2_lock_allocators(struct inode *inode, struct buffer_head *di_bh,
|
|||||||
*/
|
*/
|
||||||
if (!num_free_extents ||
|
if (!num_free_extents ||
|
||||||
(ocfs2_sparse_alloc(osb) && num_free_extents < max_recs_needed)) {
|
(ocfs2_sparse_alloc(osb) && num_free_extents < max_recs_needed)) {
|
||||||
ret = ocfs2_reserve_new_metadata(osb, di, meta_ac);
|
ret = ocfs2_reserve_new_metadata(osb, &di->id2.i_list, meta_ac);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
if (ret != -ENOSPC)
|
if (ret != -ENOSPC)
|
||||||
mlog_errno(ret);
|
mlog_errno(ret);
|
||||||
@@ -732,7 +732,8 @@ restart_all:
|
|||||||
goto leave;
|
goto leave;
|
||||||
}
|
}
|
||||||
|
|
||||||
credits = ocfs2_calc_extend_credits(osb->sb, fe, clusters_to_add);
|
credits = ocfs2_calc_extend_credits(osb->sb, &fe->id2.i_list,
|
||||||
|
clusters_to_add);
|
||||||
handle = ocfs2_start_trans(osb, credits);
|
handle = ocfs2_start_trans(osb, credits);
|
||||||
if (IS_ERR(handle)) {
|
if (IS_ERR(handle)) {
|
||||||
status = PTR_ERR(handle);
|
status = PTR_ERR(handle);
|
||||||
@@ -790,7 +791,7 @@ restarted_transaction:
|
|||||||
mlog(0, "restarting transaction.\n");
|
mlog(0, "restarting transaction.\n");
|
||||||
/* TODO: This can be more intelligent. */
|
/* TODO: This can be more intelligent. */
|
||||||
credits = ocfs2_calc_extend_credits(osb->sb,
|
credits = ocfs2_calc_extend_credits(osb->sb,
|
||||||
fe,
|
&fe->id2.i_list,
|
||||||
clusters_to_add);
|
clusters_to_add);
|
||||||
status = ocfs2_extend_trans(handle, credits);
|
status = ocfs2_extend_trans(handle, credits);
|
||||||
if (status < 0) {
|
if (status < 0) {
|
||||||
|
@@ -340,11 +340,16 @@ int ocfs2_journal_dirty_data(handle_t *handle,
|
|||||||
#define OCFS2_RENAME_CREDITS (3 * OCFS2_INODE_UPDATE_CREDITS + 3 \
|
#define OCFS2_RENAME_CREDITS (3 * OCFS2_INODE_UPDATE_CREDITS + 3 \
|
||||||
+ OCFS2_UNLINK_CREDITS)
|
+ OCFS2_UNLINK_CREDITS)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Please note that the caller must make sure that root_el is the root
|
||||||
|
* of extent tree. So for an inode, it should be &fe->id2.i_list. Otherwise
|
||||||
|
* the result may be wrong.
|
||||||
|
*/
|
||||||
static inline int ocfs2_calc_extend_credits(struct super_block *sb,
|
static inline int ocfs2_calc_extend_credits(struct super_block *sb,
|
||||||
struct ocfs2_dinode *fe,
|
struct ocfs2_extent_list *root_el,
|
||||||
u32 bits_wanted)
|
u32 bits_wanted)
|
||||||
{
|
{
|
||||||
int bitmap_blocks, sysfile_bitmap_blocks, dinode_blocks;
|
int bitmap_blocks, sysfile_bitmap_blocks, extent_blocks;
|
||||||
|
|
||||||
/* bitmap dinode, group desc. + relinked group. */
|
/* bitmap dinode, group desc. + relinked group. */
|
||||||
bitmap_blocks = OCFS2_SUBALLOC_ALLOC;
|
bitmap_blocks = OCFS2_SUBALLOC_ALLOC;
|
||||||
@@ -355,16 +360,16 @@ static inline int ocfs2_calc_extend_credits(struct super_block *sb,
|
|||||||
* however many metadata chunks needed * a remaining suballoc
|
* however many metadata chunks needed * a remaining suballoc
|
||||||
* alloc. */
|
* alloc. */
|
||||||
sysfile_bitmap_blocks = 1 +
|
sysfile_bitmap_blocks = 1 +
|
||||||
(OCFS2_SUBALLOC_ALLOC - 1) * ocfs2_extend_meta_needed(fe);
|
(OCFS2_SUBALLOC_ALLOC - 1) * ocfs2_extend_meta_needed(root_el);
|
||||||
|
|
||||||
/* this does not include *new* metadata blocks, which are
|
/* this does not include *new* metadata blocks, which are
|
||||||
* accounted for in sysfile_bitmap_blocks. fe +
|
* accounted for in sysfile_bitmap_blocks. root_el +
|
||||||
* prev. last_eb_blk + blocks along edge of tree.
|
* prev. last_eb_blk + blocks along edge of tree.
|
||||||
* calc_symlink_credits passes because we just need 1
|
* calc_symlink_credits passes because we just need 1
|
||||||
* credit for the dinode there. */
|
* credit for the dinode there. */
|
||||||
dinode_blocks = 1 + 1 + le16_to_cpu(fe->id2.i_list.l_tree_depth);
|
extent_blocks = 1 + 1 + le16_to_cpu(root_el->l_tree_depth);
|
||||||
|
|
||||||
return bitmap_blocks + sysfile_bitmap_blocks + dinode_blocks;
|
return bitmap_blocks + sysfile_bitmap_blocks + extent_blocks;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int ocfs2_calc_symlink_credits(struct super_block *sb)
|
static inline int ocfs2_calc_symlink_credits(struct super_block *sb)
|
||||||
|
@@ -494,7 +494,7 @@ bail:
|
|||||||
}
|
}
|
||||||
|
|
||||||
int ocfs2_reserve_new_metadata(struct ocfs2_super *osb,
|
int ocfs2_reserve_new_metadata(struct ocfs2_super *osb,
|
||||||
struct ocfs2_dinode *fe,
|
struct ocfs2_extent_list *root_el,
|
||||||
struct ocfs2_alloc_context **ac)
|
struct ocfs2_alloc_context **ac)
|
||||||
{
|
{
|
||||||
int status;
|
int status;
|
||||||
@@ -507,7 +507,7 @@ int ocfs2_reserve_new_metadata(struct ocfs2_super *osb,
|
|||||||
goto bail;
|
goto bail;
|
||||||
}
|
}
|
||||||
|
|
||||||
(*ac)->ac_bits_wanted = ocfs2_extend_meta_needed(fe);
|
(*ac)->ac_bits_wanted = ocfs2_extend_meta_needed(root_el);
|
||||||
(*ac)->ac_which = OCFS2_AC_USE_META;
|
(*ac)->ac_which = OCFS2_AC_USE_META;
|
||||||
slot = osb->slot_num;
|
slot = osb->slot_num;
|
||||||
(*ac)->ac_group_search = ocfs2_block_group_search;
|
(*ac)->ac_group_search = ocfs2_block_group_search;
|
||||||
|
@@ -59,8 +59,13 @@ static inline int ocfs2_alloc_context_bits_left(struct ocfs2_alloc_context *ac)
|
|||||||
return ac->ac_bits_wanted - ac->ac_bits_given;
|
return ac->ac_bits_wanted - ac->ac_bits_given;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Please note that the caller must make sure that root_el is the root
|
||||||
|
* of extent tree. So for an inode, it should be &fe->id2.i_list. Otherwise
|
||||||
|
* the result may be wrong.
|
||||||
|
*/
|
||||||
int ocfs2_reserve_new_metadata(struct ocfs2_super *osb,
|
int ocfs2_reserve_new_metadata(struct ocfs2_super *osb,
|
||||||
struct ocfs2_dinode *fe,
|
struct ocfs2_extent_list *root_el,
|
||||||
struct ocfs2_alloc_context **ac);
|
struct ocfs2_alloc_context **ac);
|
||||||
int ocfs2_reserve_new_inode(struct ocfs2_super *osb,
|
int ocfs2_reserve_new_inode(struct ocfs2_super *osb,
|
||||||
struct ocfs2_alloc_context **ac);
|
struct ocfs2_alloc_context **ac);
|
||||||
|
Reference in New Issue
Block a user