summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/ocfs2/alloc.c30
1 files changed, 5 insertions, 25 deletions
diff --git a/fs/ocfs2/alloc.c b/fs/ocfs2/alloc.c
index fe2ddbb81f7..d1aa7249deb 100644
--- a/fs/ocfs2/alloc.c
+++ b/fs/ocfs2/alloc.c
@@ -618,34 +618,13 @@ int ocfs2_num_free_extents(struct ocfs2_super *osb,
struct ocfs2_extent_block *eb;
struct buffer_head *eb_bh = NULL;
u64 last_eb_blk = 0;
+ struct ocfs2_extent_tree et;
mlog_entry_void();
- if (type == OCFS2_DINODE_EXTENT) {
- struct ocfs2_dinode *fe =
- (struct ocfs2_dinode *)root_bh->b_data;
- if (!OCFS2_IS_VALID_DINODE(fe)) {
- OCFS2_RO_ON_INVALID_DINODE(inode->i_sb, fe);
- retval = -EIO;
- goto bail;
- }
-
- if (fe->i_last_eb_blk)
- last_eb_blk = le64_to_cpu(fe->i_last_eb_blk);
- el = &fe->id2.i_list;
- } else if (type == OCFS2_XATTR_VALUE_EXTENT) {
- struct ocfs2_xattr_value_root *xv =
- (struct ocfs2_xattr_value_root *) obj;
-
- last_eb_blk = le64_to_cpu(xv->xr_last_eb_blk);
- el = &xv->xr_list;
- } else if (type == OCFS2_XATTR_TREE_EXTENT) {
- struct ocfs2_xattr_block *xb =
- (struct ocfs2_xattr_block *)root_bh->b_data;
-
- last_eb_blk = le64_to_cpu(xb->xb_attrs.xb_root.xt_last_eb_blk);
- el = &xb->xb_attrs.xb_root.xt_list;
- }
+ ocfs2_get_extent_tree(&et, inode, root_bh, type, obj);
+ el = et.et_root_el;
+ last_eb_blk = ocfs2_et_get_last_eb_blk(&et);
if (last_eb_blk) {
retval = ocfs2_read_block(osb, last_eb_blk,
@@ -665,6 +644,7 @@ bail:
if (eb_bh)
brelse(eb_bh);
+ ocfs2_put_extent_tree(&et);
mlog_exit(retval);
return retval;
}