diff options
Diffstat (limited to 'fs/ocfs2/inode.c')
-rw-r--r-- | fs/ocfs2/inode.c | 86 |
1 files changed, 73 insertions, 13 deletions
diff --git a/fs/ocfs2/inode.c b/fs/ocfs2/inode.c index 4dc8890ba316..0297fb8982b8 100644 --- a/fs/ocfs2/inode.c +++ b/fs/ocfs2/inode.c | |||
@@ -53,6 +53,7 @@ | |||
53 | #include "sysfile.h" | 53 | #include "sysfile.h" |
54 | #include "uptodate.h" | 54 | #include "uptodate.h" |
55 | #include "xattr.h" | 55 | #include "xattr.h" |
56 | #include "refcounttree.h" | ||
56 | 57 | ||
57 | #include "buffer_head_io.h" | 58 | #include "buffer_head_io.h" |
58 | 59 | ||
@@ -562,7 +563,8 @@ static int ocfs2_truncate_for_delete(struct ocfs2_super *osb, | |||
562 | goto out; | 563 | goto out; |
563 | } | 564 | } |
564 | 565 | ||
565 | status = ocfs2_journal_access_di(handle, inode, fe_bh, | 566 | status = ocfs2_journal_access_di(handle, INODE_CACHE(inode), |
567 | fe_bh, | ||
566 | OCFS2_JOURNAL_ACCESS_WRITE); | 568 | OCFS2_JOURNAL_ACCESS_WRITE); |
567 | if (status < 0) { | 569 | if (status < 0) { |
568 | mlog_errno(status); | 570 | mlog_errno(status); |
@@ -646,7 +648,7 @@ static int ocfs2_remove_inode(struct inode *inode, | |||
646 | } | 648 | } |
647 | 649 | ||
648 | /* set the inodes dtime */ | 650 | /* set the inodes dtime */ |
649 | status = ocfs2_journal_access_di(handle, inode, di_bh, | 651 | status = ocfs2_journal_access_di(handle, INODE_CACHE(inode), di_bh, |
650 | OCFS2_JOURNAL_ACCESS_WRITE); | 652 | OCFS2_JOURNAL_ACCESS_WRITE); |
651 | if (status < 0) { | 653 | if (status < 0) { |
652 | mlog_errno(status); | 654 | mlog_errno(status); |
@@ -662,7 +664,7 @@ static int ocfs2_remove_inode(struct inode *inode, | |||
662 | goto bail_commit; | 664 | goto bail_commit; |
663 | } | 665 | } |
664 | 666 | ||
665 | ocfs2_remove_from_cache(inode, di_bh); | 667 | ocfs2_remove_from_cache(INODE_CACHE(inode), di_bh); |
666 | vfs_dq_free_inode(inode); | 668 | vfs_dq_free_inode(inode); |
667 | 669 | ||
668 | status = ocfs2_free_dinode(handle, inode_alloc_inode, | 670 | status = ocfs2_free_dinode(handle, inode_alloc_inode, |
@@ -781,6 +783,12 @@ static int ocfs2_wipe_inode(struct inode *inode, | |||
781 | goto bail_unlock_dir; | 783 | goto bail_unlock_dir; |
782 | } | 784 | } |
783 | 785 | ||
786 | status = ocfs2_remove_refcount_tree(inode, di_bh); | ||
787 | if (status < 0) { | ||
788 | mlog_errno(status); | ||
789 | goto bail_unlock_dir; | ||
790 | } | ||
791 | |||
784 | status = ocfs2_remove_inode(inode, di_bh, orphan_dir_inode, | 792 | status = ocfs2_remove_inode(inode, di_bh, orphan_dir_inode, |
785 | orphan_dir_bh); | 793 | orphan_dir_bh); |
786 | if (status < 0) | 794 | if (status < 0) |
@@ -1112,13 +1120,14 @@ void ocfs2_clear_inode(struct inode *inode) | |||
1112 | ocfs2_lock_res_free(&oi->ip_inode_lockres); | 1120 | ocfs2_lock_res_free(&oi->ip_inode_lockres); |
1113 | ocfs2_lock_res_free(&oi->ip_open_lockres); | 1121 | ocfs2_lock_res_free(&oi->ip_open_lockres); |
1114 | 1122 | ||
1115 | ocfs2_metadata_cache_purge(inode); | 1123 | ocfs2_metadata_cache_exit(INODE_CACHE(inode)); |
1116 | 1124 | ||
1117 | mlog_bug_on_msg(oi->ip_metadata_cache.ci_num_cached, | 1125 | mlog_bug_on_msg(INODE_CACHE(inode)->ci_num_cached, |
1118 | "Clear inode of %llu, inode has %u cache items\n", | 1126 | "Clear inode of %llu, inode has %u cache items\n", |
1119 | (unsigned long long)oi->ip_blkno, oi->ip_metadata_cache.ci_num_cached); | 1127 | (unsigned long long)oi->ip_blkno, |
1128 | INODE_CACHE(inode)->ci_num_cached); | ||
1120 | 1129 | ||
1121 | mlog_bug_on_msg(!(oi->ip_flags & OCFS2_INODE_CACHE_INLINE), | 1130 | mlog_bug_on_msg(!(INODE_CACHE(inode)->ci_flags & OCFS2_CACHE_FL_INLINE), |
1122 | "Clear inode of %llu, inode has a bad flag\n", | 1131 | "Clear inode of %llu, inode has a bad flag\n", |
1123 | (unsigned long long)oi->ip_blkno); | 1132 | (unsigned long long)oi->ip_blkno); |
1124 | 1133 | ||
@@ -1145,9 +1154,7 @@ void ocfs2_clear_inode(struct inode *inode) | |||
1145 | (unsigned long long)oi->ip_blkno, oi->ip_open_count); | 1154 | (unsigned long long)oi->ip_blkno, oi->ip_open_count); |
1146 | 1155 | ||
1147 | /* Clear all other flags. */ | 1156 | /* Clear all other flags. */ |
1148 | oi->ip_flags = OCFS2_INODE_CACHE_INLINE; | 1157 | oi->ip_flags = 0; |
1149 | oi->ip_created_trans = 0; | ||
1150 | oi->ip_last_trans = 0; | ||
1151 | oi->ip_dir_start_lookup = 0; | 1158 | oi->ip_dir_start_lookup = 0; |
1152 | oi->ip_blkno = 0ULL; | 1159 | oi->ip_blkno = 0ULL; |
1153 | 1160 | ||
@@ -1239,7 +1246,7 @@ int ocfs2_mark_inode_dirty(handle_t *handle, | |||
1239 | mlog_entry("(inode %llu)\n", | 1246 | mlog_entry("(inode %llu)\n", |
1240 | (unsigned long long)OCFS2_I(inode)->ip_blkno); | 1247 | (unsigned long long)OCFS2_I(inode)->ip_blkno); |
1241 | 1248 | ||
1242 | status = ocfs2_journal_access_di(handle, inode, bh, | 1249 | status = ocfs2_journal_access_di(handle, INODE_CACHE(inode), bh, |
1243 | OCFS2_JOURNAL_ACCESS_WRITE); | 1250 | OCFS2_JOURNAL_ACCESS_WRITE); |
1244 | if (status < 0) { | 1251 | if (status < 0) { |
1245 | mlog_errno(status); | 1252 | mlog_errno(status); |
@@ -1380,8 +1387,8 @@ int ocfs2_read_inode_block_full(struct inode *inode, struct buffer_head **bh, | |||
1380 | int rc; | 1387 | int rc; |
1381 | struct buffer_head *tmp = *bh; | 1388 | struct buffer_head *tmp = *bh; |
1382 | 1389 | ||
1383 | rc = ocfs2_read_blocks(inode, OCFS2_I(inode)->ip_blkno, 1, &tmp, | 1390 | rc = ocfs2_read_blocks(INODE_CACHE(inode), OCFS2_I(inode)->ip_blkno, |
1384 | flags, ocfs2_validate_inode_block); | 1391 | 1, &tmp, flags, ocfs2_validate_inode_block); |
1385 | 1392 | ||
1386 | /* If ocfs2_read_blocks() got us a new bh, pass it up. */ | 1393 | /* If ocfs2_read_blocks() got us a new bh, pass it up. */ |
1387 | if (!rc && !*bh) | 1394 | if (!rc && !*bh) |
@@ -1394,3 +1401,56 @@ int ocfs2_read_inode_block(struct inode *inode, struct buffer_head **bh) | |||
1394 | { | 1401 | { |
1395 | return ocfs2_read_inode_block_full(inode, bh, 0); | 1402 | return ocfs2_read_inode_block_full(inode, bh, 0); |
1396 | } | 1403 | } |
1404 | |||
1405 | |||
1406 | static u64 ocfs2_inode_cache_owner(struct ocfs2_caching_info *ci) | ||
1407 | { | ||
1408 | struct ocfs2_inode_info *oi = cache_info_to_inode(ci); | ||
1409 | |||
1410 | return oi->ip_blkno; | ||
1411 | } | ||
1412 | |||
1413 | static struct super_block *ocfs2_inode_cache_get_super(struct ocfs2_caching_info *ci) | ||
1414 | { | ||
1415 | struct ocfs2_inode_info *oi = cache_info_to_inode(ci); | ||
1416 | |||
1417 | return oi->vfs_inode.i_sb; | ||
1418 | } | ||
1419 | |||
1420 | static void ocfs2_inode_cache_lock(struct ocfs2_caching_info *ci) | ||
1421 | { | ||
1422 | struct ocfs2_inode_info *oi = cache_info_to_inode(ci); | ||
1423 | |||
1424 | spin_lock(&oi->ip_lock); | ||
1425 | } | ||
1426 | |||
1427 | static void ocfs2_inode_cache_unlock(struct ocfs2_caching_info *ci) | ||
1428 | { | ||
1429 | struct ocfs2_inode_info *oi = cache_info_to_inode(ci); | ||
1430 | |||
1431 | spin_unlock(&oi->ip_lock); | ||
1432 | } | ||
1433 | |||
1434 | static void ocfs2_inode_cache_io_lock(struct ocfs2_caching_info *ci) | ||
1435 | { | ||
1436 | struct ocfs2_inode_info *oi = cache_info_to_inode(ci); | ||
1437 | |||
1438 | mutex_lock(&oi->ip_io_mutex); | ||
1439 | } | ||
1440 | |||
1441 | static void ocfs2_inode_cache_io_unlock(struct ocfs2_caching_info *ci) | ||
1442 | { | ||
1443 | struct ocfs2_inode_info *oi = cache_info_to_inode(ci); | ||
1444 | |||
1445 | mutex_unlock(&oi->ip_io_mutex); | ||
1446 | } | ||
1447 | |||
1448 | const struct ocfs2_caching_operations ocfs2_inode_caching_ops = { | ||
1449 | .co_owner = ocfs2_inode_cache_owner, | ||
1450 | .co_get_super = ocfs2_inode_cache_get_super, | ||
1451 | .co_cache_lock = ocfs2_inode_cache_lock, | ||
1452 | .co_cache_unlock = ocfs2_inode_cache_unlock, | ||
1453 | .co_io_lock = ocfs2_inode_cache_io_lock, | ||
1454 | .co_io_unlock = ocfs2_inode_cache_io_unlock, | ||
1455 | }; | ||
1456 | |||