[Ocfs2-devel] [PATCH 1/4] ocfs2: turn __ocfs2_remove_inode_range() into ocfs2_remove_btree_range()
Joel Becker
Joel.Becker at oracle.com
Wed Nov 12 18:53:47 PST 2008
On Wed, Nov 12, 2008 at 06:24:05PM -0800, Mark Fasheh wrote:
> This patch genericizes the high level handling of extent removal.
> ocfs2_remove_btree_range() is nearly identical to
> __ocfs2_remove_inode_range(), except that extent tree operations have been
> used where necessary. We update ocfs2_remove_inode_range() to use the
> generic helper. Now extent tree based structures have an easy way to
> truncate ranges.
>
> Signed-off-by: Mark Fasheh <mfasheh at suse.com>
I like it!
Signed-off-by: Joel Becker <joel.becker at oracle.com>
> ---
> fs/ocfs2/alloc.c | 72 +++++++++++++++++++++++++++++++++++++++++++++
> fs/ocfs2/alloc.h | 5 +++
> fs/ocfs2/file.c | 85 +++--------------------------------------------------
> 3 files changed, 82 insertions(+), 80 deletions(-)
>
> diff --git a/fs/ocfs2/alloc.c b/fs/ocfs2/alloc.c
> index 4614614..5592a2f 100644
> --- a/fs/ocfs2/alloc.c
> +++ b/fs/ocfs2/alloc.c
> @@ -5255,6 +5255,78 @@ out:
> return ret;
> }
>
> +int ocfs2_remove_btree_range(struct inode *inode,
> + struct ocfs2_extent_tree *et,
> + u32 cpos, u32 phys_cpos, u32 len,
> + struct ocfs2_cached_dealloc_ctxt *dealloc)
> +{
> + int ret;
> + u64 phys_blkno = ocfs2_clusters_to_blocks(inode->i_sb, phys_cpos);
> + struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
> + struct inode *tl_inode = osb->osb_tl_inode;
> + handle_t *handle;
> + struct ocfs2_alloc_context *meta_ac = NULL;
> +
> + ret = ocfs2_lock_allocators(inode, et, 0, 1, NULL, &meta_ac);
> + if (ret) {
> + mlog_errno(ret);
> + return ret;
> + }
> +
> + mutex_lock(&tl_inode->i_mutex);
> +
> + if (ocfs2_truncate_log_needs_flush(osb)) {
> + ret = __ocfs2_flush_truncate_log(osb);
> + if (ret < 0) {
> + mlog_errno(ret);
> + goto out;
> + }
> + }
> +
> + handle = ocfs2_start_trans(osb, OCFS2_REMOVE_EXTENT_CREDITS);
> + if (IS_ERR(handle)) {
> + ret = PTR_ERR(handle);
> + mlog_errno(ret);
> + goto out;
> + }
> +
> + ret = ocfs2_journal_access(handle, inode, et->et_root_bh,
> + OCFS2_JOURNAL_ACCESS_WRITE);
> + if (ret) {
> + mlog_errno(ret);
> + goto out;
> + }
> +
> + ret = ocfs2_remove_extent(inode, et, cpos, len, handle, meta_ac,
> + dealloc);
> + if (ret) {
> + mlog_errno(ret);
> + goto out_commit;
> + }
> +
> + ocfs2_et_update_clusters(inode, et, -len);
> +
> + ret = ocfs2_journal_dirty(handle, et->et_root_bh);
> + if (ret) {
> + mlog_errno(ret);
> + goto out_commit;
> + }
> +
> + ret = ocfs2_truncate_log_append(osb, handle, phys_blkno, len);
> + if (ret)
> + mlog_errno(ret);
> +
> +out_commit:
> + ocfs2_commit_trans(osb, handle);
> +out:
> + mutex_unlock(&tl_inode->i_mutex);
> +
> + if (meta_ac)
> + ocfs2_free_alloc_context(meta_ac);
> +
> + return ret;
> +}
> +
> int ocfs2_truncate_log_needs_flush(struct ocfs2_super *osb)
> {
> struct buffer_head *tl_bh = osb->osb_tl_bh;
> diff --git a/fs/ocfs2/alloc.h b/fs/ocfs2/alloc.h
> index 3eb735e..0fbf8fc 100644
> --- a/fs/ocfs2/alloc.h
> +++ b/fs/ocfs2/alloc.h
> @@ -110,6 +110,11 @@ int ocfs2_remove_extent(struct inode *inode,
> u32 cpos, u32 len, handle_t *handle,
> struct ocfs2_alloc_context *meta_ac,
> struct ocfs2_cached_dealloc_ctxt *dealloc);
> +int ocfs2_remove_btree_range(struct inode *inode,
> + struct ocfs2_extent_tree *et,
> + u32 cpos, u32 phys_cpos, u32 len,
> + struct ocfs2_cached_dealloc_ctxt *dealloc);
> +
> int ocfs2_num_free_extents(struct ocfs2_super *osb,
> struct inode *inode,
> struct ocfs2_extent_tree *et);
> diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c
> index e2570a3..3605491 100644
> --- a/fs/ocfs2/file.c
> +++ b/fs/ocfs2/file.c
> @@ -1226,83 +1226,6 @@ out:
> return ret;
> }
>
> -static int __ocfs2_remove_inode_range(struct inode *inode,
> - struct buffer_head *di_bh,
> - u32 cpos, u32 phys_cpos, u32 len,
> - struct ocfs2_cached_dealloc_ctxt *dealloc)
> -{
> - int ret;
> - u64 phys_blkno = ocfs2_clusters_to_blocks(inode->i_sb, phys_cpos);
> - struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
> - struct inode *tl_inode = osb->osb_tl_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_init_dinode_extent_tree(&et, inode, di_bh);
> -
> - ret = ocfs2_lock_allocators(inode, &et, 0, 1, NULL, &meta_ac);
> - if (ret) {
> - mlog_errno(ret);
> - return ret;
> - }
> -
> - mutex_lock(&tl_inode->i_mutex);
> -
> - if (ocfs2_truncate_log_needs_flush(osb)) {
> - ret = __ocfs2_flush_truncate_log(osb);
> - if (ret < 0) {
> - mlog_errno(ret);
> - goto out;
> - }
> - }
> -
> - handle = ocfs2_start_trans(osb, OCFS2_REMOVE_EXTENT_CREDITS);
> - if (IS_ERR(handle)) {
> - ret = PTR_ERR(handle);
> - mlog_errno(ret);
> - goto out;
> - }
> -
> - ret = ocfs2_journal_access(handle, inode, di_bh,
> - OCFS2_JOURNAL_ACCESS_WRITE);
> - if (ret) {
> - mlog_errno(ret);
> - goto out;
> - }
> -
> - ret = ocfs2_remove_extent(inode, &et, cpos, len, handle, meta_ac,
> - dealloc);
> - if (ret) {
> - mlog_errno(ret);
> - goto out_commit;
> - }
> -
> - OCFS2_I(inode)->ip_clusters -= len;
> - di->i_clusters = cpu_to_le32(OCFS2_I(inode)->ip_clusters);
> -
> - ret = ocfs2_journal_dirty(handle, di_bh);
> - if (ret) {
> - mlog_errno(ret);
> - goto out_commit;
> - }
> -
> - ret = ocfs2_truncate_log_append(osb, handle, phys_blkno, len);
> - if (ret)
> - mlog_errno(ret);
> -
> -out_commit:
> - ocfs2_commit_trans(osb, handle);
> -out:
> - mutex_unlock(&tl_inode->i_mutex);
> -
> - if (meta_ac)
> - ocfs2_free_alloc_context(meta_ac);
> -
> - return ret;
> -}
> -
> /*
> * Truncate a byte range, avoiding pages within partial clusters. This
> * preserves those pages for the zeroing code to write to.
> @@ -1402,7 +1325,9 @@ static int ocfs2_remove_inode_range(struct inode *inode,
> struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
> struct ocfs2_cached_dealloc_ctxt dealloc;
> struct address_space *mapping = inode->i_mapping;
> + struct ocfs2_extent_tree et;
>
> + ocfs2_init_dinode_extent_tree(&et, inode, di_bh);
> ocfs2_init_dealloc_ctxt(&dealloc);
>
> if (byte_len == 0)
> @@ -1458,9 +1383,9 @@ static int ocfs2_remove_inode_range(struct inode *inode,
>
> /* Only do work for non-holes */
> if (phys_cpos != 0) {
> - ret = __ocfs2_remove_inode_range(inode, di_bh, cpos,
> - phys_cpos, alloc_size,
> - &dealloc);
> + ret = ocfs2_remove_btree_range(inode, &et, cpos,
> + phys_cpos, alloc_size,
> + &dealloc);
> if (ret) {
> mlog_errno(ret);
> goto out;
> --
> 1.5.4.1
>
--
Life's Little Instruction Book #451
"Don't be afraid to say, 'I'm sorry.'"
Joel Becker
Principal Software Developer
Oracle
E-mail: joel.becker at oracle.com
Phone: (650) 506-8127
More information about the Ocfs2-devel
mailing list