aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorJoel Becker <joel.becker@oracle.com>2009-02-10 23:00:41 -0500
committerJoel Becker <joel.becker@oracle.com>2009-09-04 19:07:48 -0400
commit8cb471e8f82506937fe5e2e9fb0bf90f6b1f1170 (patch)
treee275a8f5db101a9990ba44931cfd116123112b11 /fs
parent6e5a3d7538ad4e46a976862f593faf65750e37cc (diff)
ocfs2: Take the inode out of the metadata read/write paths.
We are really passing the inode into the ocfs2_read/write_blocks() functions to get at the metadata cache. This commit passes the cache directly into the metadata block functions, divorcing them from the inode. Signed-off-by: Joel Becker <joel.becker@oracle.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/ocfs2/alloc.c13
-rw-r--r--fs/ocfs2/buffer_head_io.c47
-rw-r--r--fs/ocfs2/buffer_head_io.h8
-rw-r--r--fs/ocfs2/dir.c23
-rw-r--r--fs/ocfs2/dlmglue.c2
-rw-r--r--fs/ocfs2/extent_map.c4
-rw-r--r--fs/ocfs2/inode.c24
-rw-r--r--fs/ocfs2/inode.h5
-rw-r--r--fs/ocfs2/journal.c4
-rw-r--r--fs/ocfs2/localalloc.c2
-rw-r--r--fs/ocfs2/namei.c5
-rw-r--r--fs/ocfs2/quota_global.c2
-rw-r--r--fs/ocfs2/quota_local.c6
-rw-r--r--fs/ocfs2/resize.c2
-rw-r--r--fs/ocfs2/slot_map.c10
-rw-r--r--fs/ocfs2/suballoc.c4
-rw-r--r--fs/ocfs2/super.c2
-rw-r--r--fs/ocfs2/uptodate.c83
-rw-r--r--fs/ocfs2/uptodate.h21
-rw-r--r--fs/ocfs2/xattr.c23
20 files changed, 156 insertions, 134 deletions
diff --git a/fs/ocfs2/alloc.c b/fs/ocfs2/alloc.c
index ab513ddaeff2..d5dffcfa192a 100644
--- a/fs/ocfs2/alloc.c
+++ b/fs/ocfs2/alloc.c
@@ -859,7 +859,7 @@ int ocfs2_read_extent_block(struct inode *inode, u64 eb_blkno,
859 int rc; 859 int rc;
860 struct buffer_head *tmp = *bh; 860 struct buffer_head *tmp = *bh;
861 861
862 rc = ocfs2_read_block(inode, eb_blkno, &tmp, 862 rc = ocfs2_read_block(INODE_CACHE(inode), eb_blkno, &tmp,
863 ocfs2_validate_extent_block); 863 ocfs2_validate_extent_block);
864 864
865 /* If ocfs2_read_block() got us a new bh, pass it up. */ 865 /* If ocfs2_read_block() got us a new bh, pass it up. */
@@ -949,7 +949,8 @@ static int ocfs2_create_new_meta_bhs(struct ocfs2_super *osb,
949 mlog_errno(status); 949 mlog_errno(status);
950 goto bail; 950 goto bail;
951 } 951 }
952 ocfs2_set_new_buffer_uptodate(inode, bhs[i]); 952 ocfs2_set_new_buffer_uptodate(INODE_CACHE(inode),
953 bhs[i]);
953 954
954 status = ocfs2_journal_access_eb(handle, inode, bhs[i], 955 status = ocfs2_journal_access_eb(handle, inode, bhs[i],
955 OCFS2_JOURNAL_ACCESS_CREATE); 956 OCFS2_JOURNAL_ACCESS_CREATE);
@@ -2559,7 +2560,7 @@ static void ocfs2_unlink_path(struct inode *inode, handle_t *handle,
2559 le16_to_cpu(el->l_next_free_rec)); 2560 le16_to_cpu(el->l_next_free_rec));
2560 2561
2561 ocfs2_journal_dirty(handle, bh); 2562 ocfs2_journal_dirty(handle, bh);
2562 ocfs2_remove_from_cache(inode, bh); 2563 ocfs2_remove_from_cache(INODE_CACHE(inode), bh);
2563 continue; 2564 continue;
2564 } 2565 }
2565 2566
@@ -2572,7 +2573,7 @@ static void ocfs2_unlink_path(struct inode *inode, handle_t *handle,
2572 if (ret) 2573 if (ret)
2573 mlog_errno(ret); 2574 mlog_errno(ret);
2574 2575
2575 ocfs2_remove_from_cache(inode, bh); 2576 ocfs2_remove_from_cache(INODE_CACHE(inode), bh);
2576 } 2577 }
2577} 2578}
2578 2579
@@ -6010,7 +6011,7 @@ int ocfs2_begin_truncate_log_recovery(struct ocfs2_super *osb,
6010 tl->tl_used = 0; 6011 tl->tl_used = 0;
6011 6012
6012 ocfs2_compute_meta_ecc(osb->sb, tl_bh->b_data, &di->i_check); 6013 ocfs2_compute_meta_ecc(osb->sb, tl_bh->b_data, &di->i_check);
6013 status = ocfs2_write_block(osb, tl_bh, tl_inode); 6014 status = ocfs2_write_block(osb, tl_bh, INODE_CACHE(tl_inode));
6014 if (status < 0) { 6015 if (status < 0) {
6015 mlog_errno(status); 6016 mlog_errno(status);
6016 goto bail; 6017 goto bail;
@@ -6719,7 +6720,7 @@ delete:
6719 6720
6720 mlog(0, "deleting this extent block.\n"); 6721 mlog(0, "deleting this extent block.\n");
6721 6722
6722 ocfs2_remove_from_cache(inode, bh); 6723 ocfs2_remove_from_cache(INODE_CACHE(inode), bh);
6723 6724
6724 BUG_ON(ocfs2_rec_clusters(el, &el->l_recs[0])); 6725 BUG_ON(ocfs2_rec_clusters(el, &el->l_recs[0]));
6725 BUG_ON(le32_to_cpu(el->l_recs[0].e_cpos)); 6726 BUG_ON(le32_to_cpu(el->l_recs[0].e_cpos));
diff --git a/fs/ocfs2/buffer_head_io.c b/fs/ocfs2/buffer_head_io.c
index 15c8e6deee2e..d43d34a1dd31 100644
--- a/fs/ocfs2/buffer_head_io.c
+++ b/fs/ocfs2/buffer_head_io.c
@@ -52,12 +52,12 @@ enum ocfs2_state_bits {
52BUFFER_FNS(NeedsValidate, needs_validate); 52BUFFER_FNS(NeedsValidate, needs_validate);
53 53
54int ocfs2_write_block(struct ocfs2_super *osb, struct buffer_head *bh, 54int ocfs2_write_block(struct ocfs2_super *osb, struct buffer_head *bh,
55 struct inode *inode) 55 struct ocfs2_caching_info *ci)
56{ 56{
57 int ret = 0; 57 int ret = 0;
58 58
59 mlog_entry("(bh->b_blocknr = %llu, inode=%p)\n", 59 mlog_entry("(bh->b_blocknr = %llu, ci=%p)\n",
60 (unsigned long long)bh->b_blocknr, inode); 60 (unsigned long long)bh->b_blocknr, ci);
61 61
62 BUG_ON(bh->b_blocknr < OCFS2_SUPER_BLOCK_BLKNO); 62 BUG_ON(bh->b_blocknr < OCFS2_SUPER_BLOCK_BLKNO);
63 BUG_ON(buffer_jbd(bh)); 63 BUG_ON(buffer_jbd(bh));
@@ -70,7 +70,7 @@ int ocfs2_write_block(struct ocfs2_super *osb, struct buffer_head *bh,
70 goto out; 70 goto out;
71 } 71 }
72 72
73 mutex_lock(&OCFS2_I(inode)->ip_io_mutex); 73 ocfs2_metadata_cache_io_lock(ci);
74 74
75 lock_buffer(bh); 75 lock_buffer(bh);
76 set_buffer_uptodate(bh); 76 set_buffer_uptodate(bh);
@@ -85,7 +85,7 @@ int ocfs2_write_block(struct ocfs2_super *osb, struct buffer_head *bh,
85 wait_on_buffer(bh); 85 wait_on_buffer(bh);
86 86
87 if (buffer_uptodate(bh)) { 87 if (buffer_uptodate(bh)) {
88 ocfs2_set_buffer_uptodate(inode, bh); 88 ocfs2_set_buffer_uptodate(ci, bh);
89 } else { 89 } else {
90 /* We don't need to remove the clustered uptodate 90 /* We don't need to remove the clustered uptodate
91 * information for this bh as it's not marked locally 91 * information for this bh as it's not marked locally
@@ -94,7 +94,7 @@ int ocfs2_write_block(struct ocfs2_super *osb, struct buffer_head *bh,
94 put_bh(bh); 94 put_bh(bh);
95 } 95 }
96 96
97 mutex_unlock(&OCFS2_I(inode)->ip_io_mutex); 97 ocfs2_metadata_cache_io_unlock(ci);
98out: 98out:
99 mlog_exit(ret); 99 mlog_exit(ret);
100 return ret; 100 return ret;
@@ -177,7 +177,7 @@ bail:
177 return status; 177 return status;
178} 178}
179 179
180int ocfs2_read_blocks(struct inode *inode, u64 block, int nr, 180int ocfs2_read_blocks(struct ocfs2_caching_info *ci, u64 block, int nr,
181 struct buffer_head *bhs[], int flags, 181 struct buffer_head *bhs[], int flags,
182 int (*validate)(struct super_block *sb, 182 int (*validate)(struct super_block *sb,
183 struct buffer_head *bh)) 183 struct buffer_head *bh))
@@ -185,11 +185,12 @@ int ocfs2_read_blocks(struct inode *inode, u64 block, int nr,
185 int status = 0; 185 int status = 0;
186 int i, ignore_cache = 0; 186 int i, ignore_cache = 0;
187 struct buffer_head *bh; 187 struct buffer_head *bh;
188 struct super_block *sb = ocfs2_metadata_cache_get_super(ci);
188 189
189 mlog_entry("(inode=%p, block=(%llu), nr=(%d), flags=%d)\n", 190 mlog_entry("(ci=%p, block=(%llu), nr=(%d), flags=%d)\n",
190 inode, (unsigned long long)block, nr, flags); 191 ci, (unsigned long long)block, nr, flags);
191 192
192 BUG_ON(!inode); 193 BUG_ON(!ci);
193 BUG_ON((flags & OCFS2_BH_READAHEAD) && 194 BUG_ON((flags & OCFS2_BH_READAHEAD) &&
194 (flags & OCFS2_BH_IGNORE_CACHE)); 195 (flags & OCFS2_BH_IGNORE_CACHE));
195 196
@@ -212,12 +213,12 @@ int ocfs2_read_blocks(struct inode *inode, u64 block, int nr,
212 goto bail; 213 goto bail;
213 } 214 }
214 215
215 mutex_lock(&OCFS2_I(inode)->ip_io_mutex); 216 ocfs2_metadata_cache_io_lock(ci);
216 for (i = 0 ; i < nr ; i++) { 217 for (i = 0 ; i < nr ; i++) {
217 if (bhs[i] == NULL) { 218 if (bhs[i] == NULL) {
218 bhs[i] = sb_getblk(inode->i_sb, block++); 219 bhs[i] = sb_getblk(sb, block++);
219 if (bhs[i] == NULL) { 220 if (bhs[i] == NULL) {
220 mutex_unlock(&OCFS2_I(inode)->ip_io_mutex); 221 ocfs2_metadata_cache_io_unlock(ci);
221 status = -EIO; 222 status = -EIO;
222 mlog_errno(status); 223 mlog_errno(status);
223 goto bail; 224 goto bail;
@@ -250,11 +251,11 @@ int ocfs2_read_blocks(struct inode *inode, u64 block, int nr,
250 * before our is-it-in-flight check. 251 * before our is-it-in-flight check.
251 */ 252 */
252 253
253 if (!ignore_cache && !ocfs2_buffer_uptodate(inode, bh)) { 254 if (!ignore_cache && !ocfs2_buffer_uptodate(ci, bh)) {
254 mlog(ML_UPTODATE, 255 mlog(ML_UPTODATE,
255 "bh (%llu), inode %llu not uptodate\n", 256 "bh (%llu), owner %llu not uptodate\n",
256 (unsigned long long)bh->b_blocknr, 257 (unsigned long long)bh->b_blocknr,
257 (unsigned long long)OCFS2_I(inode)->ip_blkno); 258 (unsigned long long)ocfs2_metadata_cache_owner(ci));
258 /* We're using ignore_cache here to say 259 /* We're using ignore_cache here to say
259 * "go to disk" */ 260 * "go to disk" */
260 ignore_cache = 1; 261 ignore_cache = 1;
@@ -283,7 +284,7 @@ int ocfs2_read_blocks(struct inode *inode, u64 block, int nr,
283 * previously submitted request than we are 284 * previously submitted request than we are
284 * done here. */ 285 * done here. */
285 if ((flags & OCFS2_BH_READAHEAD) 286 if ((flags & OCFS2_BH_READAHEAD)
286 && ocfs2_buffer_read_ahead(inode, bh)) 287 && ocfs2_buffer_read_ahead(ci, bh))
287 continue; 288 continue;
288 289
289 lock_buffer(bh); 290 lock_buffer(bh);
@@ -305,7 +306,7 @@ int ocfs2_read_blocks(struct inode *inode, u64 block, int nr,
305 * buffer lock. */ 306 * buffer lock. */
306 if (!(flags & OCFS2_BH_IGNORE_CACHE) 307 if (!(flags & OCFS2_BH_IGNORE_CACHE)
307 && !(flags & OCFS2_BH_READAHEAD) 308 && !(flags & OCFS2_BH_READAHEAD)
308 && ocfs2_buffer_uptodate(inode, bh)) { 309 && ocfs2_buffer_uptodate(ci, bh)) {
309 unlock_buffer(bh); 310 unlock_buffer(bh);
310 continue; 311 continue;
311 } 312 }
@@ -327,7 +328,7 @@ int ocfs2_read_blocks(struct inode *inode, u64 block, int nr,
327 328
328 if (!(flags & OCFS2_BH_READAHEAD)) { 329 if (!(flags & OCFS2_BH_READAHEAD)) {
329 /* We know this can't have changed as we hold the 330 /* We know this can't have changed as we hold the
330 * inode sem. Avoid doing any work on the bh if the 331 * owner sem. Avoid doing any work on the bh if the
331 * journal has it. */ 332 * journal has it. */
332 if (!buffer_jbd(bh)) 333 if (!buffer_jbd(bh))
333 wait_on_buffer(bh); 334 wait_on_buffer(bh);
@@ -351,7 +352,7 @@ int ocfs2_read_blocks(struct inode *inode, u64 block, int nr,
351 * that better not have changed */ 352 * that better not have changed */
352 BUG_ON(buffer_jbd(bh)); 353 BUG_ON(buffer_jbd(bh));
353 clear_buffer_needs_validate(bh); 354 clear_buffer_needs_validate(bh);
354 status = validate(inode->i_sb, bh); 355 status = validate(sb, bh);
355 if (status) { 356 if (status) {
356 put_bh(bh); 357 put_bh(bh);
357 bhs[i] = NULL; 358 bhs[i] = NULL;
@@ -363,9 +364,9 @@ int ocfs2_read_blocks(struct inode *inode, u64 block, int nr,
363 /* Always set the buffer in the cache, even if it was 364 /* Always set the buffer in the cache, even if it was
364 * a forced read, or read-ahead which hasn't yet 365 * a forced read, or read-ahead which hasn't yet
365 * completed. */ 366 * completed. */
366 ocfs2_set_buffer_uptodate(inode, bh); 367 ocfs2_set_buffer_uptodate(ci, bh);
367 } 368 }
368 mutex_unlock(&OCFS2_I(inode)->ip_io_mutex); 369 ocfs2_metadata_cache_io_unlock(ci);
369 370
370 mlog(ML_BH_IO, "block=(%llu), nr=(%d), cached=%s, flags=0x%x\n", 371 mlog(ML_BH_IO, "block=(%llu), nr=(%d), cached=%s, flags=0x%x\n",
371 (unsigned long long)block, nr, 372 (unsigned long long)block, nr,
@@ -399,7 +400,7 @@ static void ocfs2_check_super_or_backup(struct super_block *sb,
399 400
400/* 401/*
401 * Write super block and backups doesn't need to collaborate with journal, 402 * Write super block and backups doesn't need to collaborate with journal,
402 * so we don't need to lock ip_io_mutex and inode doesn't need to bea passed 403 * so we don't need to lock ip_io_mutex and ci doesn't need to bea passed
403 * into this function. 404 * into this function.
404 */ 405 */
405int ocfs2_write_super_or_backup(struct ocfs2_super *osb, 406int ocfs2_write_super_or_backup(struct ocfs2_super *osb,
diff --git a/fs/ocfs2/buffer_head_io.h b/fs/ocfs2/buffer_head_io.h
index c75d682dadd8..b97bcc6dde7c 100644
--- a/fs/ocfs2/buffer_head_io.h
+++ b/fs/ocfs2/buffer_head_io.h
@@ -33,7 +33,7 @@ void ocfs2_end_buffer_io_sync(struct buffer_head *bh,
33 33
34int ocfs2_write_block(struct ocfs2_super *osb, 34int ocfs2_write_block(struct ocfs2_super *osb,
35 struct buffer_head *bh, 35 struct buffer_head *bh,
36 struct inode *inode); 36 struct ocfs2_caching_info *ci);
37int ocfs2_read_blocks_sync(struct ocfs2_super *osb, u64 block, 37int ocfs2_read_blocks_sync(struct ocfs2_super *osb, u64 block,
38 unsigned int nr, struct buffer_head *bhs[]); 38 unsigned int nr, struct buffer_head *bhs[]);
39 39
@@ -44,7 +44,7 @@ int ocfs2_read_blocks_sync(struct ocfs2_super *osb, u64 block,
44 * be set even for a READAHEAD call, as it marks the buffer for later 44 * be set even for a READAHEAD call, as it marks the buffer for later
45 * validation. 45 * validation.
46 */ 46 */
47int ocfs2_read_blocks(struct inode *inode, u64 block, int nr, 47int ocfs2_read_blocks(struct ocfs2_caching_info *ci, u64 block, int nr,
48 struct buffer_head *bhs[], int flags, 48 struct buffer_head *bhs[], int flags,
49 int (*validate)(struct super_block *sb, 49 int (*validate)(struct super_block *sb,
50 struct buffer_head *bh)); 50 struct buffer_head *bh));
@@ -55,7 +55,7 @@ int ocfs2_write_super_or_backup(struct ocfs2_super *osb,
55#define OCFS2_BH_IGNORE_CACHE 1 55#define OCFS2_BH_IGNORE_CACHE 1
56#define OCFS2_BH_READAHEAD 8 56#define OCFS2_BH_READAHEAD 8
57 57
58static inline int ocfs2_read_block(struct inode *inode, u64 off, 58static inline int ocfs2_read_block(struct ocfs2_caching_info *ci, u64 off,
59 struct buffer_head **bh, 59 struct buffer_head **bh,
60 int (*validate)(struct super_block *sb, 60 int (*validate)(struct super_block *sb,
61 struct buffer_head *bh)) 61 struct buffer_head *bh))
@@ -68,7 +68,7 @@ static inline int ocfs2_read_block(struct inode *inode, u64 off,
68 goto bail; 68 goto bail;
69 } 69 }
70 70
71 status = ocfs2_read_blocks(inode, off, 1, bh, 0, validate); 71 status = ocfs2_read_blocks(ci, off, 1, bh, 0, validate);
72 72
73bail: 73bail:
74 return status; 74 return status;
diff --git a/fs/ocfs2/dir.c b/fs/ocfs2/dir.c
index b358f3bf896d..273fb7648fce 100644
--- a/fs/ocfs2/dir.c
+++ b/fs/ocfs2/dir.c
@@ -564,7 +564,8 @@ static int ocfs2_read_dir_block_direct(struct inode *dir, u64 phys,
564 int ret; 564 int ret;
565 struct buffer_head *tmp = *bh; 565 struct buffer_head *tmp = *bh;
566 566
567 ret = ocfs2_read_block(dir, phys, &tmp, ocfs2_validate_dir_block); 567 ret = ocfs2_read_block(INODE_CACHE(dir), phys, &tmp,
568 ocfs2_validate_dir_block);
568 if (ret) { 569 if (ret) {
569 mlog_errno(ret); 570 mlog_errno(ret);
570 goto out; 571 goto out;
@@ -622,7 +623,8 @@ static int ocfs2_read_dx_root(struct inode *dir, struct ocfs2_dinode *di,
622 u64 blkno = le64_to_cpu(di->i_dx_root); 623 u64 blkno = le64_to_cpu(di->i_dx_root);
623 struct buffer_head *tmp = *dx_root_bh; 624 struct buffer_head *tmp = *dx_root_bh;
624 625
625 ret = ocfs2_read_block(dir, blkno, &tmp, ocfs2_validate_dx_root); 626 ret = ocfs2_read_block(INODE_CACHE(dir), blkno, &tmp,
627 ocfs2_validate_dx_root);
626 628
627 /* If ocfs2_read_block() got us a new bh, pass it up. */ 629 /* If ocfs2_read_block() got us a new bh, pass it up. */
628 if (!ret && !*dx_root_bh) 630 if (!ret && !*dx_root_bh)
@@ -662,7 +664,8 @@ static int ocfs2_read_dx_leaf(struct inode *dir, u64 blkno,
662 int ret; 664 int ret;
663 struct buffer_head *tmp = *dx_leaf_bh; 665 struct buffer_head *tmp = *dx_leaf_bh;
664 666
665 ret = ocfs2_read_block(dir, blkno, &tmp, ocfs2_validate_dx_leaf); 667 ret = ocfs2_read_block(INODE_CACHE(dir), blkno, &tmp,
668 ocfs2_validate_dx_leaf);
666 669
667 /* If ocfs2_read_block() got us a new bh, pass it up. */ 670 /* If ocfs2_read_block() got us a new bh, pass it up. */
668 if (!ret && !*dx_leaf_bh) 671 if (!ret && !*dx_leaf_bh)
@@ -680,7 +683,7 @@ static int ocfs2_read_dx_leaves(struct inode *dir, u64 start, int num,
680{ 683{
681 int ret; 684 int ret;
682 685
683 ret = ocfs2_read_blocks(dir, start, num, dx_leaf_bhs, 0, 686 ret = ocfs2_read_blocks(INODE_CACHE(dir), start, num, dx_leaf_bhs, 0,
684 ocfs2_validate_dx_leaf); 687 ocfs2_validate_dx_leaf);
685 if (ret) 688 if (ret)
686 mlog_errno(ret); 689 mlog_errno(ret);
@@ -2332,7 +2335,7 @@ static int ocfs2_fill_new_dir_el(struct ocfs2_super *osb,
2332 goto bail; 2335 goto bail;
2333 } 2336 }
2334 2337
2335 ocfs2_set_new_buffer_uptodate(inode, new_bh); 2338 ocfs2_set_new_buffer_uptodate(INODE_CACHE(inode), new_bh);
2336 2339
2337 status = ocfs2_journal_access_db(handle, inode, new_bh, 2340 status = ocfs2_journal_access_db(handle, inode, new_bh,
2338 OCFS2_JOURNAL_ACCESS_CREATE); 2341 OCFS2_JOURNAL_ACCESS_CREATE);
@@ -2418,7 +2421,7 @@ static int ocfs2_dx_dir_attach_index(struct ocfs2_super *osb,
2418 ret = -EIO; 2421 ret = -EIO;
2419 goto out; 2422 goto out;
2420 } 2423 }
2421 ocfs2_set_new_buffer_uptodate(dir, dx_root_bh); 2424 ocfs2_set_new_buffer_uptodate(INODE_CACHE(dir), dx_root_bh);
2422 2425
2423 ret = ocfs2_journal_access_dr(handle, dir, dx_root_bh, 2426 ret = ocfs2_journal_access_dr(handle, dir, dx_root_bh,
2424 OCFS2_JOURNAL_ACCESS_CREATE); 2427 OCFS2_JOURNAL_ACCESS_CREATE);
@@ -2495,7 +2498,7 @@ static int ocfs2_dx_dir_format_cluster(struct ocfs2_super *osb,
2495 } 2498 }
2496 dx_leaves[i] = bh; 2499 dx_leaves[i] = bh;
2497 2500
2498 ocfs2_set_new_buffer_uptodate(dir, bh); 2501 ocfs2_set_new_buffer_uptodate(INODE_CACHE(dir), bh);
2499 2502
2500 ret = ocfs2_journal_access_dl(handle, dir, bh, 2503 ret = ocfs2_journal_access_dl(handle, dir, bh,
2501 OCFS2_JOURNAL_ACCESS_CREATE); 2504 OCFS2_JOURNAL_ACCESS_CREATE);
@@ -3005,7 +3008,7 @@ static int ocfs2_expand_inline_dir(struct inode *dir, struct buffer_head *di_bh,
3005 goto out_commit; 3008 goto out_commit;
3006 } 3009 }
3007 3010
3008 ocfs2_set_new_buffer_uptodate(dir, dirdata_bh); 3011 ocfs2_set_new_buffer_uptodate(INODE_CACHE(dir), dirdata_bh);
3009 3012
3010 ret = ocfs2_journal_access_db(handle, dir, dirdata_bh, 3013 ret = ocfs2_journal_access_db(handle, dir, dirdata_bh,
3011 OCFS2_JOURNAL_ACCESS_CREATE); 3014 OCFS2_JOURNAL_ACCESS_CREATE);
@@ -3387,7 +3390,7 @@ do_extend:
3387 goto bail; 3390 goto bail;
3388 } 3391 }
3389 3392
3390 ocfs2_set_new_buffer_uptodate(dir, new_bh); 3393 ocfs2_set_new_buffer_uptodate(INODE_CACHE(dir), new_bh);
3391 3394
3392 status = ocfs2_journal_access_db(handle, dir, new_bh, 3395 status = ocfs2_journal_access_db(handle, dir, new_bh,
3393 OCFS2_JOURNAL_ACCESS_CREATE); 3396 OCFS2_JOURNAL_ACCESS_CREATE);
@@ -4565,7 +4568,7 @@ remove_index:
4565 goto out; 4568 goto out;
4566 } 4569 }
4567 4570
4568 ocfs2_remove_from_cache(dir, dx_root_bh); 4571 ocfs2_remove_from_cache(INODE_CACHE(dir), dx_root_bh);
4569out: 4572out:
4570 ocfs2_schedule_truncate_log_flush(osb, 1); 4573 ocfs2_schedule_truncate_log_flush(osb, 1);
4571 ocfs2_run_deallocs(osb, &dealloc); 4574 ocfs2_run_deallocs(osb, &dealloc);
diff --git a/fs/ocfs2/dlmglue.c b/fs/ocfs2/dlmglue.c
index 110bb57c46ab..fe15cee0322a 100644
--- a/fs/ocfs2/dlmglue.c
+++ b/fs/ocfs2/dlmglue.c
@@ -2127,7 +2127,7 @@ static int ocfs2_inode_lock_update(struct inode *inode,
2127 2127
2128 /* This will discard any caching information we might have had 2128 /* This will discard any caching information we might have had
2129 * for the inode metadata. */ 2129 * for the inode metadata. */
2130 ocfs2_metadata_cache_purge(inode); 2130 ocfs2_metadata_cache_purge(INODE_CACHE(inode));
2131 2131
2132 ocfs2_extent_map_trunc(inode, 0); 2132 ocfs2_extent_map_trunc(inode, 0);
2133 2133
diff --git a/fs/ocfs2/extent_map.c b/fs/ocfs2/extent_map.c
index f2bb1a04d253..dbd8a16d5125 100644
--- a/fs/ocfs2/extent_map.c
+++ b/fs/ocfs2/extent_map.c
@@ -862,8 +862,8 @@ int ocfs2_read_virt_blocks(struct inode *inode, u64 v_block, int nr,
862 BUG_ON(bhs[done + i]->b_blocknr != (p_block + i)); 862 BUG_ON(bhs[done + i]->b_blocknr != (p_block + i));
863 } 863 }
864 864
865 rc = ocfs2_read_blocks(inode, p_block, count, bhs + done, 865 rc = ocfs2_read_blocks(INODE_CACHE(inode), p_block, count,
866 flags, validate); 866 bhs + done, flags, validate);
867 if (rc) { 867 if (rc) {
868 mlog_errno(rc); 868 mlog_errno(rc);
869 break; 869 break;
diff --git a/fs/ocfs2/inode.c b/fs/ocfs2/inode.c
index 36bb588f8fcb..1c9713cceb39 100644
--- a/fs/ocfs2/inode.c
+++ b/fs/ocfs2/inode.c
@@ -662,7 +662,7 @@ static int ocfs2_remove_inode(struct inode *inode,
662 goto bail_commit; 662 goto bail_commit;
663 } 663 }
664 664
665 ocfs2_remove_from_cache(inode, di_bh); 665 ocfs2_remove_from_cache(INODE_CACHE(inode), di_bh);
666 vfs_dq_free_inode(inode); 666 vfs_dq_free_inode(inode);
667 667
668 status = ocfs2_free_dinode(handle, inode_alloc_inode, 668 status = ocfs2_free_dinode(handle, inode_alloc_inode,
@@ -1112,14 +1112,14 @@ void ocfs2_clear_inode(struct inode *inode)
1112 ocfs2_lock_res_free(&oi->ip_inode_lockres); 1112 ocfs2_lock_res_free(&oi->ip_inode_lockres);
1113 ocfs2_lock_res_free(&oi->ip_open_lockres); 1113 ocfs2_lock_res_free(&oi->ip_open_lockres);
1114 1114
1115 ocfs2_metadata_cache_purge(inode); 1115 ocfs2_metadata_cache_purge(INODE_CACHE(inode));
1116 1116
1117 mlog_bug_on_msg(oi->ip_metadata_cache.ci_num_cached, 1117 mlog_bug_on_msg(INODE_CACHE(inode)->ci_num_cached,
1118 "Clear inode of %llu, inode has %u cache items\n", 1118 "Clear inode of %llu, inode has %u cache items\n",
1119 (unsigned long long)oi->ip_blkno, oi->ip_metadata_cache.ci_num_cached); 1119 (unsigned long long)oi->ip_blkno,
1120 INODE_CACHE(inode)->ci_num_cached);
1120 1121
1121 mlog_bug_on_msg(!(oi->ip_metadata_cache.ci_flags & 1122 mlog_bug_on_msg(!(INODE_CACHE(inode)->ci_flags & OCFS2_CACHE_FL_INLINE),
1122 OCFS2_CACHE_FL_INLINE),
1123 "Clear inode of %llu, inode has a bad flag\n", 1123 "Clear inode of %llu, inode has a bad flag\n",
1124 (unsigned long long)oi->ip_blkno); 1124 (unsigned long long)oi->ip_blkno);
1125 1125
@@ -1381,8 +1381,8 @@ int ocfs2_read_inode_block_full(struct inode *inode, struct buffer_head **bh,
1381 int rc; 1381 int rc;
1382 struct buffer_head *tmp = *bh; 1382 struct buffer_head *tmp = *bh;
1383 1383
1384 rc = ocfs2_read_blocks(inode, OCFS2_I(inode)->ip_blkno, 1, &tmp, 1384 rc = ocfs2_read_blocks(INODE_CACHE(inode), OCFS2_I(inode)->ip_blkno,
1385 flags, ocfs2_validate_inode_block); 1385 1, &tmp, flags, ocfs2_validate_inode_block);
1386 1386
1387 /* If ocfs2_read_blocks() got us a new bh, pass it up. */ 1387 /* If ocfs2_read_blocks() got us a new bh, pass it up. */
1388 if (!rc && !*bh) 1388 if (!rc && !*bh)
@@ -1408,6 +1408,13 @@ static u64 ocfs2_inode_cache_owner(struct ocfs2_caching_info *ci)
1408 return oi->ip_blkno; 1408 return oi->ip_blkno;
1409} 1409}
1410 1410
1411static struct super_block *ocfs2_inode_cache_get_super(struct ocfs2_caching_info *ci)
1412{
1413 struct ocfs2_inode_info *oi = cache_info_to_inode(ci);
1414
1415 return oi->vfs_inode.i_sb;
1416}
1417
1411static void ocfs2_inode_cache_lock(struct ocfs2_caching_info *ci) 1418static void ocfs2_inode_cache_lock(struct ocfs2_caching_info *ci)
1412{ 1419{
1413 struct ocfs2_inode_info *oi = cache_info_to_inode(ci); 1420 struct ocfs2_inode_info *oi = cache_info_to_inode(ci);
@@ -1438,6 +1445,7 @@ static void ocfs2_inode_cache_io_unlock(struct ocfs2_caching_info *ci)
1438 1445
1439const struct ocfs2_caching_operations ocfs2_inode_caching_ops = { 1446const struct ocfs2_caching_operations ocfs2_inode_caching_ops = {
1440 .co_owner = ocfs2_inode_cache_owner, 1447 .co_owner = ocfs2_inode_cache_owner,
1448 .co_get_super = ocfs2_inode_cache_get_super,
1441 .co_cache_lock = ocfs2_inode_cache_lock, 1449 .co_cache_lock = ocfs2_inode_cache_lock,
1442 .co_cache_unlock = ocfs2_inode_cache_unlock, 1450 .co_cache_unlock = ocfs2_inode_cache_unlock,
1443 .co_io_lock = ocfs2_inode_cache_io_lock, 1451 .co_io_lock = ocfs2_inode_cache_io_lock,
diff --git a/fs/ocfs2/inode.h b/fs/ocfs2/inode.h
index cd1caca545f5..b0a71b22712c 100644
--- a/fs/ocfs2/inode.h
+++ b/fs/ocfs2/inode.h
@@ -120,6 +120,11 @@ extern struct kmem_cache *ocfs2_inode_cache;
120extern const struct address_space_operations ocfs2_aops; 120extern const struct address_space_operations ocfs2_aops;
121extern const struct ocfs2_caching_operations ocfs2_inode_caching_ops; 121extern const struct ocfs2_caching_operations ocfs2_inode_caching_ops;
122 122
123static inline struct ocfs2_caching_info *INODE_CACHE(struct inode *inode)
124{
125 return &OCFS2_I(inode)->ip_metadata_cache;
126}
127
123void ocfs2_clear_inode(struct inode *inode); 128void ocfs2_clear_inode(struct inode *inode);
124void ocfs2_delete_inode(struct inode *inode); 129void ocfs2_delete_inode(struct inode *inode);
125void ocfs2_drop_inode(struct inode *inode); 130void ocfs2_drop_inode(struct inode *inode);
diff --git a/fs/ocfs2/journal.c b/fs/ocfs2/journal.c
index c48b93ac6b65..ddf08d384ba1 100644
--- a/fs/ocfs2/journal.c
+++ b/fs/ocfs2/journal.c
@@ -898,7 +898,7 @@ static int ocfs2_journal_toggle_dirty(struct ocfs2_super *osb,
898 ocfs2_bump_recovery_generation(fe); 898 ocfs2_bump_recovery_generation(fe);
899 899
900 ocfs2_compute_meta_ecc(osb->sb, bh->b_data, &fe->i_check); 900 ocfs2_compute_meta_ecc(osb->sb, bh->b_data, &fe->i_check);
901 status = ocfs2_write_block(osb, bh, journal->j_inode); 901 status = ocfs2_write_block(osb, bh, INODE_CACHE(journal->j_inode));
902 if (status < 0) 902 if (status < 0)
903 mlog_errno(status); 903 mlog_errno(status);
904 904
@@ -1642,7 +1642,7 @@ static int ocfs2_replay_journal(struct ocfs2_super *osb,
1642 ocfs2_get_recovery_generation(fe); 1642 ocfs2_get_recovery_generation(fe);
1643 1643
1644 ocfs2_compute_meta_ecc(osb->sb, bh->b_data, &fe->i_check); 1644 ocfs2_compute_meta_ecc(osb->sb, bh->b_data, &fe->i_check);
1645 status = ocfs2_write_block(osb, bh, inode); 1645 status = ocfs2_write_block(osb, bh, INODE_CACHE(inode));
1646 if (status < 0) 1646 if (status < 0)
1647 mlog_errno(status); 1647 mlog_errno(status);
1648 1648
diff --git a/fs/ocfs2/localalloc.c b/fs/ocfs2/localalloc.c
index bac7e6abaf47..da5dd6a70e16 100644
--- a/fs/ocfs2/localalloc.c
+++ b/fs/ocfs2/localalloc.c
@@ -392,7 +392,7 @@ int ocfs2_begin_local_alloc_recovery(struct ocfs2_super *osb,
392 ocfs2_clear_local_alloc(alloc); 392 ocfs2_clear_local_alloc(alloc);
393 393
394 ocfs2_compute_meta_ecc(osb->sb, alloc_bh->b_data, &alloc->i_check); 394 ocfs2_compute_meta_ecc(osb->sb, alloc_bh->b_data, &alloc->i_check);
395 status = ocfs2_write_block(osb, alloc_bh, inode); 395 status = ocfs2_write_block(osb, alloc_bh, INODE_CACHE(inode));
396 if (status < 0) 396 if (status < 0)
397 mlog_errno(status); 397 mlog_errno(status);
398 398
diff --git a/fs/ocfs2/namei.c b/fs/ocfs2/namei.c
index 8601f934010b..689761b57a18 100644
--- a/fs/ocfs2/namei.c
+++ b/fs/ocfs2/namei.c
@@ -507,7 +507,7 @@ static int ocfs2_mknod_locked(struct ocfs2_super *osb,
507 mlog_errno(status); 507 mlog_errno(status);
508 goto leave; 508 goto leave;
509 } 509 }
510 ocfs2_set_new_buffer_uptodate(inode, *new_fe_bh); 510 ocfs2_set_new_buffer_uptodate(INODE_CACHE(inode), *new_fe_bh);
511 511
512 status = ocfs2_journal_access_di(handle, inode, *new_fe_bh, 512 status = ocfs2_journal_access_di(handle, inode, *new_fe_bh,
513 OCFS2_JOURNAL_ACCESS_CREATE); 513 OCFS2_JOURNAL_ACCESS_CREATE);
@@ -1527,7 +1527,8 @@ static int ocfs2_create_symlink_data(struct ocfs2_super *osb,
1527 mlog_errno(status); 1527 mlog_errno(status);
1528 goto bail; 1528 goto bail;
1529 } 1529 }
1530 ocfs2_set_new_buffer_uptodate(inode, bhs[virtual]); 1530 ocfs2_set_new_buffer_uptodate(INODE_CACHE(inode),
1531 bhs[virtual]);
1531 1532
1532 status = ocfs2_journal_access(handle, inode, bhs[virtual], 1533 status = ocfs2_journal_access(handle, inode, bhs[virtual],
1533 OCFS2_JOURNAL_ACCESS_CREATE); 1534 OCFS2_JOURNAL_ACCESS_CREATE);
diff --git a/fs/ocfs2/quota_global.c b/fs/ocfs2/quota_global.c
index 44f2a5e1d042..0d7125bb71d9 100644
--- a/fs/ocfs2/quota_global.c
+++ b/fs/ocfs2/quota_global.c
@@ -253,7 +253,7 @@ ssize_t ocfs2_quota_write(struct super_block *sb, int type,
253 flush_dcache_page(bh->b_page); 253 flush_dcache_page(bh->b_page);
254 set_buffer_uptodate(bh); 254 set_buffer_uptodate(bh);
255 unlock_buffer(bh); 255 unlock_buffer(bh);
256 ocfs2_set_buffer_uptodate(gqinode, bh); 256 ocfs2_set_buffer_uptodate(INODE_CACHE(gqinode), bh);
257 err = ocfs2_journal_access_dq(handle, gqinode, bh, ja_type); 257 err = ocfs2_journal_access_dq(handle, gqinode, bh, ja_type);
258 if (err < 0) { 258 if (err < 0) {
259 brelse(bh); 259 brelse(bh);
diff --git a/fs/ocfs2/quota_local.c b/fs/ocfs2/quota_local.c
index bdb09cb6e1fe..3df2954ac83b 100644
--- a/fs/ocfs2/quota_local.c
+++ b/fs/ocfs2/quota_local.c
@@ -993,7 +993,7 @@ static struct ocfs2_quota_chunk *ocfs2_local_quota_add_chunk(
993 goto out_trans; 993 goto out_trans;
994 } 994 }
995 dchunk = (struct ocfs2_local_disk_chunk *)bh->b_data; 995 dchunk = (struct ocfs2_local_disk_chunk *)bh->b_data;
996 ocfs2_set_new_buffer_uptodate(lqinode, bh); 996 ocfs2_set_new_buffer_uptodate(INODE_CACHE(lqinode), bh);
997 status = ocfs2_journal_access_dq(handle, lqinode, bh, 997 status = ocfs2_journal_access_dq(handle, lqinode, bh,
998 OCFS2_JOURNAL_ACCESS_CREATE); 998 OCFS2_JOURNAL_ACCESS_CREATE);
999 if (status < 0) { 999 if (status < 0) {
@@ -1027,7 +1027,7 @@ static struct ocfs2_quota_chunk *ocfs2_local_quota_add_chunk(
1027 mlog_errno(status); 1027 mlog_errno(status);
1028 goto out_trans; 1028 goto out_trans;
1029 } 1029 }
1030 ocfs2_set_new_buffer_uptodate(lqinode, dbh); 1030 ocfs2_set_new_buffer_uptodate(INODE_CACHE(lqinode), dbh);
1031 status = ocfs2_journal_access_dq(handle, lqinode, dbh, 1031 status = ocfs2_journal_access_dq(handle, lqinode, dbh,
1032 OCFS2_JOURNAL_ACCESS_CREATE); 1032 OCFS2_JOURNAL_ACCESS_CREATE);
1033 if (status < 0) { 1033 if (status < 0) {
@@ -1131,7 +1131,7 @@ static struct ocfs2_quota_chunk *ocfs2_extend_local_quota_file(
1131 mlog_errno(status); 1131 mlog_errno(status);
1132 goto out; 1132 goto out;
1133 } 1133 }
1134 ocfs2_set_new_buffer_uptodate(lqinode, bh); 1134 ocfs2_set_new_buffer_uptodate(INODE_CACHE(lqinode), bh);
1135 1135
1136 /* Local quota info, chunk header and the new block we initialize */ 1136 /* Local quota info, chunk header and the new block we initialize */
1137 handle = ocfs2_start_trans(OCFS2_SB(sb), 1137 handle = ocfs2_start_trans(OCFS2_SB(sb),
diff --git a/fs/ocfs2/resize.c b/fs/ocfs2/resize.c
index 424adaa5f900..7465f0fded77 100644
--- a/fs/ocfs2/resize.c
+++ b/fs/ocfs2/resize.c
@@ -514,7 +514,7 @@ int ocfs2_group_add(struct inode *inode, struct ocfs2_new_group_input *input)
514 goto out_unlock; 514 goto out_unlock;
515 } 515 }
516 516
517 ocfs2_set_new_buffer_uptodate(inode, group_bh); 517 ocfs2_set_new_buffer_uptodate(INODE_CACHE(inode), group_bh);
518 518
519 ret = ocfs2_verify_group_and_input(main_bm_inode, fe, input, group_bh); 519 ret = ocfs2_verify_group_and_input(main_bm_inode, fe, input, group_bh);
520 if (ret) { 520 if (ret) {
diff --git a/fs/ocfs2/slot_map.c b/fs/ocfs2/slot_map.c
index 40661e7824e9..bfbd7e9e949f 100644
--- a/fs/ocfs2/slot_map.c
+++ b/fs/ocfs2/slot_map.c
@@ -150,8 +150,8 @@ int ocfs2_refresh_slot_info(struct ocfs2_super *osb)
150 * be !NULL. Thus, ocfs2_read_blocks() will ignore blocknr. If 150 * be !NULL. Thus, ocfs2_read_blocks() will ignore blocknr. If
151 * this is not true, the read of -1 (UINT64_MAX) will fail. 151 * this is not true, the read of -1 (UINT64_MAX) will fail.
152 */ 152 */
153 ret = ocfs2_read_blocks(si->si_inode, -1, si->si_blocks, si->si_bh, 153 ret = ocfs2_read_blocks(INODE_CACHE(si->si_inode), -1, si->si_blocks,
154 OCFS2_BH_IGNORE_CACHE, NULL); 154 si->si_bh, OCFS2_BH_IGNORE_CACHE, NULL);
155 if (ret == 0) { 155 if (ret == 0) {
156 spin_lock(&osb->osb_lock); 156 spin_lock(&osb->osb_lock);
157 ocfs2_update_slot_info(si); 157 ocfs2_update_slot_info(si);
@@ -213,7 +213,7 @@ static int ocfs2_update_disk_slot(struct ocfs2_super *osb,
213 ocfs2_update_disk_slot_old(si, slot_num, &bh); 213 ocfs2_update_disk_slot_old(si, slot_num, &bh);
214 spin_unlock(&osb->osb_lock); 214 spin_unlock(&osb->osb_lock);
215 215
216 status = ocfs2_write_block(osb, bh, si->si_inode); 216 status = ocfs2_write_block(osb, bh, INODE_CACHE(si->si_inode));
217 if (status < 0) 217 if (status < 0)
218 mlog_errno(status); 218 mlog_errno(status);
219 219
@@ -404,8 +404,8 @@ static int ocfs2_map_slot_buffers(struct ocfs2_super *osb,
404 (unsigned long long)blkno); 404 (unsigned long long)blkno);
405 405
406 bh = NULL; /* Acquire a fresh bh */ 406 bh = NULL; /* Acquire a fresh bh */
407 status = ocfs2_read_blocks(si->si_inode, blkno, 1, &bh, 407 status = ocfs2_read_blocks(INODE_CACHE(si->si_inode), blkno,
408 OCFS2_BH_IGNORE_CACHE, NULL); 408 1, &bh, OCFS2_BH_IGNORE_CACHE, NULL);
409 if (status < 0) { 409 if (status < 0) {
410 mlog_errno(status); 410 mlog_errno(status);
411 goto bail; 411 goto bail;
diff --git a/fs/ocfs2/suballoc.c b/fs/ocfs2/suballoc.c
index 73a16d4666dc..21aaaaaaa2d3 100644
--- a/fs/ocfs2/suballoc.c
+++ b/fs/ocfs2/suballoc.c
@@ -310,7 +310,7 @@ int ocfs2_read_group_descriptor(struct inode *inode, struct ocfs2_dinode *di,
310 int rc; 310 int rc;
311 struct buffer_head *tmp = *bh; 311 struct buffer_head *tmp = *bh;
312 312
313 rc = ocfs2_read_block(inode, gd_blkno, &tmp, 313 rc = ocfs2_read_block(INODE_CACHE(inode), gd_blkno, &tmp,
314 ocfs2_validate_group_descriptor); 314 ocfs2_validate_group_descriptor);
315 if (rc) 315 if (rc)
316 goto out; 316 goto out;
@@ -476,7 +476,7 @@ static int ocfs2_block_group_alloc(struct ocfs2_super *osb,
476 mlog_errno(status); 476 mlog_errno(status);
477 goto bail; 477 goto bail;
478 } 478 }
479 ocfs2_set_new_buffer_uptodate(alloc_inode, bg_bh); 479 ocfs2_set_new_buffer_uptodate(INODE_CACHE(alloc_inode), bg_bh);
480 480
481 status = ocfs2_block_group_fill(handle, 481 status = ocfs2_block_group_fill(handle,
482 alloc_inode, 482 alloc_inode,
diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c
index 746ed5d4dda9..af118ad98c58 100644
--- a/fs/ocfs2/super.c
+++ b/fs/ocfs2/super.c
@@ -1683,7 +1683,7 @@ static void ocfs2_inode_init_once(void *data)
1683 ocfs2_lock_res_init_once(&oi->ip_inode_lockres); 1683 ocfs2_lock_res_init_once(&oi->ip_inode_lockres);
1684 ocfs2_lock_res_init_once(&oi->ip_open_lockres); 1684 ocfs2_lock_res_init_once(&oi->ip_open_lockres);
1685 1685
1686 ocfs2_metadata_cache_init(&oi->ip_metadata_cache, 1686 ocfs2_metadata_cache_init(INODE_CACHE(&oi->vfs_inode),
1687 &ocfs2_inode_caching_ops); 1687 &ocfs2_inode_caching_ops);
1688 1688
1689 inode_init_once(&oi->vfs_inode); 1689 inode_init_once(&oi->vfs_inode);
diff --git a/fs/ocfs2/uptodate.c b/fs/ocfs2/uptodate.c
index 226d0429fd7f..1c829e451019 100644
--- a/fs/ocfs2/uptodate.c
+++ b/fs/ocfs2/uptodate.c
@@ -75,13 +75,20 @@ struct ocfs2_meta_cache_item {
75 75
76static struct kmem_cache *ocfs2_uptodate_cachep = NULL; 76static struct kmem_cache *ocfs2_uptodate_cachep = NULL;
77 77
78static u64 ocfs2_metadata_cache_owner(struct ocfs2_caching_info *ci) 78u64 ocfs2_metadata_cache_owner(struct ocfs2_caching_info *ci)
79{ 79{
80 BUG_ON(!ci || !ci->ci_ops); 80 BUG_ON(!ci || !ci->ci_ops);
81 81
82 return ci->ci_ops->co_owner(ci); 82 return ci->ci_ops->co_owner(ci);
83} 83}
84 84
85struct super_block *ocfs2_metadata_cache_get_super(struct ocfs2_caching_info *ci)
86{
87 BUG_ON(!ci || !ci->ci_ops);
88
89 return ci->ci_ops->co_get_super(ci);
90}
91
85static void ocfs2_metadata_cache_lock(struct ocfs2_caching_info *ci) 92static void ocfs2_metadata_cache_lock(struct ocfs2_caching_info *ci)
86{ 93{
87 BUG_ON(!ci || !ci->ci_ops); 94 BUG_ON(!ci || !ci->ci_ops);
@@ -96,14 +103,14 @@ static void ocfs2_metadata_cache_unlock(struct ocfs2_caching_info *ci)
96 ci->ci_ops->co_cache_unlock(ci); 103 ci->ci_ops->co_cache_unlock(ci);
97} 104}
98 105
99static void ocfs2_metadata_cache_io_lock(struct ocfs2_caching_info *ci) 106void ocfs2_metadata_cache_io_lock(struct ocfs2_caching_info *ci)
100{ 107{
101 BUG_ON(!ci || !ci->ci_ops); 108 BUG_ON(!ci || !ci->ci_ops);
102 109
103 ci->ci_ops->co_io_lock(ci); 110 ci->ci_ops->co_io_lock(ci);
104} 111}
105 112
106static void ocfs2_metadata_cache_io_unlock(struct ocfs2_caching_info *ci) 113void ocfs2_metadata_cache_io_unlock(struct ocfs2_caching_info *ci)
107{ 114{
108 BUG_ON(!ci || !ci->ci_ops); 115 BUG_ON(!ci || !ci->ci_ops);
109 116
@@ -149,11 +156,9 @@ static unsigned int ocfs2_purge_copied_metadata_tree(struct rb_root *root)
149 * This function is a few more lines longer than necessary due to some 156 * This function is a few more lines longer than necessary due to some
150 * accounting done here, but I think it's worth tracking down those 157 * accounting done here, but I think it's worth tracking down those
151 * bugs sooner -- Mark */ 158 * bugs sooner -- Mark */
152void ocfs2_metadata_cache_purge(struct inode *inode) 159void ocfs2_metadata_cache_purge(struct ocfs2_caching_info *ci)
153{ 160{
154 struct ocfs2_inode_info *oi = OCFS2_I(inode);
155 unsigned int tree, to_purge, purged; 161 unsigned int tree, to_purge, purged;
156 struct ocfs2_caching_info *ci = &oi->ip_metadata_cache;
157 struct rb_root root = RB_ROOT; 162 struct rb_root root = RB_ROOT;
158 163
159 BUG_ON(!ci || !ci->ci_ops); 164 BUG_ON(!ci || !ci->ci_ops);
@@ -223,12 +228,11 @@ ocfs2_search_cache_tree(struct ocfs2_caching_info *ci,
223 return NULL; 228 return NULL;
224} 229}
225 230
226static int ocfs2_buffer_cached(struct ocfs2_inode_info *oi, 231static int ocfs2_buffer_cached(struct ocfs2_caching_info *ci,
227 struct buffer_head *bh) 232 struct buffer_head *bh)
228{ 233{
229 int index = -1; 234 int index = -1;
230 struct ocfs2_meta_cache_item *item = NULL; 235 struct ocfs2_meta_cache_item *item = NULL;
231 struct ocfs2_caching_info *ci = &oi->ip_metadata_cache;
232 236
233 ocfs2_metadata_cache_lock(ci); 237 ocfs2_metadata_cache_lock(ci);
234 238
@@ -238,11 +242,9 @@ static int ocfs2_buffer_cached(struct ocfs2_inode_info *oi,
238 !!(ci->ci_flags & OCFS2_CACHE_FL_INLINE)); 242 !!(ci->ci_flags & OCFS2_CACHE_FL_INLINE));
239 243
240 if (ci->ci_flags & OCFS2_CACHE_FL_INLINE) 244 if (ci->ci_flags & OCFS2_CACHE_FL_INLINE)
241 index = ocfs2_search_cache_array(&oi->ip_metadata_cache, 245 index = ocfs2_search_cache_array(ci, bh->b_blocknr);
242 bh->b_blocknr);
243 else 246 else
244 item = ocfs2_search_cache_tree(&oi->ip_metadata_cache, 247 item = ocfs2_search_cache_tree(ci, bh->b_blocknr);
245 bh->b_blocknr);
246 248
247 ocfs2_metadata_cache_unlock(ci); 249 ocfs2_metadata_cache_unlock(ci);
248 250
@@ -256,7 +258,7 @@ static int ocfs2_buffer_cached(struct ocfs2_inode_info *oi,
256 * 258 *
257 * This can be called under lock_buffer() 259 * This can be called under lock_buffer()
258 */ 260 */
259int ocfs2_buffer_uptodate(struct inode *inode, 261int ocfs2_buffer_uptodate(struct ocfs2_caching_info *ci,
260 struct buffer_head *bh) 262 struct buffer_head *bh)
261{ 263{
262 /* Doesn't matter if the bh is in our cache or not -- if it's 264 /* Doesn't matter if the bh is in our cache or not -- if it's
@@ -272,17 +274,17 @@ int ocfs2_buffer_uptodate(struct inode *inode,
272 274
273 /* Ok, locally the buffer is marked as up to date, now search 275 /* Ok, locally the buffer is marked as up to date, now search
274 * our cache to see if we can trust that. */ 276 * our cache to see if we can trust that. */
275 return ocfs2_buffer_cached(OCFS2_I(inode), bh); 277 return ocfs2_buffer_cached(ci, bh);
276} 278}
277 279
278/* 280/*
279 * Determine whether a buffer is currently out on a read-ahead request. 281 * Determine whether a buffer is currently out on a read-ahead request.
280 * ci_io_sem should be held to serialize submitters with the logic here. 282 * ci_io_sem should be held to serialize submitters with the logic here.
281 */ 283 */
282int ocfs2_buffer_read_ahead(struct inode *inode, 284int ocfs2_buffer_read_ahead(struct ocfs2_caching_info *ci,
283 struct buffer_head *bh) 285 struct buffer_head *bh)
284{ 286{
285 return buffer_locked(bh) && ocfs2_buffer_cached(OCFS2_I(inode), bh); 287 return buffer_locked(bh) && ocfs2_buffer_cached(ci, bh);
286} 288}
287 289
288/* Requires ip_lock */ 290/* Requires ip_lock */
@@ -335,8 +337,7 @@ static void __ocfs2_insert_cache_tree(struct ocfs2_caching_info *ci,
335} 337}
336 338
337/* co_cache_lock() must be held */ 339/* co_cache_lock() must be held */
338static inline int ocfs2_insert_can_use_array(struct ocfs2_inode_info *oi, 340static inline int ocfs2_insert_can_use_array(struct ocfs2_caching_info *ci)
339 struct ocfs2_caching_info *ci)
340{ 341{
341 return (ci->ci_flags & OCFS2_CACHE_FL_INLINE) && 342 return (ci->ci_flags & OCFS2_CACHE_FL_INLINE) &&
342 (ci->ci_num_cached < OCFS2_CACHE_INFO_MAX_ARRAY); 343 (ci->ci_num_cached < OCFS2_CACHE_INFO_MAX_ARRAY);
@@ -347,11 +348,10 @@ static inline int ocfs2_insert_can_use_array(struct ocfs2_inode_info *oi,
347 * when to free in case of error. 348 * when to free in case of error.
348 * 349 *
349 * The co_cache_lock() must be held. */ 350 * The co_cache_lock() must be held. */
350static void ocfs2_expand_cache(struct ocfs2_inode_info *oi, 351static void ocfs2_expand_cache(struct ocfs2_caching_info *ci,
351 struct ocfs2_meta_cache_item **tree) 352 struct ocfs2_meta_cache_item **tree)
352{ 353{
353 int i; 354 int i;
354 struct ocfs2_caching_info *ci = &oi->ip_metadata_cache;
355 355
356 mlog_bug_on_msg(ci->ci_num_cached != OCFS2_CACHE_INFO_MAX_ARRAY, 356 mlog_bug_on_msg(ci->ci_num_cached != OCFS2_CACHE_INFO_MAX_ARRAY,
357 "Owner %llu, num cached = %u, should be %u\n", 357 "Owner %llu, num cached = %u, should be %u\n",
@@ -383,12 +383,11 @@ static void ocfs2_expand_cache(struct ocfs2_inode_info *oi,
383 383
384/* Slow path function - memory allocation is necessary. See the 384/* Slow path function - memory allocation is necessary. See the
385 * comment above ocfs2_set_buffer_uptodate for more information. */ 385 * comment above ocfs2_set_buffer_uptodate for more information. */
386static void __ocfs2_set_buffer_uptodate(struct ocfs2_inode_info *oi, 386static void __ocfs2_set_buffer_uptodate(struct ocfs2_caching_info *ci,
387 sector_t block, 387 sector_t block,
388 int expand_tree) 388 int expand_tree)
389{ 389{
390 int i; 390 int i;
391 struct ocfs2_caching_info *ci = &oi->ip_metadata_cache;
392 struct ocfs2_meta_cache_item *new = NULL; 391 struct ocfs2_meta_cache_item *new = NULL;
393 struct ocfs2_meta_cache_item *tree[OCFS2_CACHE_INFO_MAX_ARRAY] = 392 struct ocfs2_meta_cache_item *tree[OCFS2_CACHE_INFO_MAX_ARRAY] =
394 { NULL, }; 393 { NULL, };
@@ -420,7 +419,7 @@ static void __ocfs2_set_buffer_uptodate(struct ocfs2_inode_info *oi,
420 } 419 }
421 420
422 ocfs2_metadata_cache_lock(ci); 421 ocfs2_metadata_cache_lock(ci);
423 if (ocfs2_insert_can_use_array(oi, ci)) { 422 if (ocfs2_insert_can_use_array(ci)) {
424 mlog(0, "Someone cleared the tree underneath us\n"); 423 mlog(0, "Someone cleared the tree underneath us\n");
425 /* Ok, items were removed from the cache in between 424 /* Ok, items were removed from the cache in between
426 * locks. Detect this and revert back to the fast path */ 425 * locks. Detect this and revert back to the fast path */
@@ -430,7 +429,7 @@ static void __ocfs2_set_buffer_uptodate(struct ocfs2_inode_info *oi,
430 } 429 }
431 430
432 if (expand_tree) 431 if (expand_tree)
433 ocfs2_expand_cache(oi, tree); 432 ocfs2_expand_cache(ci, tree);
434 433
435 __ocfs2_insert_cache_tree(ci, new); 434 __ocfs2_insert_cache_tree(ci, new);
436 ocfs2_metadata_cache_unlock(ci); 435 ocfs2_metadata_cache_unlock(ci);
@@ -468,16 +467,14 @@ out_free:
468 * Readahead buffers can be passed in here before the I/O request is 467 * Readahead buffers can be passed in here before the I/O request is
469 * completed. 468 * completed.
470 */ 469 */
471void ocfs2_set_buffer_uptodate(struct inode *inode, 470void ocfs2_set_buffer_uptodate(struct ocfs2_caching_info *ci,
472 struct buffer_head *bh) 471 struct buffer_head *bh)
473{ 472{
474 int expand; 473 int expand;
475 struct ocfs2_inode_info *oi = OCFS2_I(inode);
476 struct ocfs2_caching_info *ci = &oi->ip_metadata_cache;
477 474
478 /* The block may very well exist in our cache already, so avoid 475 /* The block may very well exist in our cache already, so avoid
479 * doing any more work in that case. */ 476 * doing any more work in that case. */
480 if (ocfs2_buffer_cached(oi, bh)) 477 if (ocfs2_buffer_cached(ci, bh))
481 return; 478 return;
482 479
483 mlog(0, "Owner %llu, inserting block %llu\n", 480 mlog(0, "Owner %llu, inserting block %llu\n",
@@ -487,7 +484,7 @@ void ocfs2_set_buffer_uptodate(struct inode *inode,
487 /* No need to recheck under spinlock - insertion is guarded by 484 /* No need to recheck under spinlock - insertion is guarded by
488 * co_io_lock() */ 485 * co_io_lock() */
489 ocfs2_metadata_cache_lock(ci); 486 ocfs2_metadata_cache_lock(ci);
490 if (ocfs2_insert_can_use_array(oi, ci)) { 487 if (ocfs2_insert_can_use_array(ci)) {
491 /* Fast case - it's an array and there's a free 488 /* Fast case - it's an array and there's a free
492 * spot. */ 489 * spot. */
493 ocfs2_append_cache_array(ci, bh->b_blocknr); 490 ocfs2_append_cache_array(ci, bh->b_blocknr);
@@ -502,25 +499,22 @@ void ocfs2_set_buffer_uptodate(struct inode *inode,
502 } 499 }
503 ocfs2_metadata_cache_unlock(ci); 500 ocfs2_metadata_cache_unlock(ci);
504 501
505 __ocfs2_set_buffer_uptodate(oi, bh->b_blocknr, expand); 502 __ocfs2_set_buffer_uptodate(ci, bh->b_blocknr, expand);
506} 503}
507 504
508/* Called against a newly allocated buffer. Most likely nobody should 505/* Called against a newly allocated buffer. Most likely nobody should
509 * be able to read this sort of metadata while it's still being 506 * be able to read this sort of metadata while it's still being
510 * allocated, but this is careful to take co_io_lock() anyway. */ 507 * allocated, but this is careful to take co_io_lock() anyway. */
511void ocfs2_set_new_buffer_uptodate(struct inode *inode, 508void ocfs2_set_new_buffer_uptodate(struct ocfs2_caching_info *ci,
512 struct buffer_head *bh) 509 struct buffer_head *bh)
513{ 510{
514 struct ocfs2_inode_info *oi = OCFS2_I(inode);
515 struct ocfs2_caching_info *ci = &oi->ip_metadata_cache;
516
517 /* This should definitely *not* exist in our cache */ 511 /* This should definitely *not* exist in our cache */
518 BUG_ON(ocfs2_buffer_cached(oi, bh)); 512 BUG_ON(ocfs2_buffer_cached(ci, bh));
519 513
520 set_buffer_uptodate(bh); 514 set_buffer_uptodate(bh);
521 515
522 ocfs2_metadata_cache_io_lock(ci); 516 ocfs2_metadata_cache_io_lock(ci);
523 ocfs2_set_buffer_uptodate(inode, bh); 517 ocfs2_set_buffer_uptodate(ci, bh);
524 ocfs2_metadata_cache_io_unlock(ci); 518 ocfs2_metadata_cache_io_unlock(ci);
525} 519}
526 520
@@ -559,13 +553,11 @@ static void ocfs2_remove_metadata_tree(struct ocfs2_caching_info *ci,
559 ci->ci_num_cached--; 553 ci->ci_num_cached--;
560} 554}
561 555
562static void ocfs2_remove_block_from_cache(struct inode *inode, 556static void ocfs2_remove_block_from_cache(struct ocfs2_caching_info *ci,
563 sector_t block) 557 sector_t block)
564{ 558{
565 int index; 559 int index;
566 struct ocfs2_meta_cache_item *item = NULL; 560 struct ocfs2_meta_cache_item *item = NULL;
567 struct ocfs2_inode_info *oi = OCFS2_I(inode);
568 struct ocfs2_caching_info *ci = &oi->ip_metadata_cache;
569 561
570 ocfs2_metadata_cache_lock(ci); 562 ocfs2_metadata_cache_lock(ci);
571 mlog(0, "Owner %llu, remove %llu, items = %u, array = %u\n", 563 mlog(0, "Owner %llu, remove %llu, items = %u, array = %u\n",
@@ -593,23 +585,24 @@ static void ocfs2_remove_block_from_cache(struct inode *inode,
593 * bother reverting things to an inlined array in the case of a remove 585 * bother reverting things to an inlined array in the case of a remove
594 * which moves us back under the limit. 586 * which moves us back under the limit.
595 */ 587 */
596void ocfs2_remove_from_cache(struct inode *inode, 588void ocfs2_remove_from_cache(struct ocfs2_caching_info *ci,
597 struct buffer_head *bh) 589 struct buffer_head *bh)
598{ 590{
599 sector_t block = bh->b_blocknr; 591 sector_t block = bh->b_blocknr;
600 592
601 ocfs2_remove_block_from_cache(inode, block); 593 ocfs2_remove_block_from_cache(ci, block);
602} 594}
603 595
604/* Called when we remove xattr clusters from an inode. */ 596/* Called when we remove xattr clusters from an inode. */
605void ocfs2_remove_xattr_clusters_from_cache(struct inode *inode, 597void ocfs2_remove_xattr_clusters_from_cache(struct ocfs2_caching_info *ci,
606 sector_t block, 598 sector_t block,
607 u32 c_len) 599 u32 c_len)
608{ 600{
609 unsigned int i, b_len = ocfs2_clusters_to_blocks(inode->i_sb, 1) * c_len; 601 struct super_block *sb = ocfs2_metadata_cache_get_super(ci);
602 unsigned int i, b_len = ocfs2_clusters_to_blocks(sb, 1) * c_len;
610 603
611 for (i = 0; i < b_len; i++, block++) 604 for (i = 0; i < b_len; i++, block++)
612 ocfs2_remove_block_from_cache(inode, block); 605 ocfs2_remove_block_from_cache(ci, block);
613} 606}
614 607
615int __init init_ocfs2_uptodate_cache(void) 608int __init init_ocfs2_uptodate_cache(void)
diff --git a/fs/ocfs2/uptodate.h b/fs/ocfs2/uptodate.h
index 3b33eb88d320..f268273d6516 100644
--- a/fs/ocfs2/uptodate.h
+++ b/fs/ocfs2/uptodate.h
@@ -38,6 +38,8 @@ struct ocfs2_caching_operations {
38 */ 38 */
39 u64 (*co_owner)(struct ocfs2_caching_info *ci); 39 u64 (*co_owner)(struct ocfs2_caching_info *ci);
40 40
41 /* The superblock is needed during I/O. */
42 struct super_block *(*co_get_super)(struct ocfs2_caching_info *ci);
41 /* 43 /*
42 * Lock and unlock the caching data. These will not sleep, and 44 * Lock and unlock the caching data. These will not sleep, and
43 * should probably be spinlocks. 45 * should probably be spinlocks.
@@ -58,20 +60,25 @@ void exit_ocfs2_uptodate_cache(void);
58 60
59void ocfs2_metadata_cache_init(struct ocfs2_caching_info *ci, 61void ocfs2_metadata_cache_init(struct ocfs2_caching_info *ci,
60 const struct ocfs2_caching_operations *ops); 62 const struct ocfs2_caching_operations *ops);
61void ocfs2_metadata_cache_purge(struct inode *inode); 63void ocfs2_metadata_cache_purge(struct ocfs2_caching_info *ci);
62 64
63int ocfs2_buffer_uptodate(struct inode *inode, 65u64 ocfs2_metadata_cache_owner(struct ocfs2_caching_info *ci);
66struct super_block *ocfs2_metadata_cache_get_super(struct ocfs2_caching_info *ci);
67void ocfs2_metadata_cache_io_lock(struct ocfs2_caching_info *ci);
68void ocfs2_metadata_cache_io_unlock(struct ocfs2_caching_info *ci);
69
70int ocfs2_buffer_uptodate(struct ocfs2_caching_info *ci,
64 struct buffer_head *bh); 71 struct buffer_head *bh);
65void ocfs2_set_buffer_uptodate(struct inode *inode, 72void ocfs2_set_buffer_uptodate(struct ocfs2_caching_info *ci,
66 struct buffer_head *bh); 73 struct buffer_head *bh);
67void ocfs2_set_new_buffer_uptodate(struct inode *inode, 74void ocfs2_set_new_buffer_uptodate(struct ocfs2_caching_info *ci,
68 struct buffer_head *bh); 75 struct buffer_head *bh);
69void ocfs2_remove_from_cache(struct inode *inode, 76void ocfs2_remove_from_cache(struct ocfs2_caching_info *ci,
70 struct buffer_head *bh); 77 struct buffer_head *bh);
71void ocfs2_remove_xattr_clusters_from_cache(struct inode *inode, 78void ocfs2_remove_xattr_clusters_from_cache(struct ocfs2_caching_info *ci,
72 sector_t block, 79 sector_t block,
73 u32 c_len); 80 u32 c_len);
74int ocfs2_buffer_read_ahead(struct inode *inode, 81int ocfs2_buffer_read_ahead(struct ocfs2_caching_info *ci,
75 struct buffer_head *bh); 82 struct buffer_head *bh);
76 83
77#endif /* OCFS2_UPTODATE_H */ 84#endif /* OCFS2_UPTODATE_H */
diff --git a/fs/ocfs2/xattr.c b/fs/ocfs2/xattr.c
index d1a27cda984f..19de5c487242 100644
--- a/fs/ocfs2/xattr.c
+++ b/fs/ocfs2/xattr.c
@@ -254,9 +254,9 @@ static int ocfs2_init_xattr_bucket(struct ocfs2_xattr_bucket *bucket,
254 break; 254 break;
255 } 255 }
256 256
257 if (!ocfs2_buffer_uptodate(bucket->bu_inode, 257 if (!ocfs2_buffer_uptodate(INODE_CACHE(bucket->bu_inode),
258 bucket->bu_bhs[i])) 258 bucket->bu_bhs[i]))
259 ocfs2_set_new_buffer_uptodate(bucket->bu_inode, 259 ocfs2_set_new_buffer_uptodate(INODE_CACHE(bucket->bu_inode),
260 bucket->bu_bhs[i]); 260 bucket->bu_bhs[i]);
261 } 261 }
262 262
@@ -271,7 +271,7 @@ static int ocfs2_read_xattr_bucket(struct ocfs2_xattr_bucket *bucket,
271{ 271{
272 int rc; 272 int rc;
273 273
274 rc = ocfs2_read_blocks(bucket->bu_inode, xb_blkno, 274 rc = ocfs2_read_blocks(INODE_CACHE(bucket->bu_inode), xb_blkno,
275 bucket->bu_blocks, bucket->bu_bhs, 0, 275 bucket->bu_blocks, bucket->bu_bhs, 0,
276 NULL); 276 NULL);
277 if (!rc) { 277 if (!rc) {
@@ -399,7 +399,7 @@ static int ocfs2_read_xattr_block(struct inode *inode, u64 xb_blkno,
399 int rc; 399 int rc;
400 struct buffer_head *tmp = *bh; 400 struct buffer_head *tmp = *bh;
401 401
402 rc = ocfs2_read_block(inode, xb_blkno, &tmp, 402 rc = ocfs2_read_block(INODE_CACHE(inode), xb_blkno, &tmp,
403 ocfs2_validate_xattr_block); 403 ocfs2_validate_xattr_block);
404 404
405 /* If ocfs2_read_block() got us a new bh, pass it up. */ 405 /* If ocfs2_read_block() got us a new bh, pass it up. */
@@ -724,8 +724,8 @@ static int ocfs2_xattr_shrink_size(struct inode *inode,
724 } 724 }
725 725
726 block = ocfs2_clusters_to_blocks(inode->i_sb, phys_cpos); 726 block = ocfs2_clusters_to_blocks(inode->i_sb, phys_cpos);
727 ocfs2_remove_xattr_clusters_from_cache(inode, block, 727 ocfs2_remove_xattr_clusters_from_cache(INODE_CACHE(inode),
728 alloc_size); 728 block, alloc_size);
729 cpos += alloc_size; 729 cpos += alloc_size;
730 trunc_len -= alloc_size; 730 trunc_len -= alloc_size;
731 } 731 }
@@ -970,7 +970,8 @@ static int ocfs2_xattr_get_value_outside(struct inode *inode,
970 blkno = ocfs2_clusters_to_blocks(inode->i_sb, p_cluster); 970 blkno = ocfs2_clusters_to_blocks(inode->i_sb, p_cluster);
971 /* Copy ocfs2_xattr_value */ 971 /* Copy ocfs2_xattr_value */
972 for (i = 0; i < num_clusters * bpc; i++, blkno++) { 972 for (i = 0; i < num_clusters * bpc; i++, blkno++) {
973 ret = ocfs2_read_block(inode, blkno, &bh, NULL); 973 ret = ocfs2_read_block(INODE_CACHE(inode), blkno,
974 &bh, NULL);
974 if (ret) { 975 if (ret) {
975 mlog_errno(ret); 976 mlog_errno(ret);
976 goto out; 977 goto out;
@@ -1208,7 +1209,8 @@ static int __ocfs2_xattr_set_value_outside(struct inode *inode,
1208 blkno = ocfs2_clusters_to_blocks(inode->i_sb, p_cluster); 1209 blkno = ocfs2_clusters_to_blocks(inode->i_sb, p_cluster);
1209 1210
1210 for (i = 0; i < num_clusters * bpc; i++, blkno++) { 1211 for (i = 0; i < num_clusters * bpc; i++, blkno++) {
1211 ret = ocfs2_read_block(inode, blkno, &bh, NULL); 1212 ret = ocfs2_read_block(INODE_CACHE(inode), blkno,
1213 &bh, NULL);
1212 if (ret) { 1214 if (ret) {
1213 mlog_errno(ret); 1215 mlog_errno(ret);
1214 goto out; 1216 goto out;
@@ -2121,7 +2123,7 @@ static int ocfs2_xattr_block_set(struct inode *inode,
2121 } 2123 }
2122 2124
2123 new_bh = sb_getblk(inode->i_sb, first_blkno); 2125 new_bh = sb_getblk(inode->i_sb, first_blkno);
2124 ocfs2_set_new_buffer_uptodate(inode, new_bh); 2126 ocfs2_set_new_buffer_uptodate(INODE_CACHE(inode), new_bh);
2125 2127
2126 ret = ocfs2_journal_access_xb(handle, inode, new_bh, 2128 ret = ocfs2_journal_access_xb(handle, inode, new_bh,
2127 OCFS2_JOURNAL_ACCESS_CREATE); 2129 OCFS2_JOURNAL_ACCESS_CREATE);
@@ -4845,7 +4847,8 @@ static int ocfs2_rm_xattr_cluster(struct inode *inode,
4845 mlog(0, "rm xattr extent rec at %u len = %u, start from %llu\n", 4847 mlog(0, "rm xattr extent rec at %u len = %u, start from %llu\n",
4846 cpos, len, (unsigned long long)blkno); 4848 cpos, len, (unsigned long long)blkno);
4847 4849
4848 ocfs2_remove_xattr_clusters_from_cache(inode, blkno, len); 4850 ocfs2_remove_xattr_clusters_from_cache(INODE_CACHE(inode), blkno,
4851 len);
4849 4852
4850 ret = ocfs2_lock_allocators(inode, &et, 0, 1, NULL, &meta_ac); 4853 ret = ocfs2_lock_allocators(inode, &et, 0, 1, NULL, &meta_ac);
4851 if (ret) { 4854 if (ret) {