[Ocfs2-devel] [PATCH 3/3] Extent tree operation refactoring.take 1

Mark Fasheh mfasheh at suse.com
Thu Apr 3 16:20:10 PDT 2008


On Fri, Mar 28, 2008 at 04:45:59PM +0800, Tao Ma wrote:
> In the old extent tree operation, we take the hypothesis that we
> are using the ocfs2_extent_list in ocfs2_dinode as the tree root.
> As xattr will also use ocfs2_extent_list to store large values
> xattr enty, we refactor the tree operation so that xattr can use
> it directly.
> 
> The refactoring includes 3 steps:
> 1. Abstract the set/get of last_eb_blk since it may be stored
>    in different location for dinode and xattr.
> 2. Add a new structure named ocfs2_extent_tree to indicate the
>    extent tree the operation will work on.
> 3. Remove all the use of fe_bh and di, use root_bh and root_el in
>    extent tree instead. So now all the fe_bh is replaced with
>    et->root_bh, el with root_el accordingly.

Most of this looks fine - I've got a couple of comments below.


> +static void ocfs2_free_extent_tree(struct ocfs2_extent_tree *et)
> +{
> +	if (et) {
> +		brelse(et->root_bh);
> +		kfree(et);
> +	}
> +}
> +
> +static int ocfs2_extent_tree_sanity_check(struct inode *inode,
> +					  struct ocfs2_extent_tree *et)
> +{
> +	int ret = 0;

Wouldn't it be cleaner if this were also a callback type in struct
ocfs2_extent_tree_operations?


> +	/* current we only support dinode extent. */
> +	BUG_ON(et->type != OCFS2_DINODE_EXTENT);
> +	if (et->type == OCFS2_DINODE_EXTENT) {
> +		struct ocfs2_dinode *di;
> +
> +		di = (struct ocfs2_dinode *)et->root_bh->b_data;
> +		if (!OCFS2_IS_VALID_DINODE(di)) {
> +			ret = -EIO;
> +			ocfs2_error(inode->i_sb,
> +				"Inode %llu has invalid path root",
> +				(unsigned long long)OCFS2_I(inode)->ip_blkno);
> +		}
> +	}
> +
> +	return ret;
> +}
> +
>  static void ocfs2_free_truncate_context(struct ocfs2_truncate_context *tc);
>  static int ocfs2_cache_extent_block_free(struct ocfs2_cached_dealloc_ctxt *ctxt,
>  					 struct ocfs2_extent_block *eb);
> @@ -205,17 +294,6 @@ static struct ocfs2_path *ocfs2_new_path(struct buffer_head *root_bh,
>  }
>  
>  /*
> - * Allocate and initialize a new path based on a disk inode tree.
> - */
> -static struct ocfs2_path *ocfs2_new_inode_path(struct buffer_head *di_bh)
> -{
> -	struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data;
> -	struct ocfs2_extent_list *el = &di->id2.i_list;
> -
> -	return ocfs2_new_path(di_bh, el);
> -}
> -
> -/*
>   * Convenience function to journal all components in a path.
>   */
>  static int ocfs2_journal_access_path(struct inode *inode, handle_t *handle,
> @@ -368,24 +446,35 @@ struct ocfs2_merge_ctxt {
>   */
>  int ocfs2_num_free_extents(struct ocfs2_super *osb,
>  			   struct inode *inode,
> -			   struct buffer_head *bh)
> +			   struct buffer_head *root_bh,
> +			   enum ocfs2_extent_tree_type type)
>  {
>  	int retval;
> -	struct ocfs2_extent_list *el;
> +	struct ocfs2_extent_list *el = NULL;
>  	struct ocfs2_extent_block *eb;
>  	struct buffer_head *eb_bh = NULL;
> -	struct ocfs2_dinode *fe = (struct ocfs2_dinode *)bh->b_data;
> +	u64 last_eb_blk = 0;
>  
>  	mlog_entry_void();
>  
> -	if (!OCFS2_IS_VALID_DINODE(fe)) {
> -		OCFS2_RO_ON_INVALID_DINODE(inode->i_sb, fe);
> -		retval = -EIO;
> -		goto bail;
> +	/* current we only support dinode extent. */
> +	BUG_ON(type != OCFS2_DINODE_EXTENT);

Outside of your allocation function and each callback, I'd say we probably
don't need so many of these. The others will catch any problem before these
do.


> @@ -6043,13 +6161,14 @@ int ocfs2_commit_truncate(struct ocfs2_super *osb,
>  	handle_t *handle = NULL;
>  	struct inode *tl_inode = osb->osb_tl_inode;
>  	struct ocfs2_path *path = NULL;
> +	struct ocfs2_dinode *di = (struct ocfs2_dinode *)fe_bh->b_data;
>  
>  	mlog_entry_void();
>  
>  	new_highest_cpos = ocfs2_clusters_for_bytes(osb->sb,
>  						     i_size_read(inode));
>  
> -	path = ocfs2_new_inode_path(fe_bh);
> +	path = ocfs2_new_path(fe_bh, &di->id2.i_list);
>  	if (!path) {
>  		status = -ENOMEM;
>  		mlog_errno(status);
> @@ -6339,3 +6458,5 @@ static void ocfs2_free_truncate_context(struct ocfs2_truncate_context *tc)
>  
>  	kfree(tc);
>  }
> +
> +

You've added whitespace here for no reason.
	--Mark

--
Mark Fasheh



More information about the Ocfs2-devel mailing list