aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ocfs2/xattr.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ocfs2/xattr.c')
-rw-r--r--fs/ocfs2/xattr.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/fs/ocfs2/xattr.c b/fs/ocfs2/xattr.c
index 501539a733f4..6660f1c6149e 100644
--- a/fs/ocfs2/xattr.c
+++ b/fs/ocfs2/xattr.c
@@ -840,6 +840,23 @@ static int ocfs2_xattr_list_entries(struct inode *inode,
840 return result; 840 return result;
841} 841}
842 842
843int ocfs2_has_inline_xattr_value_outside(struct inode *inode,
844 struct ocfs2_dinode *di)
845{
846 struct ocfs2_xattr_header *xh;
847 int i;
848
849 xh = (struct ocfs2_xattr_header *)
850 ((void *)di + inode->i_sb->s_blocksize -
851 le16_to_cpu(di->i_xattr_inline_size));
852
853 for (i = 0; i < le16_to_cpu(xh->xh_count); i++)
854 if (!ocfs2_xattr_is_local(&xh->xh_entries[i]))
855 return 1;
856
857 return 0;
858}
859
843static int ocfs2_xattr_ibody_list(struct inode *inode, 860static int ocfs2_xattr_ibody_list(struct inode *inode,
844 struct ocfs2_dinode *di, 861 struct ocfs2_dinode *di,
845 char *buffer, 862 char *buffer,
@@ -2898,10 +2915,16 @@ int ocfs2_xattr_set(struct inode *inode,
2898 if (ocfs2_dealloc_has_cluster(&ctxt.dealloc)) 2915 if (ocfs2_dealloc_has_cluster(&ctxt.dealloc))
2899 ocfs2_schedule_truncate_log_flush(osb, 1); 2916 ocfs2_schedule_truncate_log_flush(osb, 1);
2900 ocfs2_run_deallocs(osb, &ctxt.dealloc); 2917 ocfs2_run_deallocs(osb, &ctxt.dealloc);
2918
2901cleanup: 2919cleanup:
2902 if (ref_tree) 2920 if (ref_tree)
2903 ocfs2_unlock_refcount_tree(osb, ref_tree, 1); 2921 ocfs2_unlock_refcount_tree(osb, ref_tree, 1);
2904 up_write(&OCFS2_I(inode)->ip_xattr_sem); 2922 up_write(&OCFS2_I(inode)->ip_xattr_sem);
2923 if (!value && !ret) {
2924 ret = ocfs2_try_remove_refcount_tree(inode, di_bh);
2925 if (ret)
2926 mlog_errno(ret);
2927 }
2905 ocfs2_inode_unlock(inode, 1); 2928 ocfs2_inode_unlock(inode, 1);
2906cleanup_nolock: 2929cleanup_nolock:
2907 brelse(di_bh); 2930 brelse(di_bh);