diff options
| -rw-r--r-- | fs/ocfs2/extent_map.c | 23 | ||||
| -rw-r--r-- | fs/ocfs2/symlink.c | 2 | 
2 files changed, 21 insertions, 4 deletions
| diff --git a/fs/ocfs2/extent_map.c b/fs/ocfs2/extent_map.c index cdce5f8c1cfa..d35a27f4523e 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" @@ -703,6 +704,12 @@ out:  	return ret;  } +/* + * The ocfs2_fiemap_inline() may be a little bit misleading, since + * it not only handles the fiemap for inlined files, but also deals + * with the fast symlink, cause they have no difference for extent + * mapping per se. + */  static int ocfs2_fiemap_inline(struct inode *inode, struct buffer_head *di_bh,  			       struct fiemap_extent_info *fieinfo,  			       u64 map_start) @@ -715,11 +722,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); @@ -756,9 +770,10 @@ int ocfs2_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,  	down_read(&OCFS2_I(inode)->ip_alloc_sem);  	/* -	 * Handle inline-data separately. +	 * Handle inline-data and fast symlink 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 e3421030a69f..49b133ccbf11 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,  }; | 
