| .. | .. |
|---|
| 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 | |
|---|