aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/ctree.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/ctree.c')
-rw-r--r--fs/btrfs/ctree.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c
index 566d99b51bef..2bc34408872d 100644
--- a/fs/btrfs/ctree.c
+++ b/fs/btrfs/ctree.c
@@ -1281,7 +1281,8 @@ get_old_root(struct btrfs_root *root, u64 time_seq)
1281 free_extent_buffer(eb_root); 1281 free_extent_buffer(eb_root);
1282 blocksize = btrfs_level_size(root, old_root->level); 1282 blocksize = btrfs_level_size(root, old_root->level);
1283 old = read_tree_block(root, logical, blocksize, 0); 1283 old = read_tree_block(root, logical, blocksize, 0);
1284 if (!old) { 1284 if (!old || !extent_buffer_uptodate(old)) {
1285 free_extent_buffer(old);
1285 pr_warn("btrfs: failed to read tree block %llu from get_old_root\n", 1286 pr_warn("btrfs: failed to read tree block %llu from get_old_root\n",
1286 logical); 1287 logical);
1287 WARN_ON(1); 1288 WARN_ON(1);
@@ -1526,8 +1527,10 @@ int btrfs_realloc_node(struct btrfs_trans_handle *trans,
1526 if (!cur) { 1527 if (!cur) {
1527 cur = read_tree_block(root, blocknr, 1528 cur = read_tree_block(root, blocknr,
1528 blocksize, gen); 1529 blocksize, gen);
1529 if (!cur) 1530 if (!cur || !extent_buffer_uptodate(cur)) {
1531 free_extent_buffer(cur);
1530 return -EIO; 1532 return -EIO;
1533 }
1531 } else if (!uptodate) { 1534 } else if (!uptodate) {
1532 err = btrfs_read_buffer(cur, gen); 1535 err = btrfs_read_buffer(cur, gen);
1533 if (err) { 1536 if (err) {
@@ -1692,6 +1695,8 @@ static noinline struct extent_buffer *read_node_slot(struct btrfs_root *root,
1692 struct extent_buffer *parent, int slot) 1695 struct extent_buffer *parent, int slot)
1693{ 1696{
1694 int level = btrfs_header_level(parent); 1697 int level = btrfs_header_level(parent);
1698 struct extent_buffer *eb;
1699
1695 if (slot < 0) 1700 if (slot < 0)
1696 return NULL; 1701 return NULL;
1697 if (slot >= btrfs_header_nritems(parent)) 1702 if (slot >= btrfs_header_nritems(parent))
@@ -1699,9 +1704,15 @@ static noinline struct extent_buffer *read_node_slot(struct btrfs_root *root,
1699 1704
1700 BUG_ON(level == 0); 1705 BUG_ON(level == 0);
1701 1706
1702 return read_tree_block(root, btrfs_node_blockptr(parent, slot), 1707 eb = read_tree_block(root, btrfs_node_blockptr(parent, slot),
1703 btrfs_level_size(root, level - 1), 1708 btrfs_level_size(root, level - 1),
1704 btrfs_node_ptr_generation(parent, slot)); 1709 btrfs_node_ptr_generation(parent, slot));
1710 if (eb && !extent_buffer_uptodate(eb)) {
1711 free_extent_buffer(eb);
1712 eb = NULL;
1713 }
1714
1715 return eb;
1705} 1716}
1706 1717
1707/* 1718/*