[Ocfs2-devel] [PATCH 08/18] ocfs2: Use metadata-specific ocfs2_journal_access_*() functions.

Tao Ma tao.ma at oracle.com
Tue Dec 9 18:31:50 PST 2008



Joel Becker wrote:
> The per-metadata-type ocfs2_journal_access_*() functions hook up jbd2
> commit triggers and allow us to compute metadata ecc right before the
> buffers are written out.  This commit provides ecc for inodes, extent
> blocks, group descriptors, and quota blocks.  It is not safe to use
> extened attributes and metaecc at the same time yet.
> 
> The ocfs2_extent_tree and ocfs2_path abstractions in alloc.c both hide
> the type of block at their root.  Before, it didn't matter, but now the
> root block must use the appropriate ocfs2_journal_access_*() function.
> To keep this abstract, the structures now have a pointer to the matching
> journal_access function and a wrapper call to call it.
> 
> Since we pass around the journal_access functions.  Let's typedef them
> in ocfs2.h.
> 
> Signed-off-by: Joel Becker <joel.becker at oracle.com>
<snip>
> +static int ocfs2_path_bh_journal_access(handle_t *handle,
> +					struct inode *inode,
> +					struct ocfs2_path *path,
> +					int idx)
> +{
> +	ocfs2_journal_access_func access = path_root_access(path);
> +
> +	if (!access)
> +		access = ocfs2_journal_access;
> +
> +	if (idx)
> +		access = ocfs2_journal_access_eb;
> +
> +	return access(handle, inode, path->p_node[idx].bh,
> +		      OCFS2_JOURNAL_ACCESS_WRITE);
>  }
In most cases, idx>0 and access isn't NULL. So the following code would 
be more efficient I guess.

	if (idx)
		access = ocfs2_journal_access_eb;
	else if (!access)
		access = ocfs2_journal_access;

> @@ -1918,25 +1966,23 @@ static int ocfs2_rotate_subtree_right(struct inode *inode,
>  	root_bh = left_path->p_node[subtree_index].bh;
>  	BUG_ON(root_bh != right_path->p_node[subtree_index].bh);
>  
> -	ret = ocfs2_journal_access(handle, inode, root_bh,
> -				   OCFS2_JOURNAL_ACCESS_WRITE);
> +	ret = ocfs2_path_bh_journal_access(handle, inode, right_path,
> +					   subtree_index);
>  	if (ret) {
>  		mlog_errno(ret);
>  		goto out;
>  	}
>  
>  	for(i = subtree_index + 1; i < path_num_items(right_path); i++) {
> -		ret = ocfs2_journal_access(handle, inode,
> -					   right_path->p_node[i].bh,
> -					   OCFS2_JOURNAL_ACCESS_WRITE);
> +		ret = ocfs2_path_bh_journal_access(handle, inode,
> +						   right_path, i);
>  		if (ret) {
>  			mlog_errno(ret);
>  			goto out;
>  		}
>  
> -		ret = ocfs2_journal_access(handle, inode,
> -					   left_path->p_node[i].bh,
> -					   OCFS2_JOURNAL_ACCESS_WRITE);
> +		ret = ocfs2_path_bh_journal_access(handle, inode,
> +						   left_path, i);
I guess when can use ocfs2_journal_access_eb directly since it is 
"subtree_index+1" now. No chance of be the root. The same goes for 
ocfs2_rotate_subtree_left, ocfs2_merge_rec_right, ocfs2_merge_rec_left.

> @@ -4594,8 +4633,8 @@ int ocfs2_add_clusters_in_btree(struct ocfs2_super *osb,
>  	BUG_ON(num_bits > clusters_to_add);
>  
>  	/* reserve our write early -- insert_extent may update the inode */
> -	status = ocfs2_journal_access(handle, inode, et->et_root_bh,
> -				      OCFS2_JOURNAL_ACCESS_WRITE);
> +	status = ocfs2_et_root_journal_access(handle, inode, et,
> +					      OCFS2_JOURNAL_ACCESS_WRITE);
This is really a good chance for us to modify the comments also. ;)

Regards,
Tao



More information about the Ocfs2-devel mailing list