[Ocfs2-tools-devel] [PATCH 1/6] libocfs2: Make file truncate process return error in bad case.

Sunil Mushran sunil.mushran at oracle.com
Tue Sep 16 15:51:14 PDT 2008


While this patch may work for this case, it may hurt us in other parts
of the fsck. Especially code paths where we call ocfs2_free_clusters()
because of an earlier error.

So instead if making it treat this condition as an error, we could add
a conditional ocfs2_bitmap_test_generic() to test if all the bits we are
clearing are indeed set. If not, then we will know to trigger a full fsck.

Thoughts?

Sunil

Tao Ma wrote:
> ocfs2_truncate handles the issue of file truncate, but it doesn't have
> a good error catch mechanism. So this patch try to add it.
> 1. In ocfs2_free_clusters, it will call ocfs2_bitmap_clear_range_generic
> to free the clusters to the system bitmap. The bad thing is that it never
> return error when the bit is already freed in the map, so add the error
> return in this function, so that ocfs2_free_clusters can use it to verify
> whether the free process is successful or not.
> 2. Add errcode in truncate_ctxt, so that it can carry back the real error
> code from truncate_iterate.
>
> Signed-off-by: Tao Ma <tao.ma at oracle.com>
> ---
>  libocfs2/bitmap.c   |    8 ++++++--
>  libocfs2/truncate.c |    7 +++++++
>  2 files changed, 13 insertions(+), 2 deletions(-)
>
> diff --git a/libocfs2/bitmap.c b/libocfs2/bitmap.c
> index a5fe511..f5e9669 100644
> --- a/libocfs2/bitmap.c
> +++ b/libocfs2/bitmap.c
> @@ -740,13 +740,17 @@ errcode_t ocfs2_bitmap_clear_range_generic(ocfs2_bitmap *bitmap,
>  {
>  	struct ocfs2_bitmap_region *br;
>  	uint64_t end;
> +	int old_tmp;
>  
>  	br = ocfs2_bitmap_lookup(bitmap, first_bit, len, NULL, NULL, NULL);
>  	if (!br)
>  		return OCFS2_ET_INVALID_BIT;
>  
> -	for (end = first_bit + len; first_bit < end; first_bit++)
> -		clear_generic_shared(bitmap, br, first_bit);
> +	for (end = first_bit + len; first_bit < end; first_bit++) {
> +		old_tmp = clear_generic_shared(bitmap, br, first_bit);
> +		if (!old_tmp)
> +			return OCFS2_ET_INVALID_BIT;
> +	}
>  
>  	return 0;
>  }
> diff --git a/libocfs2/truncate.c b/libocfs2/truncate.c
> index e67f3b7..cf64136 100644
> --- a/libocfs2/truncate.c
> +++ b/libocfs2/truncate.c
> @@ -35,6 +35,7 @@
>  struct truncate_ctxt {
>  	uint64_t new_size_in_clusters;
>  	uint32_t new_i_clusters;
> +	errcode_t errcode;
>  };
>  
>  /*
> @@ -130,6 +131,8 @@ static int truncate_iterate(ocfs2_filesys *fs,
>  bail:
>  	if (buf)
>  		ocfs2_free(&buf);
> +	if (ret)
> +		ctxt->errcode = ret;
>  	return func_ret;
>  }
>  
> @@ -243,11 +246,15 @@ errcode_t ocfs2_zero_tail_and_truncate(ocfs2_filesys *fs,
>  	ctxt.new_i_clusters = ci->ci_inode->i_clusters;
>  	ctxt.new_size_in_clusters =
>  			ocfs2_clusters_in_blocks(fs, new_size_in_blocks);
> +	ctxt.errcode = 0;
>  
>  	ret = ocfs2_extent_iterate_inode(fs, ci->ci_inode,
>  					 OCFS2_EXTENT_FLAG_DEPTH_TRAVERSE,
>  					 NULL, truncate_iterate,
>  					 &ctxt);
> +	if (!ret)
> +		ret = ctxt.errcode;
> +
>  	if (ret)
>  		goto out;
>  
>   




More information about the Ocfs2-tools-devel mailing list