[Ocfs2-devel] [PATCH 09/10] ocfs2: Add an insertion check to ocfs2_extent_tree_operations.

Mark Fasheh mfasheh at suse.com
Thu Aug 21 15:52:39 PDT 2008


On Wed, Aug 20, 2008 at 07:48:24PM -0700, Joel Becker wrote:
> The op eo_sanity_check() was really a check on remove_right_path().
> Let's call it eo_remove_check().  Let's add an eo_insert_check() that
> can be called from ocfs2_insert_extent().
> 
> Let's have the wrapper calls ocfs2_et_insert_check() and
> ocfs2_et_remove_check() ignore NULL ops.  That way we don't have to
> provide useless operations for xattr types.
> 
> Signed-off-by: Joel Becker <joel.becker at oracle.com>
> ---
>  fs/ocfs2/alloc.c |   88 +++++++++++++++++++++++++++++++++---------------------
>  1 files changed, 54 insertions(+), 34 deletions(-)
> 
> diff --git a/fs/ocfs2/alloc.c b/fs/ocfs2/alloc.c
> index 243bacf..38abdf1 100644
> --- a/fs/ocfs2/alloc.c
> +++ b/fs/ocfs2/alloc.c
> @@ -71,7 +71,10 @@ struct ocfs2_extent_tree_operations {
>  	void (*eo_update_clusters)(struct inode *inode,
>  				   struct ocfs2_extent_tree *et,
>  				   u32 new_clusters);
> -	int (*eo_sanity_check)(struct inode *inode, struct ocfs2_extent_tree *et);
> +	int (*eo_insert_check)(struct inode *inode,
> +			       struct ocfs2_extent_tree *et,
> +			       struct ocfs2_extent_rec *rec);
> +	int (*eo_remove_check)(struct inode *inode, struct ocfs2_extent_tree *et);
>  
>  	/* These are internal to ocfs2_extent_tree and don't have
>  	 * accessor functions */
> @@ -125,7 +128,26 @@ static void ocfs2_dinode_update_clusters(struct inode *inode,
>  	spin_unlock(&OCFS2_I(inode)->ip_lock);
>  }
>  
> -static int ocfs2_dinode_sanity_check(struct inode *inode,
> +static int ocfs2_dinode_insert_check(struct inode *inode,
> +				     struct ocfs2_extent_tree *et,
> +				     struct ocfs2_extent_rec *rec)
> +{
> +	struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
> +
> +	BUG_ON(OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL);
> +	mlog_bug_on_msg(!ocfs2_sparse_alloc(osb) &&
> +			(OCFS2_I(inode)->ip_clusters != rec->e_cpos),
> +			"Device %s, asking for sparse allocation: inode %llu, "
> +			"cpos %u, clusters %u\n",
> +			osb->dev_str,
> +			(unsigned long long)OCFS2_I(inode)->ip_blkno,
> +			rec->e_cpos,
> +			OCFS2_I(inode)->ip_clusters);
> +
> +	return 0;
> +}
> +
> +static int ocfs2_dinode_remove_check(struct inode *inode,
>  				     struct ocfs2_extent_tree *et)
>  {
>  	int ret = 0;
> @@ -148,7 +170,8 @@ static struct ocfs2_extent_tree_operations ocfs2_dinode_et_ops = {
>  	.eo_set_last_eb_blk	= ocfs2_dinode_set_last_eb_blk,
>  	.eo_get_last_eb_blk	= ocfs2_dinode_get_last_eb_blk,
>  	.eo_update_clusters	= ocfs2_dinode_update_clusters,
> -	.eo_sanity_check	= ocfs2_dinode_sanity_check,
> +	.eo_insert_check	= ocfs2_dinode_insert_check,
> +	.eo_remove_check	= ocfs2_dinode_remove_check,
>  	.eo_fill_root_el	= ocfs2_dinode_fill_root_el,
>  };
>  
> @@ -186,17 +209,10 @@ static void ocfs2_xattr_value_update_clusters(struct inode *inode,
>  	le32_add_cpu(&xv->xr_clusters, clusters);
>  }
>  
> -static int ocfs2_xattr_value_sanity_check(struct inode *inode,
> -					  struct ocfs2_extent_tree *et)
> -{
> -	return 0;
> -}
> -
>  static struct ocfs2_extent_tree_operations ocfs2_xattr_value_et_ops = {
>  	.eo_set_last_eb_blk	= ocfs2_xattr_value_set_last_eb_blk,
>  	.eo_get_last_eb_blk	= ocfs2_xattr_value_get_last_eb_blk,
>  	.eo_update_clusters	= ocfs2_xattr_value_update_clusters,
> -	.eo_sanity_check	= ocfs2_xattr_value_sanity_check,
>  	.eo_fill_root_el	= ocfs2_xattr_value_fill_root_el,
>  };
>  
> @@ -241,17 +257,10 @@ static void ocfs2_xattr_tree_update_clusters(struct inode *inode,
>  	le32_add_cpu(&xb->xb_attrs.xb_root.xt_clusters, clusters);
>  }
>  
> -static int ocfs2_xattr_tree_sanity_check(struct inode *inode,
> -					 struct ocfs2_extent_tree *et)
> -{
> -	return 0;
> -}
> -
>  static struct ocfs2_extent_tree_operations ocfs2_xattr_tree_et_ops = {
>  	.eo_set_last_eb_blk	= ocfs2_xattr_tree_set_last_eb_blk,
>  	.eo_get_last_eb_blk	= ocfs2_xattr_tree_get_last_eb_blk,
>  	.eo_update_clusters	= ocfs2_xattr_tree_update_clusters,
> -	.eo_sanity_check	= ocfs2_xattr_tree_sanity_check,
>  	.eo_fill_root_el	= ocfs2_xattr_tree_fill_root_el,
>  	.eo_fill_max_leaf_clusters = ocfs2_xattr_tree_fill_max_leaf_clusters,
>  };
> @@ -344,10 +353,25 @@ static inline void ocfs2_et_update_clusters(struct inode *inode,
>  	et->et_ops->eo_update_clusters(inode, et, clusters);
>  }
>  
> -static inline int ocfs2_et_sanity_check(struct inode *inode,
> +static inline int ocfs2_et_insert_check(struct inode *inode,
> +					struct ocfs2_extent_tree *et,
> +					struct ocfs2_extent_rec *rec)
> +{
> +	int ret = 0;
> +
> +	if (et->et_ops->eo_insert_check)
> +		ret = et->et_ops->eo_insert_check(inode, et, rec);
> +	return ret;
> +}
> +
> +static inline int ocfs2_et_remove_check(struct inode *inode,
>  					struct ocfs2_extent_tree *et)
>  {
> -	return et->et_ops->eo_sanity_check(inode, et);
> +	int ret = 0;
> +
> +	if (et->et_ops->eo_remove_check)
> +		ret = et->et_ops->eo_remove_check(inode, et);
> +	return ret;
>  }
>  
>  static void ocfs2_free_truncate_context(struct ocfs2_truncate_context *tc);
> @@ -2744,7 +2768,7 @@ static int ocfs2_remove_rightmost_path(struct inode *inode, handle_t *handle,
>  	struct ocfs2_extent_list *el;
>  
>  
> -	ret = ocfs2_et_sanity_check(inode, et);
> +	ret = ocfs2_et_remove_check(inode, et);
>  	if (ret)
>  		goto out;
>  	/*
> @@ -4406,26 +4430,22 @@ static int ocfs2_insert_extent(struct ocfs2_super *osb,
>  	int uninitialized_var(free_records);
>  	struct buffer_head *last_eb_bh = NULL;
>  	struct ocfs2_insert_type insert = {0, };
> -	struct ocfs2_extent_rec rec;
> -
> -	BUG_ON(OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL);
> +	struct ocfs2_extent_rec rec = {
> +		.e_cpos = cpu_to_le32(cpos),
> +		.e_blkno = cpu_to_le64(start_blk),
> +	};
>  
>  	mlog(0, "add %u clusters at position %u to inode %llu\n",
>  	     new_clusters, cpos, (unsigned long long)OCFS2_I(inode)->ip_blkno);
>  
> -	mlog_bug_on_msg(!ocfs2_sparse_alloc(osb) &&
> -			(OCFS2_I(inode)->ip_clusters != cpos),
> -			"Device %s, asking for sparse allocation: inode %llu, "
> -			"cpos %u, clusters %u\n",
> -			osb->dev_str,
> -			(unsigned long long)OCFS2_I(inode)->ip_blkno, cpos,
> -			OCFS2_I(inode)->ip_clusters);
> -
> -	memset(&rec, 0, sizeof(rec));
> -	rec.e_cpos = cpu_to_le32(cpos);
> -	rec.e_blkno = cpu_to_le64(start_blk);
> +	/* gcc doesn't understand anonymous unions in the initializer */
>  	rec.e_leaf_clusters = cpu_to_le16(new_clusters);
>  	rec.e_flags = flags;

Is there a reason why you changed the way we initialize "rec" for this
patch? I guess the end result is the same - specifically, I want to be 100%
certain that rec.e_reserved1 gets zero'd. Still though, I think the flow we
had before was better.


> +	status = ocfs2_et_insert_check(inode, et, &rec);
> +	if (status) {
> +		mlog_errno(status);
> +		goto bail;
> +	}
>  
>  	status = ocfs2_figure_insert_type(inode, et, &last_eb_bh, &rec,
>  					  &free_records, &insert);
> -- 
> 1.5.6.3
--
Mark Fasheh



More information about the Ocfs2-devel mailing list