[Ocfs2-devel] [PATCH 1/1] Ocfs2: Optimize truncting codes for ocfs2 to use ocfs2_remove_btree_range instead.

tristan tristan.ye at oracle.com
Sun Jan 31 20:43:12 PST 2010


Tao Ma wrote:
> Hi Tristan,
>     Sorry for the delay. This patch looks good. Just some minor comments.
> Tristan Ye wrote:
> <snip>
>>  int ocfs2_commit_truncate(struct ocfs2_super *osb,
>>                struct inode *inode,
>> -              struct buffer_head *fe_bh,
>> -              struct ocfs2_truncate_context *tc)
>> +              struct buffer_head *fe_bh)
>>  {
>> -    int status, i, credits, tl_sem = 0;
>> -    u32 clusters_to_del, new_highest_cpos, range;
>> +    int status = 0, i, flags = 0;
>> +    u32 new_highest_cpos, range, trunc_cpos, trunc_len, phys_cpos, 
>> coff;
>>      u64 blkno = 0;
>> +
> Why you always want to separate the declaration with blank lines? I 
> have never seen such one in the original codes. So please remove this 
> redundant line. The same goes for the following codes.


Sorry, maybe I originally wanted to separate structure definitions from 
simple primitives, I can remove this anyway:)


>>      struct ocfs2_extent_list *el;
>> -    handle_t *handle = NULL;
>> -    struct inode *tl_inode = osb->osb_tl_inode;
>> +    struct ocfs2_extent_rec *rec;
>>      struct ocfs2_path *path = NULL;
>>      struct ocfs2_dinode *di = (struct ocfs2_dinode *)fe_bh->b_data;
>> -    struct ocfs2_alloc_context *meta_ac = NULL;
>> -    struct ocfs2_refcount_tree *ref_tree = NULL;
>> +    u64 refcount_loc = le64_to_cpu(di->i_refcount_loc);
>> +
>> +    struct ocfs2_extent_tree et;
>> +    struct ocfs2_cached_dealloc_ctxt dealloc;
>>  
>>      mlog_entry_void();
>> +   
>> +    ocfs2_init_dinode_extent_tree(&et, INODE_CACHE(inode), fe_bh);
>> +    ocfs2_init_dealloc_ctxt(&dealloc);
>>  
>>      new_highest_cpos = ocfs2_clusters_for_bytes(osb->sb,
>>                               i_size_read(inode));
>> @@ -7433,8 +7110,6 @@ int ocfs2_commit_truncate(struct ocfs2_super *osb,
>>          goto bail;
>>      }
>>  
>> -    ocfs2_extent_map_trunc(inode, new_highest_cpos);
>> -
> I remembered that I have said this line should be reserved.
> Oh, I just checked the previous e-mail and you replied "I guess it's 
> safe to remove extent map here, since ocfs2_remove_extent() will do 
> the same. ". This isn't right.
> Check the ocfs2_remove_extent, and the code looks like this:
>     /*
>       * XXX: Why are we truncating to 0 instead of wherever this
>      * affects us?
>      */
>     ocfs2_et_extent_map_truncate(et, 0);
> So you see, it is "XXX", and we may change it somehow later. We can't 
> trust it.
>

That's OK.


>>  start:
>>      /*
>>       * Check that we still have allocation to delete.
>> @@ -7444,8 +7119,6 @@ start:
>>          goto bail;
>>      }
>>  
>> -    credits = 0;
>> -
>>      /*
>>       * Truncate always works against the rightmost tree branch.
>>       */
>> @@ -7480,101 +7153,56 @@ start:
>>      }
>>  
>>      i = le16_to_cpu(el->l_next_free_rec) - 1;
>> -    range = le32_to_cpu(el->l_recs[i].e_cpos) +
>> -        ocfs2_rec_clusters(el, &el->l_recs[i]);
>> -    if (i == 0 && ocfs2_is_empty_extent(&el->l_recs[i])) {
>> -        clusters_to_del = 0;
>> -    } else if (le32_to_cpu(el->l_recs[i].e_cpos) >= new_highest_cpos) {
>> -        clusters_to_del = ocfs2_rec_clusters(el, &el->l_recs[i]);
>> -        blkno = le64_to_cpu(el->l_recs[i].e_blkno);
>> +    rec = &el->l_recs[i];
>> +    flags = rec->e_flags;
>> +    range = le32_to_cpu(rec->e_cpos) + ocfs2_rec_clusters(el, rec);
>> +
>> +    if (i == 0 && ocfs2_is_empty_extent(rec)) {
>> +        /*
>> +         * Should remove this extent block.
>> +         */
>> +        trunc_cpos = le32_to_cpu(rec->e_cpos);
>> +        trunc_len = 0;
>> +        coff = 0;
>> +        blkno = 0;
> In this case, I guess we need to work like the original 
> ocfs2_do_truncate:
>     /*
>      * Lower levels depend on this never happening, but it's best
>      * to check it up here before changing the tree.
>      */
>     if (el->l_tree_depth && el->l_recs[0].e_int_clusters == 0) {
>         ocfs2_error(inode->i_sb,
>                 "Inode %lu has an empty extent record, depth %u\n",
>                 inode->i_ino, le16_to_cpu(el->l_tree_depth));
>         status = -EROFS;
>         goto bail;
>     }


Good catch!



>> +    } else if (le32_to_cpu(rec->e_cpos) >= new_highest_cpos) {
>> +        /* +         * Truncate entire record.
>> +         */
>> +        trunc_cpos = le32_to_cpu(rec->e_cpos);
>> +        trunc_len = ocfs2_rec_clusters(el, rec);
>> +        coff = 0;
> I just notice you only use coff in the below "else if"? Please remove it.

Yes, you're right.

>> +        blkno = le64_to_cpu(rec->e_blkno);
>>      } else if (range > new_highest_cpos) {
>> -        clusters_to_del = (ocfs2_rec_clusters(el, &el->l_recs[i]) +
>> -                   le32_to_cpu(el->l_recs[i].e_cpos)) -
>> -                  new_highest_cpos;
>> -        blkno = le64_to_cpu(el->l_recs[i].e_blkno) +
>> -            ocfs2_clusters_to_blocks(inode->i_sb,
>> -                ocfs2_rec_clusters(el, &el->l_recs[i]) -
>> -                clusters_to_del);
>> +        /*
>> +         * Partial truncate. it also should be
>> +         * the last truncate we're doing.
>> +         */
>> +        trunc_cpos = new_highest_cpos;
>> +        trunc_len = range - new_highest_cpos;
>> +        coff = new_highest_cpos - le32_to_cpu(rec->e_cpos);
>> +        blkno = le64_to_cpu(rec->e_blkno) +
>> +                ocfs2_clusters_to_blocks(inode->i_sb, coff);
>>      } else {
>> +        /*
>> +         * Truncate completed, leave happily.
>> +         */
>>          status = 0;
>>          goto bail;
>>      }
>
> Regards,
> Tao




More information about the Ocfs2-devel mailing list