aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTao Ma <tao.ma@oracle.com>2008-08-31 20:45:18 -0400
committerMark Fasheh <mfasheh@suse.com>2008-10-13 19:57:06 -0400
commit28b8ca0b7f70b1b048d03dc0b9d87f58619e9791 (patch)
tree24e581b6bc0d8a71c528b3f15b081712714e291e
parent8d6220d6a74a33552cf877bcea25503d7f6a59e6 (diff)
ocfs2: bug-fix for journal extend in xattr.
In ocfs2_extend_trans, when we can't extend the current transaction, it will commit current transaction and restart a new one. So if the previous credits we have allocated aren't used(the block isn't dirtied before our extend), we will not have enough credits for any future operation(it will cause jbd complain and bug out). So check this and re-extend it. Signed-off-by: Tao Ma <tao.ma@oracle.com> Signed-off-by: Mark Fasheh <mfasheh@suse.com>
-rw-r--r--fs/ocfs2/xattr.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/fs/ocfs2/xattr.c b/fs/ocfs2/xattr.c
index 1a4de3dc2ba9..38e3e5e216bd 100644
--- a/fs/ocfs2/xattr.c
+++ b/fs/ocfs2/xattr.c
@@ -1336,8 +1336,9 @@ static int ocfs2_xattr_set_entry(struct inode *inode,
1336 } 1336 }
1337 1337
1338 if (!(flag & OCFS2_INLINE_XATTR_FL)) { 1338 if (!(flag & OCFS2_INLINE_XATTR_FL)) {
1339 /*set extended attribue in external blcok*/ 1339 /* set extended attribute in external block. */
1340 ret = ocfs2_extend_trans(handle, 1340 ret = ocfs2_extend_trans(handle,
1341 OCFS2_INODE_UPDATE_CREDITS +
1341 OCFS2_XATTR_BLOCK_UPDATE_CREDITS); 1342 OCFS2_XATTR_BLOCK_UPDATE_CREDITS);
1342 if (ret) { 1343 if (ret) {
1343 mlog_errno(ret); 1344 mlog_errno(ret);
@@ -3701,6 +3702,18 @@ static int ocfs2_add_new_xattr_cluster(struct inode *inode,
3701 } 3702 }
3702 } 3703 }
3703 3704
3705 if (handle->h_buffer_credits < credits) {
3706 /*
3707 * The journal has been restarted before, and don't
3708 * have enough space for the insertion, so extend it
3709 * here.
3710 */
3711 ret = ocfs2_extend_trans(handle, credits);
3712 if (ret) {
3713 mlog_errno(ret);
3714 goto leave;
3715 }
3716 }
3704 mlog(0, "Insert %u clusters at block %llu for xattr at %u\n", 3717 mlog(0, "Insert %u clusters at block %llu for xattr at %u\n",
3705 num_bits, block, v_start); 3718 num_bits, block, v_start);
3706 ret = ocfs2_insert_extent(osb, handle, inode, &et, v_start, block, 3719 ret = ocfs2_insert_extent(osb, handle, inode, &et, v_start, block,