Commit 811f933d authored by Tao Ma's avatar Tao Ma Committed by Mark Fasheh

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: default avatarTao Ma <tao.ma@oracle.com>
Signed-off-by: default avatarMark Fasheh <mfasheh@suse.com>
parent 231b87d1
...@@ -4527,7 +4527,8 @@ static int ocfs2_split_tree(struct inode *inode, struct buffer_head *di_bh, ...@@ -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, ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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 @@ static int __ocfs2_extend_allocation(struct inode *inode, u32 logical_start, ...@@ -732,7 +732,8 @@ static int __ocfs2_extend_allocation(struct inode *inode, u32 logical_start,
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 @@ static int __ocfs2_extend_allocation(struct inode *inode, u32 logical_start, ...@@ -790,7 +791,7 @@ static int __ocfs2_extend_allocation(struct inode *inode, u32 logical_start,
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, ...@@ -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, ...@@ -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 @@ static int ocfs2_reserve_suballoc_bits(struct ocfs2_super *osb, ...@@ -494,7 +494,7 @@ static int ocfs2_reserve_suballoc_bits(struct ocfs2_super *osb,
} }
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, ...@@ -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) ...@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment