forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-10-12 a5969cabbb4660eab42b6ef0412cbbd1200cf14d
kernel/fs/nilfs2/btree.c
....@@ -58,7 +58,8 @@
5858 static int nilfs_btree_get_new_block(const struct nilfs_bmap *btree,
5959 __u64 ptr, struct buffer_head **bhp)
6060 {
61
- struct address_space *btnc = &NILFS_BMAP_I(btree)->i_btnode_cache;
61
+ struct inode *btnc_inode = NILFS_BMAP_I(btree)->i_assoc_inode;
62
+ struct address_space *btnc = btnc_inode->i_mapping;
6263 struct buffer_head *bh;
6364
6465 bh = nilfs_btnode_create_block(btnc, ptr);
....@@ -351,10 +352,10 @@
351352 (flags & NILFS_BTREE_NODE_ROOT) ||
352353 nchildren < 0 ||
353354 nchildren > NILFS_BTREE_NODE_NCHILDREN_MAX(size))) {
354
- nilfs_msg(inode->i_sb, KERN_CRIT,
355
- "bad btree node (ino=%lu, blocknr=%llu): level = %d, flags = 0x%x, nchildren = %d",
356
- inode->i_ino, (unsigned long long)blocknr, level,
357
- flags, nchildren);
355
+ nilfs_crit(inode->i_sb,
356
+ "bad btree node (ino=%lu, blocknr=%llu): level = %d, flags = 0x%x, nchildren = %d",
357
+ inode->i_ino, (unsigned long long)blocknr, level,
358
+ flags, nchildren);
358359 ret = 1;
359360 }
360361 return ret;
....@@ -381,9 +382,9 @@
381382 level >= NILFS_BTREE_LEVEL_MAX ||
382383 nchildren < 0 ||
383384 nchildren > NILFS_BTREE_ROOT_NCHILDREN_MAX)) {
384
- nilfs_msg(inode->i_sb, KERN_CRIT,
385
- "bad btree root (ino=%lu): level = %d, flags = 0x%x, nchildren = %d",
386
- inode->i_ino, level, flags, nchildren);
385
+ nilfs_crit(inode->i_sb,
386
+ "bad btree root (ino=%lu): level = %d, flags = 0x%x, nchildren = %d",
387
+ inode->i_ino, level, flags, nchildren);
387388 ret = 1;
388389 }
389390 return ret;
....@@ -450,10 +451,10 @@
450451 {
451452 if (unlikely(nilfs_btree_node_get_level(node) != level)) {
452453 dump_stack();
453
- nilfs_msg(btree->b_inode->i_sb, KERN_CRIT,
454
- "btree level mismatch (ino=%lu): %d != %d",
455
- btree->b_inode->i_ino,
456
- nilfs_btree_node_get_level(node), level);
454
+ nilfs_crit(btree->b_inode->i_sb,
455
+ "btree level mismatch (ino=%lu): %d != %d",
456
+ btree->b_inode->i_ino,
457
+ nilfs_btree_node_get_level(node), level);
457458 return 1;
458459 }
459460 return 0;
....@@ -470,7 +471,8 @@
470471 struct buffer_head **bhp,
471472 const struct nilfs_btree_readahead_info *ra)
472473 {
473
- struct address_space *btnc = &NILFS_BMAP_I(btree)->i_btnode_cache;
474
+ struct inode *btnc_inode = NILFS_BMAP_I(btree)->i_assoc_inode;
475
+ struct address_space *btnc = btnc_inode->i_mapping;
474476 struct buffer_head *bh, *ra_bh;
475477 sector_t submit_ptr = 0;
476478 int ret;
....@@ -478,9 +480,18 @@
478480 ret = nilfs_btnode_submit_block(btnc, ptr, 0, REQ_OP_READ, 0, &bh,
479481 &submit_ptr);
480482 if (ret) {
481
- if (ret != -EEXIST)
482
- return ret;
483
- goto out_check;
483
+ if (likely(ret == -EEXIST))
484
+ goto out_check;
485
+ if (ret == -ENOENT) {
486
+ /*
487
+ * Block address translation failed due to invalid
488
+ * value of 'ptr'. In this case, return internal code
489
+ * -EINVAL (broken bmap) to notify bmap layer of fatal
490
+ * metadata corruption.
491
+ */
492
+ ret = -EINVAL;
493
+ }
494
+ return ret;
484495 }
485496
486497 if (ra) {
....@@ -508,7 +519,7 @@
508519
509520 out_no_wait:
510521 if (!buffer_uptodate(bh)) {
511
- nilfs_msg(btree->b_inode->i_sb, KERN_ERR,
522
+ nilfs_err(btree->b_inode->i_sb,
512523 "I/O error reading b-tree node block (ino=%lu, blocknr=%llu)",
513524 btree->b_inode->i_ino, (unsigned long long)ptr);
514525 brelse(bh);
....@@ -1742,6 +1753,10 @@
17421753 dat = nilfs_bmap_get_dat(btree);
17431754 }
17441755
1756
+ ret = nilfs_attach_btree_node_cache(&NILFS_BMAP_I(btree)->vfs_inode);
1757
+ if (ret < 0)
1758
+ return ret;
1759
+
17451760 ret = nilfs_bmap_prepare_alloc_ptr(btree, dreq, dat);
17461761 if (ret < 0)
17471762 return ret;
....@@ -1914,7 +1929,7 @@
19141929 path[level].bp_ctxt.newkey = path[level].bp_newreq.bpr_ptr;
19151930 path[level].bp_ctxt.bh = path[level].bp_bh;
19161931 ret = nilfs_btnode_prepare_change_key(
1917
- &NILFS_BMAP_I(btree)->i_btnode_cache,
1932
+ NILFS_BMAP_I(btree)->i_assoc_inode->i_mapping,
19181933 &path[level].bp_ctxt);
19191934 if (ret < 0) {
19201935 nilfs_dat_abort_update(dat,
....@@ -1940,7 +1955,7 @@
19401955
19411956 if (buffer_nilfs_node(path[level].bp_bh)) {
19421957 nilfs_btnode_commit_change_key(
1943
- &NILFS_BMAP_I(btree)->i_btnode_cache,
1958
+ NILFS_BMAP_I(btree)->i_assoc_inode->i_mapping,
19441959 &path[level].bp_ctxt);
19451960 path[level].bp_bh = path[level].bp_ctxt.bh;
19461961 }
....@@ -1959,7 +1974,7 @@
19591974 &path[level].bp_newreq.bpr_req);
19601975 if (buffer_nilfs_node(path[level].bp_bh))
19611976 nilfs_btnode_abort_change_key(
1962
- &NILFS_BMAP_I(btree)->i_btnode_cache,
1977
+ NILFS_BMAP_I(btree)->i_assoc_inode->i_mapping,
19631978 &path[level].bp_ctxt);
19641979 }
19651980
....@@ -2074,10 +2089,10 @@
20742089 ret = nilfs_btree_do_lookup(btree, path, key, NULL, level + 1, 0);
20752090 if (ret < 0) {
20762091 if (unlikely(ret == -ENOENT))
2077
- nilfs_msg(btree->b_inode->i_sb, KERN_CRIT,
2078
- "writing node/leaf block does not appear in b-tree (ino=%lu) at key=%llu, level=%d",
2079
- btree->b_inode->i_ino,
2080
- (unsigned long long)key, level);
2092
+ nilfs_crit(btree->b_inode->i_sb,
2093
+ "writing node/leaf block does not appear in b-tree (ino=%lu) at key=%llu, level=%d",
2094
+ btree->b_inode->i_ino,
2095
+ (unsigned long long)key, level);
20812096 goto out;
20822097 }
20832098
....@@ -2114,11 +2129,11 @@
21142129 if (level < NILFS_BTREE_LEVEL_NODE_MIN ||
21152130 level >= NILFS_BTREE_LEVEL_MAX) {
21162131 dump_stack();
2117
- nilfs_msg(btree->b_inode->i_sb, KERN_WARNING,
2118
- "invalid btree level: %d (key=%llu, ino=%lu, blocknr=%llu)",
2119
- level, (unsigned long long)key,
2120
- btree->b_inode->i_ino,
2121
- (unsigned long long)bh->b_blocknr);
2132
+ nilfs_warn(btree->b_inode->i_sb,
2133
+ "invalid btree level: %d (key=%llu, ino=%lu, blocknr=%llu)",
2134
+ level, (unsigned long long)key,
2135
+ btree->b_inode->i_ino,
2136
+ (unsigned long long)bh->b_blocknr);
21222137 return;
21232138 }
21242139
....@@ -2135,7 +2150,8 @@
21352150 static void nilfs_btree_lookup_dirty_buffers(struct nilfs_bmap *btree,
21362151 struct list_head *listp)
21372152 {
2138
- struct address_space *btcache = &NILFS_BMAP_I(btree)->i_btnode_cache;
2153
+ struct inode *btnc_inode = NILFS_BMAP_I(btree)->i_assoc_inode;
2154
+ struct address_space *btcache = btnc_inode->i_mapping;
21392155 struct list_head lists[NILFS_BTREE_LEVEL_MAX];
21402156 struct pagevec pvec;
21412157 struct buffer_head *bh, *head;
....@@ -2189,12 +2205,12 @@
21892205 path[level].bp_ctxt.newkey = blocknr;
21902206 path[level].bp_ctxt.bh = *bh;
21912207 ret = nilfs_btnode_prepare_change_key(
2192
- &NILFS_BMAP_I(btree)->i_btnode_cache,
2208
+ NILFS_BMAP_I(btree)->i_assoc_inode->i_mapping,
21932209 &path[level].bp_ctxt);
21942210 if (ret < 0)
21952211 return ret;
21962212 nilfs_btnode_commit_change_key(
2197
- &NILFS_BMAP_I(btree)->i_btnode_cache,
2213
+ NILFS_BMAP_I(btree)->i_assoc_inode->i_mapping,
21982214 &path[level].bp_ctxt);
21992215 *bh = path[level].bp_ctxt.bh;
22002216 }
....@@ -2399,6 +2415,10 @@
23992415
24002416 if (nilfs_btree_root_broken(nilfs_btree_get_root(bmap), bmap->b_inode))
24012417 ret = -EIO;
2418
+ else
2419
+ ret = nilfs_attach_btree_node_cache(
2420
+ &NILFS_BMAP_I(bmap)->vfs_inode);
2421
+
24022422 return ret;
24032423 }
24042424