[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