Merge tag 'vfio-v3.11' of git://github.com/awilliam/linux-vfio
[cascardo/linux.git] / fs / ocfs2 / xattr.c
index 2e3ea30..317ef0a 100644 (file)
@@ -2751,20 +2751,12 @@ static int ocfs2_xattr_ibody_set(struct inode *inode,
 {
        int ret;
        struct ocfs2_inode_info *oi = OCFS2_I(inode);
-       struct ocfs2_dinode *di = (struct ocfs2_dinode *)xs->inode_bh->b_data;
        struct ocfs2_xa_loc loc;
 
        if (inode->i_sb->s_blocksize == OCFS2_MIN_BLOCKSIZE)
                return -ENOSPC;
 
        down_write(&oi->ip_alloc_sem);
-       if (!(oi->ip_dyn_features & OCFS2_INLINE_XATTR_FL)) {
-               if (!ocfs2_xattr_has_space_inline(inode, di)) {
-                       ret = -ENOSPC;
-                       goto out;
-               }
-       }
-
        if (!(oi->ip_dyn_features & OCFS2_INLINE_XATTR_FL)) {
                ret = ocfs2_xattr_ibody_init(inode, xs->inode_bh, ctxt);
                if (ret) {
@@ -6499,6 +6491,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);