diff --git a/fs/ocfs2/refcounttree.c b/fs/ocfs2/refcounttree.c index 85d25c211..3b397fa9c 100755 --- a/fs/ocfs2/refcounttree.c +++ b/fs/ocfs2/refcounttree.c @@ -27,7 +27,6 @@ #include "namei.h" #include "ocfs2_trace.h" #include "file.h" -#include "symlink.h" #include #include @@ -4185,9 +4184,8 @@ static int __ocfs2_reflink(struct dentry *old_dentry, int ret; struct inode *inode = d_inode(old_dentry); struct buffer_head *new_bh = NULL; - struct ocfs2_inode_info *oi = OCFS2_I(inode); - if (oi->ip_flags & OCFS2_INODE_SYSTEM_FILE) { + if (OCFS2_I(inode)->ip_flags & OCFS2_INODE_SYSTEM_FILE) { ret = -EINVAL; mlog_errno(ret); goto out; @@ -4213,26 +4211,6 @@ static int __ocfs2_reflink(struct dentry *old_dentry, goto out_unlock; } - if ((oi->ip_dyn_features & OCFS2_HAS_XATTR_FL) && - (oi->ip_dyn_features & OCFS2_INLINE_XATTR_FL)) { - /* - * Adjust extent record count to reserve space for extended attribute. - * Inline data count had been adjusted in ocfs2_duplicate_inline_data(). - */ - struct ocfs2_inode_info *new_oi = OCFS2_I(new_inode); - - if (!(new_oi->ip_dyn_features & OCFS2_INLINE_DATA_FL) && - !(ocfs2_inode_is_fast_symlink(new_inode))) { - struct ocfs2_dinode *new_di = (struct ocfs2_dinode *)new_bh->b_data; - struct ocfs2_dinode *old_di = (struct ocfs2_dinode *)old_bh->b_data; - struct ocfs2_extent_list *el = &new_di->id2.i_list; - int inline_size = le16_to_cpu(old_di->i_xattr_inline_size); - - le16_add_cpu(&el->l_count, -(inline_size / - sizeof(struct ocfs2_extent_rec))); - } - } - ret = ocfs2_create_reflink_node(inode, old_bh, new_inode, new_bh, preserve); if (ret) { @@ -4240,7 +4218,7 @@ static int __ocfs2_reflink(struct dentry *old_dentry, goto inode_unlock; } - if (oi->ip_dyn_features & OCFS2_HAS_XATTR_FL) { + if (OCFS2_I(inode)->ip_dyn_features & OCFS2_HAS_XATTR_FL) { ret = ocfs2_reflink_xattrs(inode, old_bh, new_inode, new_bh, preserve); diff --git a/fs/ocfs2/xattr.c b/fs/ocfs2/xattr.c index 20bc3d9de..69826dba1 100755 --- a/fs/ocfs2/xattr.c +++ b/fs/ocfs2/xattr.c @@ -6526,7 +6526,16 @@ static int ocfs2_reflink_xattr_inline(struct ocfs2_xattr_reflink *args) } new_oi = OCFS2_I(args->new_inode); - + /* + * Adjust extent record count to reserve space for extended attribute. + * Inline data count had been adjusted in ocfs2_duplicate_inline_data(). + */ + if (!(new_oi->ip_dyn_features & OCFS2_INLINE_DATA_FL) && + !(ocfs2_inode_is_fast_symlink(args->new_inode))) { + struct ocfs2_extent_list *el = &new_di->id2.i_list; + le16_add_cpu(&el->l_count, -(inline_size / + sizeof(struct ocfs2_extent_rec))); + } spin_lock(&new_oi->ip_lock); new_oi->ip_dyn_features |= OCFS2_HAS_XATTR_FL | OCFS2_INLINE_XATTR_FL; new_di->i_dyn_features = cpu_to_le16(new_oi->ip_dyn_features);