[Ocfs2-devel] [PATCH 10/10] ocfs2: Make ocfs2_extent_tree the first-class representation of a tree.

TaoMa tao.ma at oracle.com
Thu Aug 21 00:46:36 PDT 2008


Joel Becker wrote:
> We now have three different kinds of extent trees in ocfs2: inode data
> (dinode), extended attributes (xattr_tree), and extended attribute
> values (xattr_value).  There is a nice abstraction for them,
> ocfs2_extent_tree, but it is hidden in alloc.c.  All the calling
> functions have to pick amongst a varied API and pass in type bits and
> often extraneous pointers.
>
> A better way is to make ocfs2_extent_tree a first-class object.
> Everyone converts their object to an ocfs2_extent_tree() via the
> ocfs2_get_*_extent_tree() calls, then uses the ocfs2_extent_tree for all
> tree calls to alloc.c.
>
> This simplifies a lot of callers, making for readability.  It also
> provides an easy way to add additional extent tree types, as they only
> need to be defined in alloc.c with a ocfs2_get_<new>_extent_tree()
> function.
>
> Signed-off-by: Joel Becker <joel.becker at oracle.com>
> ---
>  fs/ocfs2/alloc.c    |  300 +++++++++++++++-----------------------------------
>  fs/ocfs2/alloc.h    |  111 +++++++++++---------
>  fs/ocfs2/aops.c     |   16 ++-
>  fs/ocfs2/dir.c      |   20 ++--
>  fs/ocfs2/file.c     |   34 ++++---
>  fs/ocfs2/suballoc.c |   12 +--
>  fs/ocfs2/suballoc.h |    6 +-
>  fs/ocfs2/xattr.c    |   71 +++++++------
>  8 files changed, 238 insertions(+), 332 deletions(-)
>
>   
>  
> @@ -1236,10 +1241,11 @@ static int __ocfs2_remove_inode_range(struct inode *inode,
>  	handle_t *handle;
>  	struct ocfs2_alloc_context *meta_ac = NULL;
>  	struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data;
> +	struct ocfs2_extent_tree et;
> +
> +	ocfs2_get_dinode_extent_tree(&et, inode, di_bh);
>  
> -	ret = ocfs2_lock_allocators(inode, di_bh, &di->id2.i_list,
> -				    0, 1, NULL, &meta_ac,
> -				    OCFS2_DINODE_EXTENT, NULL);
> +	ret = ocfs2_lock_allocators(inode, &et, 0, 1, NULL, &meta_ac);
>  	if (ret) {
>  		mlog_errno(ret);
>  		return ret;
>   
here you need to ocfs2_put_dinoe_extent_tree and I see no put in the end 
of the function.
> @@ -1269,8 +1275,8 @@ static int __ocfs2_remove_inode_range(struct inode *inode,
>  		goto out;
>  	}
>  
> -	ret = ocfs2_remove_extent(inode, di_bh, cpos, len, handle, meta_ac,
> -				  dealloc, OCFS2_DINODE_EXTENT, NULL);
> +	ret = ocfs2_remove_extent(inode, &et, cpos, len, handle, meta_ac,
> +				  dealloc);
>  	if (ret) {
>  		mlog_errno(ret);
>  		goto out_commit;
>   
btw, I like your abstraction.

Regards,
Tao



More information about the Ocfs2-devel mailing list