diff options
Diffstat (limited to 'fs/btrfs/disk-io.c')
-rw-r--r-- | fs/btrfs/disk-io.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index d1137d7ea8d4..94b4e50f6b2c 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
@@ -832,6 +832,7 @@ static int find_and_setup_root(struct btrfs_root *tree_root, | |||
832 | { | 832 | { |
833 | int ret; | 833 | int ret; |
834 | u32 blocksize; | 834 | u32 blocksize; |
835 | u64 generation; | ||
835 | 836 | ||
836 | __setup_root(tree_root->nodesize, tree_root->leafsize, | 837 | __setup_root(tree_root->nodesize, tree_root->leafsize, |
837 | tree_root->sectorsize, tree_root->stripesize, | 838 | tree_root->sectorsize, tree_root->stripesize, |
@@ -840,9 +841,10 @@ static int find_and_setup_root(struct btrfs_root *tree_root, | |||
840 | &root->root_item, &root->root_key); | 841 | &root->root_item, &root->root_key); |
841 | BUG_ON(ret); | 842 | BUG_ON(ret); |
842 | 843 | ||
844 | generation = btrfs_root_generation(&root->root_item); | ||
843 | blocksize = btrfs_level_size(root, btrfs_root_level(&root->root_item)); | 845 | blocksize = btrfs_level_size(root, btrfs_root_level(&root->root_item)); |
844 | root->node = read_tree_block(root, btrfs_root_bytenr(&root->root_item), | 846 | root->node = read_tree_block(root, btrfs_root_bytenr(&root->root_item), |
845 | blocksize, 0); | 847 | blocksize, generation); |
846 | BUG_ON(!root->node); | 848 | BUG_ON(!root->node); |
847 | return 0; | 849 | return 0; |
848 | } | 850 | } |
@@ -929,6 +931,7 @@ struct btrfs_root *btrfs_read_fs_root_no_radix(struct btrfs_root *tree_root, | |||
929 | struct btrfs_path *path; | 931 | struct btrfs_path *path; |
930 | struct extent_buffer *l; | 932 | struct extent_buffer *l; |
931 | u64 highest_inode; | 933 | u64 highest_inode; |
934 | u64 generation; | ||
932 | u32 blocksize; | 935 | u32 blocksize; |
933 | int ret = 0; | 936 | int ret = 0; |
934 | 937 | ||
@@ -970,9 +973,10 @@ out: | |||
970 | kfree(root); | 973 | kfree(root); |
971 | return ERR_PTR(ret); | 974 | return ERR_PTR(ret); |
972 | } | 975 | } |
976 | generation = btrfs_root_generation(&root->root_item); | ||
973 | blocksize = btrfs_level_size(root, btrfs_root_level(&root->root_item)); | 977 | blocksize = btrfs_level_size(root, btrfs_root_level(&root->root_item)); |
974 | root->node = read_tree_block(root, btrfs_root_bytenr(&root->root_item), | 978 | root->node = read_tree_block(root, btrfs_root_bytenr(&root->root_item), |
975 | blocksize, 0); | 979 | blocksize, generation); |
976 | BUG_ON(!root->node); | 980 | BUG_ON(!root->node); |
977 | insert: | 981 | insert: |
978 | if (location->objectid != BTRFS_TREE_LOG_OBJECTID) { | 982 | if (location->objectid != BTRFS_TREE_LOG_OBJECTID) { |
@@ -1357,6 +1361,7 @@ struct btrfs_root *open_ctree(struct super_block *sb, | |||
1357 | u32 leafsize; | 1361 | u32 leafsize; |
1358 | u32 blocksize; | 1362 | u32 blocksize; |
1359 | u32 stripesize; | 1363 | u32 stripesize; |
1364 | u64 generation; | ||
1360 | struct buffer_head *bh; | 1365 | struct buffer_head *bh; |
1361 | struct btrfs_root *extent_root = kzalloc(sizeof(struct btrfs_root), | 1366 | struct btrfs_root *extent_root = kzalloc(sizeof(struct btrfs_root), |
1362 | GFP_NOFS); | 1367 | GFP_NOFS); |
@@ -1596,13 +1601,14 @@ struct btrfs_root *open_ctree(struct super_block *sb, | |||
1596 | 1601 | ||
1597 | blocksize = btrfs_level_size(tree_root, | 1602 | blocksize = btrfs_level_size(tree_root, |
1598 | btrfs_super_chunk_root_level(disk_super)); | 1603 | btrfs_super_chunk_root_level(disk_super)); |
1604 | generation = btrfs_super_chunk_root_generation(disk_super); | ||
1599 | 1605 | ||
1600 | __setup_root(nodesize, leafsize, sectorsize, stripesize, | 1606 | __setup_root(nodesize, leafsize, sectorsize, stripesize, |
1601 | chunk_root, fs_info, BTRFS_CHUNK_TREE_OBJECTID); | 1607 | chunk_root, fs_info, BTRFS_CHUNK_TREE_OBJECTID); |
1602 | 1608 | ||
1603 | chunk_root->node = read_tree_block(chunk_root, | 1609 | chunk_root->node = read_tree_block(chunk_root, |
1604 | btrfs_super_chunk_root(disk_super), | 1610 | btrfs_super_chunk_root(disk_super), |
1605 | blocksize, 0); | 1611 | blocksize, generation); |
1606 | BUG_ON(!chunk_root->node); | 1612 | BUG_ON(!chunk_root->node); |
1607 | 1613 | ||
1608 | read_extent_buffer(chunk_root->node, fs_info->chunk_tree_uuid, | 1614 | read_extent_buffer(chunk_root->node, fs_info->chunk_tree_uuid, |
@@ -1618,11 +1624,11 @@ struct btrfs_root *open_ctree(struct super_block *sb, | |||
1618 | 1624 | ||
1619 | blocksize = btrfs_level_size(tree_root, | 1625 | blocksize = btrfs_level_size(tree_root, |
1620 | btrfs_super_root_level(disk_super)); | 1626 | btrfs_super_root_level(disk_super)); |
1621 | 1627 | generation = btrfs_super_generation(disk_super); | |
1622 | 1628 | ||
1623 | tree_root->node = read_tree_block(tree_root, | 1629 | tree_root->node = read_tree_block(tree_root, |
1624 | btrfs_super_root(disk_super), | 1630 | btrfs_super_root(disk_super), |
1625 | blocksize, 0); | 1631 | blocksize, generation); |
1626 | if (!tree_root->node) | 1632 | if (!tree_root->node) |
1627 | goto fail_sb_buffer; | 1633 | goto fail_sb_buffer; |
1628 | 1634 | ||
@@ -1672,15 +1678,16 @@ struct btrfs_root *open_ctree(struct super_block *sb, | |||
1672 | log_tree_root, fs_info, BTRFS_TREE_LOG_OBJECTID); | 1678 | log_tree_root, fs_info, BTRFS_TREE_LOG_OBJECTID); |
1673 | 1679 | ||
1674 | log_tree_root->node = read_tree_block(tree_root, bytenr, | 1680 | log_tree_root->node = read_tree_block(tree_root, bytenr, |
1675 | blocksize, 0); | 1681 | blocksize, |
1682 | generation + 1); | ||
1676 | ret = btrfs_recover_log_trees(log_tree_root); | 1683 | ret = btrfs_recover_log_trees(log_tree_root); |
1677 | BUG_ON(ret); | 1684 | BUG_ON(ret); |
1678 | } | 1685 | } |
1686 | fs_info->last_trans_committed = btrfs_super_generation(disk_super); | ||
1679 | 1687 | ||
1680 | ret = btrfs_cleanup_reloc_trees(tree_root); | 1688 | ret = btrfs_cleanup_reloc_trees(tree_root); |
1681 | BUG_ON(ret); | 1689 | BUG_ON(ret); |
1682 | 1690 | ||
1683 | fs_info->last_trans_committed = btrfs_super_generation(disk_super); | ||
1684 | return tree_root; | 1691 | return tree_root; |
1685 | 1692 | ||
1686 | fail_cleaner: | 1693 | fail_cleaner: |