.. | .. |
---|
58 | 58 | static int nilfs_btree_get_new_block(const struct nilfs_bmap *btree, |
---|
59 | 59 | __u64 ptr, struct buffer_head **bhp) |
---|
60 | 60 | { |
---|
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; |
---|
62 | 63 | struct buffer_head *bh; |
---|
63 | 64 | |
---|
64 | 65 | bh = nilfs_btnode_create_block(btnc, ptr); |
---|
.. | .. |
---|
351 | 352 | (flags & NILFS_BTREE_NODE_ROOT) || |
---|
352 | 353 | nchildren < 0 || |
---|
353 | 354 | 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); |
---|
358 | 359 | ret = 1; |
---|
359 | 360 | } |
---|
360 | 361 | return ret; |
---|
.. | .. |
---|
381 | 382 | level >= NILFS_BTREE_LEVEL_MAX || |
---|
382 | 383 | nchildren < 0 || |
---|
383 | 384 | 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); |
---|
387 | 388 | ret = 1; |
---|
388 | 389 | } |
---|
389 | 390 | return ret; |
---|
.. | .. |
---|
450 | 451 | { |
---|
451 | 452 | if (unlikely(nilfs_btree_node_get_level(node) != level)) { |
---|
452 | 453 | 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); |
---|
457 | 458 | return 1; |
---|
458 | 459 | } |
---|
459 | 460 | return 0; |
---|
.. | .. |
---|
470 | 471 | struct buffer_head **bhp, |
---|
471 | 472 | const struct nilfs_btree_readahead_info *ra) |
---|
472 | 473 | { |
---|
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; |
---|
474 | 476 | struct buffer_head *bh, *ra_bh; |
---|
475 | 477 | sector_t submit_ptr = 0; |
---|
476 | 478 | int ret; |
---|
.. | .. |
---|
478 | 480 | ret = nilfs_btnode_submit_block(btnc, ptr, 0, REQ_OP_READ, 0, &bh, |
---|
479 | 481 | &submit_ptr); |
---|
480 | 482 | 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; |
---|
484 | 495 | } |
---|
485 | 496 | |
---|
486 | 497 | if (ra) { |
---|
.. | .. |
---|
508 | 519 | |
---|
509 | 520 | out_no_wait: |
---|
510 | 521 | if (!buffer_uptodate(bh)) { |
---|
511 | | - nilfs_msg(btree->b_inode->i_sb, KERN_ERR, |
---|
| 522 | + nilfs_err(btree->b_inode->i_sb, |
---|
512 | 523 | "I/O error reading b-tree node block (ino=%lu, blocknr=%llu)", |
---|
513 | 524 | btree->b_inode->i_ino, (unsigned long long)ptr); |
---|
514 | 525 | brelse(bh); |
---|
.. | .. |
---|
1742 | 1753 | dat = nilfs_bmap_get_dat(btree); |
---|
1743 | 1754 | } |
---|
1744 | 1755 | |
---|
| 1756 | + ret = nilfs_attach_btree_node_cache(&NILFS_BMAP_I(btree)->vfs_inode); |
---|
| 1757 | + if (ret < 0) |
---|
| 1758 | + return ret; |
---|
| 1759 | + |
---|
1745 | 1760 | ret = nilfs_bmap_prepare_alloc_ptr(btree, dreq, dat); |
---|
1746 | 1761 | if (ret < 0) |
---|
1747 | 1762 | return ret; |
---|
.. | .. |
---|
1914 | 1929 | path[level].bp_ctxt.newkey = path[level].bp_newreq.bpr_ptr; |
---|
1915 | 1930 | path[level].bp_ctxt.bh = path[level].bp_bh; |
---|
1916 | 1931 | ret = nilfs_btnode_prepare_change_key( |
---|
1917 | | - &NILFS_BMAP_I(btree)->i_btnode_cache, |
---|
| 1932 | + NILFS_BMAP_I(btree)->i_assoc_inode->i_mapping, |
---|
1918 | 1933 | &path[level].bp_ctxt); |
---|
1919 | 1934 | if (ret < 0) { |
---|
1920 | 1935 | nilfs_dat_abort_update(dat, |
---|
.. | .. |
---|
1940 | 1955 | |
---|
1941 | 1956 | if (buffer_nilfs_node(path[level].bp_bh)) { |
---|
1942 | 1957 | nilfs_btnode_commit_change_key( |
---|
1943 | | - &NILFS_BMAP_I(btree)->i_btnode_cache, |
---|
| 1958 | + NILFS_BMAP_I(btree)->i_assoc_inode->i_mapping, |
---|
1944 | 1959 | &path[level].bp_ctxt); |
---|
1945 | 1960 | path[level].bp_bh = path[level].bp_ctxt.bh; |
---|
1946 | 1961 | } |
---|
.. | .. |
---|
1959 | 1974 | &path[level].bp_newreq.bpr_req); |
---|
1960 | 1975 | if (buffer_nilfs_node(path[level].bp_bh)) |
---|
1961 | 1976 | nilfs_btnode_abort_change_key( |
---|
1962 | | - &NILFS_BMAP_I(btree)->i_btnode_cache, |
---|
| 1977 | + NILFS_BMAP_I(btree)->i_assoc_inode->i_mapping, |
---|
1963 | 1978 | &path[level].bp_ctxt); |
---|
1964 | 1979 | } |
---|
1965 | 1980 | |
---|
.. | .. |
---|
2074 | 2089 | ret = nilfs_btree_do_lookup(btree, path, key, NULL, level + 1, 0); |
---|
2075 | 2090 | if (ret < 0) { |
---|
2076 | 2091 | 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); |
---|
2081 | 2096 | goto out; |
---|
2082 | 2097 | } |
---|
2083 | 2098 | |
---|
.. | .. |
---|
2114 | 2129 | if (level < NILFS_BTREE_LEVEL_NODE_MIN || |
---|
2115 | 2130 | level >= NILFS_BTREE_LEVEL_MAX) { |
---|
2116 | 2131 | 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); |
---|
2122 | 2137 | return; |
---|
2123 | 2138 | } |
---|
2124 | 2139 | |
---|
.. | .. |
---|
2135 | 2150 | static void nilfs_btree_lookup_dirty_buffers(struct nilfs_bmap *btree, |
---|
2136 | 2151 | struct list_head *listp) |
---|
2137 | 2152 | { |
---|
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; |
---|
2139 | 2155 | struct list_head lists[NILFS_BTREE_LEVEL_MAX]; |
---|
2140 | 2156 | struct pagevec pvec; |
---|
2141 | 2157 | struct buffer_head *bh, *head; |
---|
.. | .. |
---|
2189 | 2205 | path[level].bp_ctxt.newkey = blocknr; |
---|
2190 | 2206 | path[level].bp_ctxt.bh = *bh; |
---|
2191 | 2207 | ret = nilfs_btnode_prepare_change_key( |
---|
2192 | | - &NILFS_BMAP_I(btree)->i_btnode_cache, |
---|
| 2208 | + NILFS_BMAP_I(btree)->i_assoc_inode->i_mapping, |
---|
2193 | 2209 | &path[level].bp_ctxt); |
---|
2194 | 2210 | if (ret < 0) |
---|
2195 | 2211 | return ret; |
---|
2196 | 2212 | nilfs_btnode_commit_change_key( |
---|
2197 | | - &NILFS_BMAP_I(btree)->i_btnode_cache, |
---|
| 2213 | + NILFS_BMAP_I(btree)->i_assoc_inode->i_mapping, |
---|
2198 | 2214 | &path[level].bp_ctxt); |
---|
2199 | 2215 | *bh = path[level].bp_ctxt.bh; |
---|
2200 | 2216 | } |
---|
.. | .. |
---|
2399 | 2415 | |
---|
2400 | 2416 | if (nilfs_btree_root_broken(nilfs_btree_get_root(bmap), bmap->b_inode)) |
---|
2401 | 2417 | ret = -EIO; |
---|
| 2418 | + else |
---|
| 2419 | + ret = nilfs_attach_btree_node_cache( |
---|
| 2420 | + &NILFS_BMAP_I(bmap)->vfs_inode); |
---|
| 2421 | + |
---|
2402 | 2422 | return ret; |
---|
2403 | 2423 | } |
---|
2404 | 2424 | |
---|