[Ocfs2-devel] [PATCH 3/3] du-enhancement: show the shared extents per file and the footprint v2

jeff.liu jeff.liu at oracle.com
Fri Mar 5 00:21:44 PST 2010


Tao Ma wrote:
> Hi jeff,
> 
> jeff.liu wrote:
>> Hi Tao,
>>
>> Thanks for your comments.
>>
>> Tao Ma wrote:
>>> Jie Liu wrote:
>>>> this patch add fiemap feature support in du, du show the shared
>>>> extents size in parens per file
>>>> as well as the footprint for each request with either '--shared-size'
>>>> or '-E' option.
>>>>
>>>> the footprint which is total minus the sum total of all extents in the
>>>> rbtree
>>>> that have ei_shared_count > 0.
>>>>
>>>> Signed-off-by: Jie Liu <jeff.liu at oracle.com>
>>>> ---
>>>>  coreutils-6.9/src/du.c |  444
>>>> +++++++++++++++++++++++++++++++++++++++++++++++-
>>>>  1 files changed, 437 insertions(+), 7 deletions(-)
>>>>
>>>> diff --git a/coreutils-6.9/src/du.c b/coreutils-6.9/src/du.c
>>>> index 206d318..3adc3a8 100644
>>>> --- a/coreutils-6.9/src/du.c
>>>> +++ b/coreutils-6.9/src/du.c
>>>> +/* Insert new extent based on the new parent.  */
>>>> +
>>>> +static void
>>>> +insert_new_extent_info (struct rb_node *parent,
>>>> +                        uint64_t fe_physical,
>>>> +                        uint64_t fe_length,
>>>> +                        size_t extent_shared_count)
>>>> +{
>>>> +  struct rb_node **p = parent ? &parent : &((&fe_root)->rb_node);
>>>> +  struct rb_node *pp = NULL;
>>>> +  struct extent_info *this = NULL;
>>>> +  struct extent_info *ei;
>>>> +
>>>> +  while (*p)
>>>> +    {
>>>> +      pp = *p;
>>>> +      this = rb_entry (*p, struct extent_info, ei_node);
>>>> +
>>>> +      if (this->ei_physical > fe_physical)
>>>> +        p = &(*p)->rb_left;
>>>> +      else if (this->ei_physical < fe_physical)
>>>> +    p = &(*p)->rb_right;
>>>> +      else
>>>> +    return;
>>>>   
>>> I am just curious in your code the last "else" should never happen? If
>>> yes, maybe if we meet with this, it means a bug in the code.
>>> So better assert here?
>> IMHO, the last 'else' should not happen if the split algorithm works
>> correctly.
>> The current algorithm is designed to make sure there is no extent
>> overlap occurrs in the rbtree.
>> So I am prefer to abort the DU process by asserting there.
> as you said, it is *designed* to work well, but you can't say it works
> well. With a "assert", you know there is a problem. Without assert, you
> may cheated by the codes. ;) btw, you can have a look in ocfs2-tools.
> there are some codes like it with "assert".
Sorry, it looks my last comments didn't mentioned clearly, I means I agree with your point, it
should be asserted here.

>>>> +    /* If 0 extents are returned, then more ioctls
>>>> +       are not needed.  */
>>>> +    if (fiemap->fm_mapped_extents == 0)
>>>> +      goto close_file;
>>>> +
>>>> +    uint64_t ext_phy_offset;
>>>> +    uint64_t ext_len;
>>>> +    size_t i;
>>>>   
>>> better move these declaration above.
>> Do you means this is a bad coding style?
>>
>> Due to these variables resides function exceeds 1 screen page, so I
>> declares them here to
>> facilitate the variables reference like type and name. or else,
>> someone have to page up to refer to
>> them.
>> I'd like to keep the ext_phy_offset and ext_len in the bottom FOR
>> logical, but move 'i' to the
>> head of this function since it is well-known as an iterate counter.
>>
>> How do you think about that?
>> I just want to make the code looks more professional.
>>
>>>> +    for (i = 0; i < fiemap->fm_mapped_extents; i++)
>>>> +      {
>>             uint64_t ext_phy_offset;
>>             uint64_t ext_len;
> yeah, this looks better and you can combine the 4 lines into 2 actually. ;)
sure. :)
>         uint64_t ext_phy_offset = fm_ext[i].fe_physical;
>         uint64_t ext_len = fm_ext[i].fe_length;
>>>> +        ext_phy_offset = fm_ext[i].fe_physical;
>>>> +    ext_len = fm_ext[i].fe_length;
> 
> Regards,
> Tao

Thanks,
-Jeff



More information about the Ocfs2-devel mailing list