diff options
author | Mark Fasheh <mark.fasheh@oracle.com> | 2007-04-18 18:22:08 -0400 |
---|---|---|
committer | Mark Fasheh <mark.fasheh@oracle.com> | 2007-04-26 16:35:21 -0400 |
commit | be9e986b824b41c9d5cc5eca34ee3424c35fd162 (patch) | |
tree | e48d5ea0683204e8070e120561e76a49c0ad31fd /fs/ocfs2/dlmglue.c | |
parent | 0d01af6e5dd6bc7abbcb6331021f8fee18005540 (diff) |
ocfs2: Local mounts should skip inode updates
We don't want the extent map and uptodate cache destruction in
ocfs2_meta_lock_update() on a local mount, so skip that.
This fixes several bugs with uptodate being cleared on buffers and extent
maps being corrupted.
Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
Diffstat (limited to 'fs/ocfs2/dlmglue.c')
-rw-r--r-- | fs/ocfs2/dlmglue.c | 21 |
1 files changed, 9 insertions, 12 deletions
diff --git a/fs/ocfs2/dlmglue.c b/fs/ocfs2/dlmglue.c index e335541727f9..31d519a6dbd2 100644 --- a/fs/ocfs2/dlmglue.c +++ b/fs/ocfs2/dlmglue.c | |||
@@ -1479,12 +1479,15 @@ static int ocfs2_meta_lock_update(struct inode *inode, | |||
1479 | { | 1479 | { |
1480 | int status = 0; | 1480 | int status = 0; |
1481 | struct ocfs2_inode_info *oi = OCFS2_I(inode); | 1481 | struct ocfs2_inode_info *oi = OCFS2_I(inode); |
1482 | struct ocfs2_lock_res *lockres = NULL; | 1482 | struct ocfs2_lock_res *lockres = &oi->ip_meta_lockres; |
1483 | struct ocfs2_dinode *fe; | 1483 | struct ocfs2_dinode *fe; |
1484 | struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); | 1484 | struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); |
1485 | 1485 | ||
1486 | mlog_entry_void(); | 1486 | mlog_entry_void(); |
1487 | 1487 | ||
1488 | if (ocfs2_mount_local(osb)) | ||
1489 | goto bail; | ||
1490 | |||
1488 | spin_lock(&oi->ip_lock); | 1491 | spin_lock(&oi->ip_lock); |
1489 | if (oi->ip_flags & OCFS2_INODE_DELETED) { | 1492 | if (oi->ip_flags & OCFS2_INODE_DELETED) { |
1490 | mlog(0, "Orphaned inode %llu was deleted while we " | 1493 | mlog(0, "Orphaned inode %llu was deleted while we " |
@@ -1496,22 +1499,18 @@ static int ocfs2_meta_lock_update(struct inode *inode, | |||
1496 | } | 1499 | } |
1497 | spin_unlock(&oi->ip_lock); | 1500 | spin_unlock(&oi->ip_lock); |
1498 | 1501 | ||
1499 | if (!ocfs2_mount_local(osb)) { | 1502 | if (!ocfs2_should_refresh_lock_res(lockres)) |
1500 | lockres = &oi->ip_meta_lockres; | 1503 | goto bail; |
1501 | |||
1502 | if (!ocfs2_should_refresh_lock_res(lockres)) | ||
1503 | goto bail; | ||
1504 | } | ||
1505 | 1504 | ||
1506 | /* This will discard any caching information we might have had | 1505 | /* This will discard any caching information we might have had |
1507 | * for the inode metadata. */ | 1506 | * for the inode metadata. */ |
1508 | ocfs2_metadata_cache_purge(inode); | 1507 | ocfs2_metadata_cache_purge(inode); |
1509 | 1508 | ||
1510 | /* will do nothing for inode types that don't use the extent | 1509 | /* will do nothing for inode types that don't use the extent |
1511 | * map (directories, bitmap files, etc) */ | 1510 | * map (bitmap files, etc) */ |
1512 | ocfs2_extent_map_trunc(inode, 0); | 1511 | ocfs2_extent_map_trunc(inode, 0); |
1513 | 1512 | ||
1514 | if (lockres && ocfs2_meta_lvb_is_trustable(inode, lockres)) { | 1513 | if (ocfs2_meta_lvb_is_trustable(inode, lockres)) { |
1515 | mlog(0, "Trusting LVB on inode %llu\n", | 1514 | mlog(0, "Trusting LVB on inode %llu\n", |
1516 | (unsigned long long)oi->ip_blkno); | 1515 | (unsigned long long)oi->ip_blkno); |
1517 | ocfs2_refresh_inode_from_lvb(inode); | 1516 | ocfs2_refresh_inode_from_lvb(inode); |
@@ -1558,8 +1557,7 @@ static int ocfs2_meta_lock_update(struct inode *inode, | |||
1558 | 1557 | ||
1559 | status = 0; | 1558 | status = 0; |
1560 | bail_refresh: | 1559 | bail_refresh: |
1561 | if (lockres) | 1560 | ocfs2_complete_lock_res_refresh(lockres, status); |
1562 | ocfs2_complete_lock_res_refresh(lockres, status); | ||
1563 | bail: | 1561 | bail: |
1564 | mlog_exit(status); | 1562 | mlog_exit(status); |
1565 | return status; | 1563 | return status; |
@@ -1630,7 +1628,6 @@ int ocfs2_meta_lock_full(struct inode *inode, | |||
1630 | wait_event(osb->recovery_event, | 1628 | wait_event(osb->recovery_event, |
1631 | ocfs2_node_map_is_empty(osb, &osb->recovery_map)); | 1629 | ocfs2_node_map_is_empty(osb, &osb->recovery_map)); |
1632 | 1630 | ||
1633 | acquired = 0; | ||
1634 | lockres = &OCFS2_I(inode)->ip_meta_lockres; | 1631 | lockres = &OCFS2_I(inode)->ip_meta_lockres; |
1635 | level = ex ? LKM_EXMODE : LKM_PRMODE; | 1632 | level = ex ? LKM_EXMODE : LKM_PRMODE; |
1636 | dlm_flags = 0; | 1633 | dlm_flags = 0; |