|
@@ -1169,7 +1169,7 @@ static int __ocfs2_xattr_set_value_outside(struct inode *inode,
|
|
|
const void *value,
|
|
|
int value_len)
|
|
|
{
|
|
|
- int ret = 0, i, cp_len, credits;
|
|
|
+ int ret = 0, i, cp_len;
|
|
|
u16 blocksize = inode->i_sb->s_blocksize;
|
|
|
u32 p_cluster, num_clusters;
|
|
|
u32 cpos = 0, bpc = ocfs2_clusters_to_blocks(inode->i_sb, 1);
|
|
@@ -1179,18 +1179,6 @@ static int __ocfs2_xattr_set_value_outside(struct inode *inode,
|
|
|
|
|
|
BUG_ON(clusters > le32_to_cpu(xv->xr_clusters));
|
|
|
|
|
|
- /*
|
|
|
- * In __ocfs2_xattr_set_value_outside has already been dirtied,
|
|
|
- * so we don't need to worry about whether ocfs2_extend_trans
|
|
|
- * will create a new transactio for us or not.
|
|
|
- */
|
|
|
- credits = clusters * bpc;
|
|
|
- ret = ocfs2_extend_trans(handle, credits);
|
|
|
- if (ret) {
|
|
|
- mlog_errno(ret);
|
|
|
- goto out;
|
|
|
- }
|
|
|
-
|
|
|
while (cpos < clusters) {
|
|
|
ret = ocfs2_xattr_get_clusters(inode, cpos, &p_cluster,
|
|
|
&num_clusters, &xv->xr_list);
|
|
@@ -2233,6 +2221,15 @@ static int ocfs2_calc_xattr_set_need(struct inode *inode,
|
|
|
xi->value_len);
|
|
|
u64 value_size;
|
|
|
|
|
|
+ /*
|
|
|
+ * Calculate the clusters we need to write.
|
|
|
+ * No matter whether we replace an old one or add a new one,
|
|
|
+ * we need this for writing.
|
|
|
+ */
|
|
|
+ if (xi->value_len > OCFS2_XATTR_INLINE_SIZE)
|
|
|
+ credits += new_clusters *
|
|
|
+ ocfs2_clusters_to_blocks(inode->i_sb, 1);
|
|
|
+
|
|
|
if (xis->not_found && xbs->not_found) {
|
|
|
credits += ocfs2_blocks_per_xattr_bucket(inode->i_sb);
|
|
|
|