[Ocfs2-devel] [PATCH 1/1] Ocfs2: Let ocfs2 support fiemap for symlink and fast symlink.

tristan tristan.ye at oracle.com
Mon Dec 21 17:18:06 PST 2009


Sunil Mushran wrote:
> Can you add a comment atop ocfs2_fiemap_inline() saying that
> this function handles fiemap for both inline data and fast symlink.
>
> Just want to be clear about this considering the function name
> suggests it is inline-data only.
>
> Also, change the comment in ocfs2_fiemap()... "Handle inline-data and
> fast symlink separately".

It makes sense:)

>
> You can add my ack to your next post with the changes.
>
> Acked-by: Sunil Mushran <sunil.mushran at oracle.com>
>
> Tristan Ye wrote:
>> For fast symlink, it can be treated the same as inlined files since
>> the data extent we want to return of both case all were stored in
>> metadata block. For symlink, it can be simply treated the same as we
>> did for regular files.
>>
>> Signed-off-by: Tristan Ye <tristan.ye at oracle.com>
>> ---
>>  fs/ocfs2/extent_map.c |   15 ++++++++++++---
>>  fs/ocfs2/symlink.c    |    2 ++
>>  2 files changed, 14 insertions(+), 3 deletions(-)
>>
>> diff --git a/fs/ocfs2/extent_map.c b/fs/ocfs2/extent_map.c
>> index 843db64..3b5e435 100644
>> --- a/fs/ocfs2/extent_map.c
>> +++ b/fs/ocfs2/extent_map.c
>> @@ -37,6 +37,7 @@
>>  #include "extent_map.h"
>>  #include "inode.h"
>>  #include "super.h"
>> +#include "symlink.h"
>>  
>>  #include "buffer_head_io.h"
>>  
>> @@ -715,11 +716,18 @@ static int ocfs2_fiemap_inline(struct inode 
>> *inode, struct buffer_head *di_bh,
>>      struct ocfs2_inode_info *oi = OCFS2_I(inode);
>>  
>>      di = (struct ocfs2_dinode *)di_bh->b_data;
>> -    id_count = le16_to_cpu(di->id2.i_data.id_count);
>> +    if (ocfs2_inode_is_fast_symlink(inode))
>> +        id_count = ocfs2_fast_symlink_chars(inode->i_sb);
>> +    else
>> +        id_count = le16_to_cpu(di->id2.i_data.id_count);
>>  
>>      if (map_start < id_count) {
>>          phys = oi->ip_blkno << inode->i_sb->s_blocksize_bits;
>> -        phys += offsetof(struct ocfs2_dinode, id2.i_data.id_data);
>> +        if (ocfs2_inode_is_fast_symlink(inode))
>> +            phys += offsetof(struct ocfs2_dinode, id2.i_symlink);
>> +        else
>> +            phys += offsetof(struct ocfs2_dinode,
>> +                     id2.i_data.id_data);
>>  
>>          ret = fiemap_fill_next_extent(fieinfo, 0, phys, id_count,
>>                            flags);
>> @@ -758,7 +766,8 @@ int ocfs2_fiemap(struct inode *inode, struct 
>> fiemap_extent_info *fieinfo,
>>      /*
>>       * Handle inline-data separately.
>>       */
>> -    if (OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL) {
>> +    if ((OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL) ||
>> +        ocfs2_inode_is_fast_symlink(inode)) {
>>          ret = ocfs2_fiemap_inline(inode, di_bh, fieinfo, map_start);
>>          goto out_unlock;
>>      }
>> diff --git a/fs/ocfs2/symlink.c b/fs/ocfs2/symlink.c
>> index e342103..49b133c 100644
>> --- a/fs/ocfs2/symlink.c
>> +++ b/fs/ocfs2/symlink.c
>> @@ -163,6 +163,7 @@ const struct inode_operations 
>> ocfs2_symlink_inode_operations = {
>>      .getxattr    = generic_getxattr,
>>      .listxattr    = ocfs2_listxattr,
>>      .removexattr    = generic_removexattr,
>> +    .fiemap        = ocfs2_fiemap,
>>  };
>>  const struct inode_operations ocfs2_fast_symlink_inode_operations = {
>>      .readlink    = ocfs2_readlink,
>> @@ -174,4 +175,5 @@ const struct inode_operations 
>> ocfs2_fast_symlink_inode_operations = {
>>      .getxattr    = generic_getxattr,
>>      .listxattr    = ocfs2_listxattr,
>>      .removexattr    = generic_removexattr,
>> +    .fiemap        = ocfs2_fiemap,
>>  };
>>   
>




More information about the Ocfs2-devel mailing list