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 <[EMAIL PROTECTED]>

I like it!
Signed-off-by: Joel Becker <[EMAIL PROTECTED]>

> ---
>  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: [EMAIL PROTECTED]
Phone: (650) 506-8127

_______________________________________________
Ocfs2-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/ocfs2-devel

Reply via email to