aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ocfs2/xattr.c
diff options
context:
space:
mode:
authorTao Ma <tao.ma@oracle.com>2009-02-24 20:40:26 -0500
committerMark Fasheh <mfasheh@suse.com>2009-02-26 14:51:11 -0500
commitc8b9cf9a7cd25ba65166116d0a958f0bc709f0a7 (patch)
tree81ab9d6d0be93e57bcb17130abed3516574b3752 /fs/ocfs2/xattr.c
parent89a907afe073b8971a83d0ad54f391542b64d327 (diff)
ocfs2: lock the metaecc process for xattr bucket
For other metadata in ocfs2, metaecc is checked in ocfs2_read_blocks with io_mutex held. While for xattr bucket, it is calculated by the whole buckets. So we have to add a spin_lock to prevent multiple processes calculating metaecc. Signed-off-by: Tao Ma <tao.ma@oracle.com> Tested-by: Tristan Ye <tristan.ye@oracle.com> Signed-off-by: Mark Fasheh <mfasheh@suse.com>
Diffstat (limited to 'fs/ocfs2/xattr.c')
-rw-r--r--fs/ocfs2/xattr.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/fs/ocfs2/xattr.c b/fs/ocfs2/xattr.c
index e3933158e1d7..a7c167905c56 100644
--- a/fs/ocfs2/xattr.c
+++ b/fs/ocfs2/xattr.c
@@ -274,10 +274,12 @@ static int ocfs2_read_xattr_bucket(struct ocfs2_xattr_bucket *bucket,
274 bucket->bu_blocks, bucket->bu_bhs, 0, 274 bucket->bu_blocks, bucket->bu_bhs, 0,
275 NULL); 275 NULL);
276 if (!rc) { 276 if (!rc) {
277 spin_lock(&OCFS2_SB(bucket->bu_inode->i_sb)->osb_xattr_lock);
277 rc = ocfs2_validate_meta_ecc_bhs(bucket->bu_inode->i_sb, 278 rc = ocfs2_validate_meta_ecc_bhs(bucket->bu_inode->i_sb,
278 bucket->bu_bhs, 279 bucket->bu_bhs,
279 bucket->bu_blocks, 280 bucket->bu_blocks,
280 &bucket_xh(bucket)->xh_check); 281 &bucket_xh(bucket)->xh_check);
282 spin_unlock(&OCFS2_SB(bucket->bu_inode->i_sb)->osb_xattr_lock);
281 if (rc) 283 if (rc)
282 mlog_errno(rc); 284 mlog_errno(rc);
283 } 285 }
@@ -310,9 +312,11 @@ static void ocfs2_xattr_bucket_journal_dirty(handle_t *handle,
310{ 312{
311 int i; 313 int i;
312 314
315 spin_lock(&OCFS2_SB(bucket->bu_inode->i_sb)->osb_xattr_lock);
313 ocfs2_compute_meta_ecc_bhs(bucket->bu_inode->i_sb, 316 ocfs2_compute_meta_ecc_bhs(bucket->bu_inode->i_sb,
314 bucket->bu_bhs, bucket->bu_blocks, 317 bucket->bu_bhs, bucket->bu_blocks,
315 &bucket_xh(bucket)->xh_check); 318 &bucket_xh(bucket)->xh_check);
319 spin_unlock(&OCFS2_SB(bucket->bu_inode->i_sb)->osb_xattr_lock);
316 320
317 for (i = 0; i < bucket->bu_blocks; i++) 321 for (i = 0; i < bucket->bu_blocks; i++)
318 ocfs2_journal_dirty(handle, bucket->bu_bhs[i]); 322 ocfs2_journal_dirty(handle, bucket->bu_bhs[i]);