forked from luck/tmp_suning_uos_patched
Ocfs2: Let ocfs2 support fiemap for symlink and fast symlink.
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@oracle.com> Acked-by: Sunil Mushran <sunil.mushran@oracle.com> Signed-off-by: Joel Becker <joel.becker@oracle.com>
This commit is contained in:
parent
55f4946ed2
commit
86239d59e2
|
@ -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 @@ int ocfs2_extent_map_get_blocks(struct inode *inode, u64 v_blkno, u64 *p_blkno,
|
|||
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;
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue
Block a user