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

Sunil Mushran sunil.mushran at oracle.com
Mon Dec 21 16:47:56 PST 2009


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".

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