diff options
author | Tao Ma <tao.ma@oracle.com> | 2009-02-24 20:40:26 -0500 |
---|---|---|
committer | Mark Fasheh <mfasheh@suse.com> | 2009-02-26 14:51:11 -0500 |
commit | c8b9cf9a7cd25ba65166116d0a958f0bc709f0a7 (patch) | |
tree | 81ab9d6d0be93e57bcb17130abed3516574b3752 /fs/ocfs2/xattr.c | |
parent | 89a907afe073b8971a83d0ad54f391542b64d327 (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.c | 4 |
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]); |