diff options
Diffstat (limited to 'fs/btrfs/disk-io.c')
-rw-r--r-- | fs/btrfs/disk-io.c | 164 |
1 files changed, 97 insertions, 67 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 4b0ea0b80c23..0d50d49d990a 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
@@ -26,8 +26,8 @@ | |||
26 | #include <linux/workqueue.h> | 26 | #include <linux/workqueue.h> |
27 | #include <linux/kthread.h> | 27 | #include <linux/kthread.h> |
28 | #include <linux/freezer.h> | 28 | #include <linux/freezer.h> |
29 | #include <linux/crc32c.h> | ||
29 | #include "compat.h" | 30 | #include "compat.h" |
30 | #include "crc32c.h" | ||
31 | #include "ctree.h" | 31 | #include "ctree.h" |
32 | #include "disk-io.h" | 32 | #include "disk-io.h" |
33 | #include "transaction.h" | 33 | #include "transaction.h" |
@@ -36,7 +36,6 @@ | |||
36 | #include "print-tree.h" | 36 | #include "print-tree.h" |
37 | #include "async-thread.h" | 37 | #include "async-thread.h" |
38 | #include "locking.h" | 38 | #include "locking.h" |
39 | #include "ref-cache.h" | ||
40 | #include "tree-log.h" | 39 | #include "tree-log.h" |
41 | #include "free-space-cache.h" | 40 | #include "free-space-cache.h" |
42 | 41 | ||
@@ -172,7 +171,7 @@ out: | |||
172 | 171 | ||
173 | u32 btrfs_csum_data(struct btrfs_root *root, char *data, u32 seed, size_t len) | 172 | u32 btrfs_csum_data(struct btrfs_root *root, char *data, u32 seed, size_t len) |
174 | { | 173 | { |
175 | return btrfs_crc32c(seed, data, len); | 174 | return crc32c(seed, data, len); |
176 | } | 175 | } |
177 | 176 | ||
178 | void btrfs_csum_final(u32 crc, char *result) | 177 | void btrfs_csum_final(u32 crc, char *result) |
@@ -884,7 +883,6 @@ static int __setup_root(u32 nodesize, u32 leafsize, u32 sectorsize, | |||
884 | { | 883 | { |
885 | root->node = NULL; | 884 | root->node = NULL; |
886 | root->commit_root = NULL; | 885 | root->commit_root = NULL; |
887 | root->ref_tree = NULL; | ||
888 | root->sectorsize = sectorsize; | 886 | root->sectorsize = sectorsize; |
889 | root->nodesize = nodesize; | 887 | root->nodesize = nodesize; |
890 | root->leafsize = leafsize; | 888 | root->leafsize = leafsize; |
@@ -899,12 +897,14 @@ static int __setup_root(u32 nodesize, u32 leafsize, u32 sectorsize, | |||
899 | root->last_inode_alloc = 0; | 897 | root->last_inode_alloc = 0; |
900 | root->name = NULL; | 898 | root->name = NULL; |
901 | root->in_sysfs = 0; | 899 | root->in_sysfs = 0; |
900 | root->inode_tree.rb_node = NULL; | ||
902 | 901 | ||
903 | INIT_LIST_HEAD(&root->dirty_list); | 902 | INIT_LIST_HEAD(&root->dirty_list); |
904 | INIT_LIST_HEAD(&root->orphan_list); | 903 | INIT_LIST_HEAD(&root->orphan_list); |
905 | INIT_LIST_HEAD(&root->dead_list); | 904 | INIT_LIST_HEAD(&root->root_list); |
906 | spin_lock_init(&root->node_lock); | 905 | spin_lock_init(&root->node_lock); |
907 | spin_lock_init(&root->list_lock); | 906 | spin_lock_init(&root->list_lock); |
907 | spin_lock_init(&root->inode_lock); | ||
908 | mutex_init(&root->objectid_mutex); | 908 | mutex_init(&root->objectid_mutex); |
909 | mutex_init(&root->log_mutex); | 909 | mutex_init(&root->log_mutex); |
910 | init_waitqueue_head(&root->log_writer_wait); | 910 | init_waitqueue_head(&root->log_writer_wait); |
@@ -918,9 +918,6 @@ static int __setup_root(u32 nodesize, u32 leafsize, u32 sectorsize, | |||
918 | extent_io_tree_init(&root->dirty_log_pages, | 918 | extent_io_tree_init(&root->dirty_log_pages, |
919 | fs_info->btree_inode->i_mapping, GFP_NOFS); | 919 | fs_info->btree_inode->i_mapping, GFP_NOFS); |
920 | 920 | ||
921 | btrfs_leaf_ref_tree_init(&root->ref_tree_struct); | ||
922 | root->ref_tree = &root->ref_tree_struct; | ||
923 | |||
924 | memset(&root->root_key, 0, sizeof(root->root_key)); | 921 | memset(&root->root_key, 0, sizeof(root->root_key)); |
925 | memset(&root->root_item, 0, sizeof(root->root_item)); | 922 | memset(&root->root_item, 0, sizeof(root->root_item)); |
926 | memset(&root->defrag_progress, 0, sizeof(root->defrag_progress)); | 923 | memset(&root->defrag_progress, 0, sizeof(root->defrag_progress)); |
@@ -959,6 +956,7 @@ static int find_and_setup_root(struct btrfs_root *tree_root, | |||
959 | blocksize = btrfs_level_size(root, btrfs_root_level(&root->root_item)); | 956 | blocksize = btrfs_level_size(root, btrfs_root_level(&root->root_item)); |
960 | root->node = read_tree_block(root, btrfs_root_bytenr(&root->root_item), | 957 | root->node = read_tree_block(root, btrfs_root_bytenr(&root->root_item), |
961 | blocksize, generation); | 958 | blocksize, generation); |
959 | root->commit_root = btrfs_root_node(root); | ||
962 | BUG_ON(!root->node); | 960 | BUG_ON(!root->node); |
963 | return 0; | 961 | return 0; |
964 | } | 962 | } |
@@ -1025,20 +1023,19 @@ static struct btrfs_root *alloc_log_tree(struct btrfs_trans_handle *trans, | |||
1025 | */ | 1023 | */ |
1026 | root->ref_cows = 0; | 1024 | root->ref_cows = 0; |
1027 | 1025 | ||
1028 | leaf = btrfs_alloc_free_block(trans, root, root->leafsize, | 1026 | leaf = btrfs_alloc_free_block(trans, root, root->leafsize, 0, |
1029 | 0, BTRFS_TREE_LOG_OBJECTID, | 1027 | BTRFS_TREE_LOG_OBJECTID, NULL, 0, 0, 0); |
1030 | trans->transid, 0, 0, 0); | ||
1031 | if (IS_ERR(leaf)) { | 1028 | if (IS_ERR(leaf)) { |
1032 | kfree(root); | 1029 | kfree(root); |
1033 | return ERR_CAST(leaf); | 1030 | return ERR_CAST(leaf); |
1034 | } | 1031 | } |
1035 | 1032 | ||
1033 | memset_extent_buffer(leaf, 0, 0, sizeof(struct btrfs_header)); | ||
1034 | btrfs_set_header_bytenr(leaf, leaf->start); | ||
1035 | btrfs_set_header_generation(leaf, trans->transid); | ||
1036 | btrfs_set_header_backref_rev(leaf, BTRFS_MIXED_BACKREF_REV); | ||
1037 | btrfs_set_header_owner(leaf, BTRFS_TREE_LOG_OBJECTID); | ||
1036 | root->node = leaf; | 1038 | root->node = leaf; |
1037 | btrfs_set_header_nritems(root->node, 0); | ||
1038 | btrfs_set_header_level(root->node, 0); | ||
1039 | btrfs_set_header_bytenr(root->node, root->node->start); | ||
1040 | btrfs_set_header_generation(root->node, trans->transid); | ||
1041 | btrfs_set_header_owner(root->node, BTRFS_TREE_LOG_OBJECTID); | ||
1042 | 1039 | ||
1043 | write_extent_buffer(root->node, root->fs_info->fsid, | 1040 | write_extent_buffer(root->node, root->fs_info->fsid, |
1044 | (unsigned long)btrfs_header_fsid(root->node), | 1041 | (unsigned long)btrfs_header_fsid(root->node), |
@@ -1081,8 +1078,7 @@ int btrfs_add_log_tree(struct btrfs_trans_handle *trans, | |||
1081 | inode_item->nbytes = cpu_to_le64(root->leafsize); | 1078 | inode_item->nbytes = cpu_to_le64(root->leafsize); |
1082 | inode_item->mode = cpu_to_le32(S_IFDIR | 0755); | 1079 | inode_item->mode = cpu_to_le32(S_IFDIR | 0755); |
1083 | 1080 | ||
1084 | btrfs_set_root_bytenr(&log_root->root_item, log_root->node->start); | 1081 | btrfs_set_root_node(&log_root->root_item, log_root->node); |
1085 | btrfs_set_root_generation(&log_root->root_item, trans->transid); | ||
1086 | 1082 | ||
1087 | WARN_ON(root->log_root); | 1083 | WARN_ON(root->log_root); |
1088 | root->log_root = log_root; | 1084 | root->log_root = log_root; |
@@ -1144,6 +1140,7 @@ out: | |||
1144 | blocksize = btrfs_level_size(root, btrfs_root_level(&root->root_item)); | 1140 | blocksize = btrfs_level_size(root, btrfs_root_level(&root->root_item)); |
1145 | root->node = read_tree_block(root, btrfs_root_bytenr(&root->root_item), | 1141 | root->node = read_tree_block(root, btrfs_root_bytenr(&root->root_item), |
1146 | blocksize, generation); | 1142 | blocksize, generation); |
1143 | root->commit_root = btrfs_root_node(root); | ||
1147 | BUG_ON(!root->node); | 1144 | BUG_ON(!root->node); |
1148 | insert: | 1145 | insert: |
1149 | if (location->objectid != BTRFS_TREE_LOG_OBJECTID) { | 1146 | if (location->objectid != BTRFS_TREE_LOG_OBJECTID) { |
@@ -1210,7 +1207,7 @@ struct btrfs_root *btrfs_read_fs_root_no_name(struct btrfs_fs_info *fs_info, | |||
1210 | } | 1207 | } |
1211 | if (!(fs_info->sb->s_flags & MS_RDONLY)) { | 1208 | if (!(fs_info->sb->s_flags & MS_RDONLY)) { |
1212 | ret = btrfs_find_dead_roots(fs_info->tree_root, | 1209 | ret = btrfs_find_dead_roots(fs_info->tree_root, |
1213 | root->root_key.objectid, root); | 1210 | root->root_key.objectid); |
1214 | BUG_ON(ret); | 1211 | BUG_ON(ret); |
1215 | btrfs_orphan_cleanup(root); | 1212 | btrfs_orphan_cleanup(root); |
1216 | } | 1213 | } |
@@ -1569,8 +1566,6 @@ struct btrfs_root *open_ctree(struct super_block *sb, | |||
1569 | atomic_set(&fs_info->async_delalloc_pages, 0); | 1566 | atomic_set(&fs_info->async_delalloc_pages, 0); |
1570 | atomic_set(&fs_info->async_submit_draining, 0); | 1567 | atomic_set(&fs_info->async_submit_draining, 0); |
1571 | atomic_set(&fs_info->nr_async_bios, 0); | 1568 | atomic_set(&fs_info->nr_async_bios, 0); |
1572 | atomic_set(&fs_info->throttles, 0); | ||
1573 | atomic_set(&fs_info->throttle_gen, 0); | ||
1574 | fs_info->sb = sb; | 1569 | fs_info->sb = sb; |
1575 | fs_info->max_extent = (u64)-1; | 1570 | fs_info->max_extent = (u64)-1; |
1576 | fs_info->max_inline = 8192 * 1024; | 1571 | fs_info->max_inline = 8192 * 1024; |
@@ -1598,6 +1593,7 @@ struct btrfs_root *open_ctree(struct super_block *sb, | |||
1598 | fs_info->btree_inode->i_mapping->a_ops = &btree_aops; | 1593 | fs_info->btree_inode->i_mapping->a_ops = &btree_aops; |
1599 | fs_info->btree_inode->i_mapping->backing_dev_info = &fs_info->bdi; | 1594 | fs_info->btree_inode->i_mapping->backing_dev_info = &fs_info->bdi; |
1600 | 1595 | ||
1596 | RB_CLEAR_NODE(&BTRFS_I(fs_info->btree_inode)->rb_node); | ||
1601 | extent_io_tree_init(&BTRFS_I(fs_info->btree_inode)->io_tree, | 1597 | extent_io_tree_init(&BTRFS_I(fs_info->btree_inode)->io_tree, |
1602 | fs_info->btree_inode->i_mapping, | 1598 | fs_info->btree_inode->i_mapping, |
1603 | GFP_NOFS); | 1599 | GFP_NOFS); |
@@ -1613,10 +1609,6 @@ struct btrfs_root *open_ctree(struct super_block *sb, | |||
1613 | fs_info->btree_inode->i_mapping, GFP_NOFS); | 1609 | fs_info->btree_inode->i_mapping, GFP_NOFS); |
1614 | fs_info->do_barriers = 1; | 1610 | fs_info->do_barriers = 1; |
1615 | 1611 | ||
1616 | INIT_LIST_HEAD(&fs_info->dead_reloc_roots); | ||
1617 | btrfs_leaf_ref_tree_init(&fs_info->reloc_ref_tree); | ||
1618 | btrfs_leaf_ref_tree_init(&fs_info->shared_ref_tree); | ||
1619 | |||
1620 | BTRFS_I(fs_info->btree_inode)->root = tree_root; | 1612 | BTRFS_I(fs_info->btree_inode)->root = tree_root; |
1621 | memset(&BTRFS_I(fs_info->btree_inode)->location, 0, | 1613 | memset(&BTRFS_I(fs_info->btree_inode)->location, 0, |
1622 | sizeof(struct btrfs_key)); | 1614 | sizeof(struct btrfs_key)); |
@@ -1674,6 +1666,12 @@ struct btrfs_root *open_ctree(struct super_block *sb, | |||
1674 | goto fail_iput; | 1666 | goto fail_iput; |
1675 | } | 1667 | } |
1676 | 1668 | ||
1669 | features = btrfs_super_incompat_flags(disk_super); | ||
1670 | if (!(features & BTRFS_FEATURE_INCOMPAT_MIXED_BACKREF)) { | ||
1671 | features |= BTRFS_FEATURE_INCOMPAT_MIXED_BACKREF; | ||
1672 | btrfs_set_super_incompat_flags(disk_super, features); | ||
1673 | } | ||
1674 | |||
1677 | features = btrfs_super_compat_ro_flags(disk_super) & | 1675 | features = btrfs_super_compat_ro_flags(disk_super) & |
1678 | ~BTRFS_FEATURE_COMPAT_RO_SUPP; | 1676 | ~BTRFS_FEATURE_COMPAT_RO_SUPP; |
1679 | if (!(sb->s_flags & MS_RDONLY) && features) { | 1677 | if (!(sb->s_flags & MS_RDONLY) && features) { |
@@ -1771,7 +1769,7 @@ struct btrfs_root *open_ctree(struct super_block *sb, | |||
1771 | if (ret) { | 1769 | if (ret) { |
1772 | printk(KERN_WARNING "btrfs: failed to read the system " | 1770 | printk(KERN_WARNING "btrfs: failed to read the system " |
1773 | "array on %s\n", sb->s_id); | 1771 | "array on %s\n", sb->s_id); |
1774 | goto fail_sys_array; | 1772 | goto fail_sb_buffer; |
1775 | } | 1773 | } |
1776 | 1774 | ||
1777 | blocksize = btrfs_level_size(tree_root, | 1775 | blocksize = btrfs_level_size(tree_root, |
@@ -1785,6 +1783,8 @@ struct btrfs_root *open_ctree(struct super_block *sb, | |||
1785 | btrfs_super_chunk_root(disk_super), | 1783 | btrfs_super_chunk_root(disk_super), |
1786 | blocksize, generation); | 1784 | blocksize, generation); |
1787 | BUG_ON(!chunk_root->node); | 1785 | BUG_ON(!chunk_root->node); |
1786 | btrfs_set_root_node(&chunk_root->root_item, chunk_root->node); | ||
1787 | chunk_root->commit_root = btrfs_root_node(chunk_root); | ||
1788 | 1788 | ||
1789 | read_extent_buffer(chunk_root->node, fs_info->chunk_tree_uuid, | 1789 | read_extent_buffer(chunk_root->node, fs_info->chunk_tree_uuid, |
1790 | (unsigned long)btrfs_header_chunk_tree_uuid(chunk_root->node), | 1790 | (unsigned long)btrfs_header_chunk_tree_uuid(chunk_root->node), |
@@ -1810,7 +1810,8 @@ struct btrfs_root *open_ctree(struct super_block *sb, | |||
1810 | blocksize, generation); | 1810 | blocksize, generation); |
1811 | if (!tree_root->node) | 1811 | if (!tree_root->node) |
1812 | goto fail_chunk_root; | 1812 | goto fail_chunk_root; |
1813 | 1813 | btrfs_set_root_node(&tree_root->root_item, tree_root->node); | |
1814 | tree_root->commit_root = btrfs_root_node(tree_root); | ||
1814 | 1815 | ||
1815 | ret = find_and_setup_root(tree_root, fs_info, | 1816 | ret = find_and_setup_root(tree_root, fs_info, |
1816 | BTRFS_EXTENT_TREE_OBJECTID, extent_root); | 1817 | BTRFS_EXTENT_TREE_OBJECTID, extent_root); |
@@ -1820,14 +1821,14 @@ struct btrfs_root *open_ctree(struct super_block *sb, | |||
1820 | 1821 | ||
1821 | ret = find_and_setup_root(tree_root, fs_info, | 1822 | ret = find_and_setup_root(tree_root, fs_info, |
1822 | BTRFS_DEV_TREE_OBJECTID, dev_root); | 1823 | BTRFS_DEV_TREE_OBJECTID, dev_root); |
1823 | dev_root->track_dirty = 1; | ||
1824 | if (ret) | 1824 | if (ret) |
1825 | goto fail_extent_root; | 1825 | goto fail_extent_root; |
1826 | dev_root->track_dirty = 1; | ||
1826 | 1827 | ||
1827 | ret = find_and_setup_root(tree_root, fs_info, | 1828 | ret = find_and_setup_root(tree_root, fs_info, |
1828 | BTRFS_CSUM_TREE_OBJECTID, csum_root); | 1829 | BTRFS_CSUM_TREE_OBJECTID, csum_root); |
1829 | if (ret) | 1830 | if (ret) |
1830 | goto fail_extent_root; | 1831 | goto fail_dev_root; |
1831 | 1832 | ||
1832 | csum_root->track_dirty = 1; | 1833 | csum_root->track_dirty = 1; |
1833 | 1834 | ||
@@ -1849,6 +1850,14 @@ struct btrfs_root *open_ctree(struct super_block *sb, | |||
1849 | if (IS_ERR(fs_info->transaction_kthread)) | 1850 | if (IS_ERR(fs_info->transaction_kthread)) |
1850 | goto fail_cleaner; | 1851 | goto fail_cleaner; |
1851 | 1852 | ||
1853 | if (!btrfs_test_opt(tree_root, SSD) && | ||
1854 | !btrfs_test_opt(tree_root, NOSSD) && | ||
1855 | !fs_info->fs_devices->rotating) { | ||
1856 | printk(KERN_INFO "Btrfs detected SSD devices, enabling SSD " | ||
1857 | "mode\n"); | ||
1858 | btrfs_set_opt(fs_info->mount_opt, SSD); | ||
1859 | } | ||
1860 | |||
1852 | if (btrfs_super_log_root(disk_super) != 0) { | 1861 | if (btrfs_super_log_root(disk_super) != 0) { |
1853 | u64 bytenr = btrfs_super_log_root(disk_super); | 1862 | u64 bytenr = btrfs_super_log_root(disk_super); |
1854 | 1863 | ||
@@ -1881,7 +1890,7 @@ struct btrfs_root *open_ctree(struct super_block *sb, | |||
1881 | } | 1890 | } |
1882 | 1891 | ||
1883 | if (!(sb->s_flags & MS_RDONLY)) { | 1892 | if (!(sb->s_flags & MS_RDONLY)) { |
1884 | ret = btrfs_cleanup_reloc_trees(tree_root); | 1893 | ret = btrfs_recover_relocation(tree_root); |
1885 | BUG_ON(ret); | 1894 | BUG_ON(ret); |
1886 | } | 1895 | } |
1887 | 1896 | ||
@@ -1892,6 +1901,7 @@ struct btrfs_root *open_ctree(struct super_block *sb, | |||
1892 | fs_info->fs_root = btrfs_read_fs_root_no_name(fs_info, &location); | 1901 | fs_info->fs_root = btrfs_read_fs_root_no_name(fs_info, &location); |
1893 | if (!fs_info->fs_root) | 1902 | if (!fs_info->fs_root) |
1894 | goto fail_trans_kthread; | 1903 | goto fail_trans_kthread; |
1904 | |||
1895 | return tree_root; | 1905 | return tree_root; |
1896 | 1906 | ||
1897 | fail_trans_kthread: | 1907 | fail_trans_kthread: |
@@ -1908,14 +1918,19 @@ fail_cleaner: | |||
1908 | 1918 | ||
1909 | fail_csum_root: | 1919 | fail_csum_root: |
1910 | free_extent_buffer(csum_root->node); | 1920 | free_extent_buffer(csum_root->node); |
1921 | free_extent_buffer(csum_root->commit_root); | ||
1922 | fail_dev_root: | ||
1923 | free_extent_buffer(dev_root->node); | ||
1924 | free_extent_buffer(dev_root->commit_root); | ||
1911 | fail_extent_root: | 1925 | fail_extent_root: |
1912 | free_extent_buffer(extent_root->node); | 1926 | free_extent_buffer(extent_root->node); |
1927 | free_extent_buffer(extent_root->commit_root); | ||
1913 | fail_tree_root: | 1928 | fail_tree_root: |
1914 | free_extent_buffer(tree_root->node); | 1929 | free_extent_buffer(tree_root->node); |
1930 | free_extent_buffer(tree_root->commit_root); | ||
1915 | fail_chunk_root: | 1931 | fail_chunk_root: |
1916 | free_extent_buffer(chunk_root->node); | 1932 | free_extent_buffer(chunk_root->node); |
1917 | fail_sys_array: | 1933 | free_extent_buffer(chunk_root->commit_root); |
1918 | free_extent_buffer(dev_root->node); | ||
1919 | fail_sb_buffer: | 1934 | fail_sb_buffer: |
1920 | btrfs_stop_workers(&fs_info->fixup_workers); | 1935 | btrfs_stop_workers(&fs_info->fixup_workers); |
1921 | btrfs_stop_workers(&fs_info->delalloc_workers); | 1936 | btrfs_stop_workers(&fs_info->delalloc_workers); |
@@ -2005,6 +2020,17 @@ struct buffer_head *btrfs_read_dev_super(struct block_device *bdev) | |||
2005 | return latest; | 2020 | return latest; |
2006 | } | 2021 | } |
2007 | 2022 | ||
2023 | /* | ||
2024 | * this should be called twice, once with wait == 0 and | ||
2025 | * once with wait == 1. When wait == 0 is done, all the buffer heads | ||
2026 | * we write are pinned. | ||
2027 | * | ||
2028 | * They are released when wait == 1 is done. | ||
2029 | * max_mirrors must be the same for both runs, and it indicates how | ||
2030 | * many supers on this one device should be written. | ||
2031 | * | ||
2032 | * max_mirrors == 0 means to write them all. | ||
2033 | */ | ||
2008 | static int write_dev_supers(struct btrfs_device *device, | 2034 | static int write_dev_supers(struct btrfs_device *device, |
2009 | struct btrfs_super_block *sb, | 2035 | struct btrfs_super_block *sb, |
2010 | int do_barriers, int wait, int max_mirrors) | 2036 | int do_barriers, int wait, int max_mirrors) |
@@ -2040,12 +2066,16 @@ static int write_dev_supers(struct btrfs_device *device, | |||
2040 | bh = __find_get_block(device->bdev, bytenr / 4096, | 2066 | bh = __find_get_block(device->bdev, bytenr / 4096, |
2041 | BTRFS_SUPER_INFO_SIZE); | 2067 | BTRFS_SUPER_INFO_SIZE); |
2042 | BUG_ON(!bh); | 2068 | BUG_ON(!bh); |
2043 | brelse(bh); | ||
2044 | wait_on_buffer(bh); | 2069 | wait_on_buffer(bh); |
2045 | if (buffer_uptodate(bh)) { | 2070 | if (!buffer_uptodate(bh)) |
2046 | brelse(bh); | 2071 | errors++; |
2047 | continue; | 2072 | |
2048 | } | 2073 | /* drop our reference */ |
2074 | brelse(bh); | ||
2075 | |||
2076 | /* drop the reference from the wait == 0 run */ | ||
2077 | brelse(bh); | ||
2078 | continue; | ||
2049 | } else { | 2079 | } else { |
2050 | btrfs_set_super_bytenr(sb, bytenr); | 2080 | btrfs_set_super_bytenr(sb, bytenr); |
2051 | 2081 | ||
@@ -2056,12 +2086,18 @@ static int write_dev_supers(struct btrfs_device *device, | |||
2056 | BTRFS_CSUM_SIZE); | 2086 | BTRFS_CSUM_SIZE); |
2057 | btrfs_csum_final(crc, sb->csum); | 2087 | btrfs_csum_final(crc, sb->csum); |
2058 | 2088 | ||
2089 | /* | ||
2090 | * one reference for us, and we leave it for the | ||
2091 | * caller | ||
2092 | */ | ||
2059 | bh = __getblk(device->bdev, bytenr / 4096, | 2093 | bh = __getblk(device->bdev, bytenr / 4096, |
2060 | BTRFS_SUPER_INFO_SIZE); | 2094 | BTRFS_SUPER_INFO_SIZE); |
2061 | memcpy(bh->b_data, sb, BTRFS_SUPER_INFO_SIZE); | 2095 | memcpy(bh->b_data, sb, BTRFS_SUPER_INFO_SIZE); |
2062 | 2096 | ||
2063 | set_buffer_uptodate(bh); | 2097 | /* one reference for submit_bh */ |
2064 | get_bh(bh); | 2098 | get_bh(bh); |
2099 | |||
2100 | set_buffer_uptodate(bh); | ||
2065 | lock_buffer(bh); | 2101 | lock_buffer(bh); |
2066 | bh->b_end_io = btrfs_end_buffer_write_sync; | 2102 | bh->b_end_io = btrfs_end_buffer_write_sync; |
2067 | } | 2103 | } |
@@ -2073,6 +2109,7 @@ static int write_dev_supers(struct btrfs_device *device, | |||
2073 | device->name); | 2109 | device->name); |
2074 | set_buffer_uptodate(bh); | 2110 | set_buffer_uptodate(bh); |
2075 | device->barriers = 0; | 2111 | device->barriers = 0; |
2112 | /* one reference for submit_bh */ | ||
2076 | get_bh(bh); | 2113 | get_bh(bh); |
2077 | lock_buffer(bh); | 2114 | lock_buffer(bh); |
2078 | ret = submit_bh(WRITE_SYNC, bh); | 2115 | ret = submit_bh(WRITE_SYNC, bh); |
@@ -2081,22 +2118,15 @@ static int write_dev_supers(struct btrfs_device *device, | |||
2081 | ret = submit_bh(WRITE_SYNC, bh); | 2118 | ret = submit_bh(WRITE_SYNC, bh); |
2082 | } | 2119 | } |
2083 | 2120 | ||
2084 | if (!ret && wait) { | 2121 | if (ret) |
2085 | wait_on_buffer(bh); | ||
2086 | if (!buffer_uptodate(bh)) | ||
2087 | errors++; | ||
2088 | } else if (ret) { | ||
2089 | errors++; | 2122 | errors++; |
2090 | } | ||
2091 | if (wait) | ||
2092 | brelse(bh); | ||
2093 | } | 2123 | } |
2094 | return errors < i ? 0 : -1; | 2124 | return errors < i ? 0 : -1; |
2095 | } | 2125 | } |
2096 | 2126 | ||
2097 | int write_all_supers(struct btrfs_root *root, int max_mirrors) | 2127 | int write_all_supers(struct btrfs_root *root, int max_mirrors) |
2098 | { | 2128 | { |
2099 | struct list_head *head = &root->fs_info->fs_devices->devices; | 2129 | struct list_head *head; |
2100 | struct btrfs_device *dev; | 2130 | struct btrfs_device *dev; |
2101 | struct btrfs_super_block *sb; | 2131 | struct btrfs_super_block *sb; |
2102 | struct btrfs_dev_item *dev_item; | 2132 | struct btrfs_dev_item *dev_item; |
@@ -2111,6 +2141,9 @@ int write_all_supers(struct btrfs_root *root, int max_mirrors) | |||
2111 | 2141 | ||
2112 | sb = &root->fs_info->super_for_commit; | 2142 | sb = &root->fs_info->super_for_commit; |
2113 | dev_item = &sb->dev_item; | 2143 | dev_item = &sb->dev_item; |
2144 | |||
2145 | mutex_lock(&root->fs_info->fs_devices->device_list_mutex); | ||
2146 | head = &root->fs_info->fs_devices->devices; | ||
2114 | list_for_each_entry(dev, head, dev_list) { | 2147 | list_for_each_entry(dev, head, dev_list) { |
2115 | if (!dev->bdev) { | 2148 | if (!dev->bdev) { |
2116 | total_errors++; | 2149 | total_errors++; |
@@ -2154,6 +2187,7 @@ int write_all_supers(struct btrfs_root *root, int max_mirrors) | |||
2154 | if (ret) | 2187 | if (ret) |
2155 | total_errors++; | 2188 | total_errors++; |
2156 | } | 2189 | } |
2190 | mutex_unlock(&root->fs_info->fs_devices->device_list_mutex); | ||
2157 | if (total_errors > max_errors) { | 2191 | if (total_errors > max_errors) { |
2158 | printk(KERN_ERR "btrfs: %d errors while writing supers\n", | 2192 | printk(KERN_ERR "btrfs: %d errors while writing supers\n", |
2159 | total_errors); | 2193 | total_errors); |
@@ -2173,6 +2207,7 @@ int write_ctree_super(struct btrfs_trans_handle *trans, | |||
2173 | 2207 | ||
2174 | int btrfs_free_fs_root(struct btrfs_fs_info *fs_info, struct btrfs_root *root) | 2208 | int btrfs_free_fs_root(struct btrfs_fs_info *fs_info, struct btrfs_root *root) |
2175 | { | 2209 | { |
2210 | WARN_ON(!RB_EMPTY_ROOT(&root->inode_tree)); | ||
2176 | radix_tree_delete(&fs_info->fs_roots_radix, | 2211 | radix_tree_delete(&fs_info->fs_roots_radix, |
2177 | (unsigned long)root->root_key.objectid); | 2212 | (unsigned long)root->root_key.objectid); |
2178 | if (root->anon_super.s_dev) { | 2213 | if (root->anon_super.s_dev) { |
@@ -2219,10 +2254,12 @@ int btrfs_cleanup_fs_roots(struct btrfs_fs_info *fs_info) | |||
2219 | ARRAY_SIZE(gang)); | 2254 | ARRAY_SIZE(gang)); |
2220 | if (!ret) | 2255 | if (!ret) |
2221 | break; | 2256 | break; |
2257 | |||
2258 | root_objectid = gang[ret - 1]->root_key.objectid + 1; | ||
2222 | for (i = 0; i < ret; i++) { | 2259 | for (i = 0; i < ret; i++) { |
2223 | root_objectid = gang[i]->root_key.objectid; | 2260 | root_objectid = gang[i]->root_key.objectid; |
2224 | ret = btrfs_find_dead_roots(fs_info->tree_root, | 2261 | ret = btrfs_find_dead_roots(fs_info->tree_root, |
2225 | root_objectid, gang[i]); | 2262 | root_objectid); |
2226 | BUG_ON(ret); | 2263 | BUG_ON(ret); |
2227 | btrfs_orphan_cleanup(gang[i]); | 2264 | btrfs_orphan_cleanup(gang[i]); |
2228 | } | 2265 | } |
@@ -2278,20 +2315,16 @@ int close_ctree(struct btrfs_root *root) | |||
2278 | (unsigned long long)fs_info->total_ref_cache_size); | 2315 | (unsigned long long)fs_info->total_ref_cache_size); |
2279 | } | 2316 | } |
2280 | 2317 | ||
2281 | if (fs_info->extent_root->node) | 2318 | free_extent_buffer(fs_info->extent_root->node); |
2282 | free_extent_buffer(fs_info->extent_root->node); | 2319 | free_extent_buffer(fs_info->extent_root->commit_root); |
2283 | 2320 | free_extent_buffer(fs_info->tree_root->node); | |
2284 | if (fs_info->tree_root->node) | 2321 | free_extent_buffer(fs_info->tree_root->commit_root); |
2285 | free_extent_buffer(fs_info->tree_root->node); | 2322 | free_extent_buffer(root->fs_info->chunk_root->node); |
2286 | 2323 | free_extent_buffer(root->fs_info->chunk_root->commit_root); | |
2287 | if (root->fs_info->chunk_root->node) | 2324 | free_extent_buffer(root->fs_info->dev_root->node); |
2288 | free_extent_buffer(root->fs_info->chunk_root->node); | 2325 | free_extent_buffer(root->fs_info->dev_root->commit_root); |
2289 | 2326 | free_extent_buffer(root->fs_info->csum_root->node); | |
2290 | if (root->fs_info->dev_root->node) | 2327 | free_extent_buffer(root->fs_info->csum_root->commit_root); |
2291 | free_extent_buffer(root->fs_info->dev_root->node); | ||
2292 | |||
2293 | if (root->fs_info->csum_root->node) | ||
2294 | free_extent_buffer(root->fs_info->csum_root->node); | ||
2295 | 2328 | ||
2296 | btrfs_free_block_groups(root->fs_info); | 2329 | btrfs_free_block_groups(root->fs_info); |
2297 | 2330 | ||
@@ -2373,17 +2406,14 @@ void btrfs_btree_balance_dirty(struct btrfs_root *root, unsigned long nr) | |||
2373 | * looks as though older kernels can get into trouble with | 2406 | * looks as though older kernels can get into trouble with |
2374 | * this code, they end up stuck in balance_dirty_pages forever | 2407 | * this code, they end up stuck in balance_dirty_pages forever |
2375 | */ | 2408 | */ |
2376 | struct extent_io_tree *tree; | ||
2377 | u64 num_dirty; | 2409 | u64 num_dirty; |
2378 | u64 start = 0; | ||
2379 | unsigned long thresh = 32 * 1024 * 1024; | 2410 | unsigned long thresh = 32 * 1024 * 1024; |
2380 | tree = &BTRFS_I(root->fs_info->btree_inode)->io_tree; | ||
2381 | 2411 | ||
2382 | if (current->flags & PF_MEMALLOC) | 2412 | if (current->flags & PF_MEMALLOC) |
2383 | return; | 2413 | return; |
2384 | 2414 | ||
2385 | num_dirty = count_range_bits(tree, &start, (u64)-1, | 2415 | num_dirty = root->fs_info->dirty_metadata_bytes; |
2386 | thresh, EXTENT_DIRTY); | 2416 | |
2387 | if (num_dirty > thresh) { | 2417 | if (num_dirty > thresh) { |
2388 | balance_dirty_pages_ratelimited_nr( | 2418 | balance_dirty_pages_ratelimited_nr( |
2389 | root->fs_info->btree_inode->i_mapping, 1); | 2419 | root->fs_info->btree_inode->i_mapping, 1); |