aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/disk-io.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/disk-io.c')
-rw-r--r--fs/btrfs/disk-io.c77
1 files changed, 49 insertions, 28 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index af0435f79fa6..009e3bd18f23 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -892,6 +892,8 @@ static int __setup_root(u32 nodesize, u32 leafsize, u32 sectorsize,
892 root->stripesize = stripesize; 892 root->stripesize = stripesize;
893 root->ref_cows = 0; 893 root->ref_cows = 0;
894 root->track_dirty = 0; 894 root->track_dirty = 0;
895 root->in_radix = 0;
896 root->clean_orphans = 0;
895 897
896 root->fs_info = fs_info; 898 root->fs_info = fs_info;
897 root->objectid = objectid; 899 root->objectid = objectid;
@@ -917,6 +919,7 @@ static int __setup_root(u32 nodesize, u32 leafsize, u32 sectorsize,
917 atomic_set(&root->log_writers, 0); 919 atomic_set(&root->log_writers, 0);
918 root->log_batch = 0; 920 root->log_batch = 0;
919 root->log_transid = 0; 921 root->log_transid = 0;
922 root->last_log_commit = 0;
920 extent_io_tree_init(&root->dirty_log_pages, 923 extent_io_tree_init(&root->dirty_log_pages,
921 fs_info->btree_inode->i_mapping, GFP_NOFS); 924 fs_info->btree_inode->i_mapping, GFP_NOFS);
922 925
@@ -927,7 +930,6 @@ static int __setup_root(u32 nodesize, u32 leafsize, u32 sectorsize,
927 root->defrag_trans_start = fs_info->generation; 930 root->defrag_trans_start = fs_info->generation;
928 init_completion(&root->kobj_unregister); 931 init_completion(&root->kobj_unregister);
929 root->defrag_running = 0; 932 root->defrag_running = 0;
930 root->defrag_level = 0;
931 root->root_key.objectid = objectid; 933 root->root_key.objectid = objectid;
932 root->anon_super.s_root = NULL; 934 root->anon_super.s_root = NULL;
933 root->anon_super.s_dev = 0; 935 root->anon_super.s_dev = 0;
@@ -979,12 +981,12 @@ int btrfs_free_log_root_tree(struct btrfs_trans_handle *trans,
979 981
980 while (1) { 982 while (1) {
981 ret = find_first_extent_bit(&log_root_tree->dirty_log_pages, 983 ret = find_first_extent_bit(&log_root_tree->dirty_log_pages,
982 0, &start, &end, EXTENT_DIRTY); 984 0, &start, &end, EXTENT_DIRTY | EXTENT_NEW);
983 if (ret) 985 if (ret)
984 break; 986 break;
985 987
986 clear_extent_dirty(&log_root_tree->dirty_log_pages, 988 clear_extent_bits(&log_root_tree->dirty_log_pages, start, end,
987 start, end, GFP_NOFS); 989 EXTENT_DIRTY | EXTENT_NEW, GFP_NOFS);
988 } 990 }
989 eb = fs_info->log_root_tree->node; 991 eb = fs_info->log_root_tree->node;
990 992
@@ -1087,6 +1089,7 @@ int btrfs_add_log_tree(struct btrfs_trans_handle *trans,
1087 WARN_ON(root->log_root); 1089 WARN_ON(root->log_root);
1088 root->log_root = log_root; 1090 root->log_root = log_root;
1089 root->log_transid = 0; 1091 root->log_transid = 0;
1092 root->last_log_commit = 0;
1090 return 0; 1093 return 0;
1091} 1094}
1092 1095
@@ -1208,8 +1211,10 @@ again:
1208 ret = radix_tree_insert(&fs_info->fs_roots_radix, 1211 ret = radix_tree_insert(&fs_info->fs_roots_radix,
1209 (unsigned long)root->root_key.objectid, 1212 (unsigned long)root->root_key.objectid,
1210 root); 1213 root);
1211 if (ret == 0) 1214 if (ret == 0) {
1212 root->in_radix = 1; 1215 root->in_radix = 1;
1216 root->clean_orphans = 1;
1217 }
1213 spin_unlock(&fs_info->fs_roots_radix_lock); 1218 spin_unlock(&fs_info->fs_roots_radix_lock);
1214 radix_tree_preload_end(); 1219 radix_tree_preload_end();
1215 if (ret) { 1220 if (ret) {
@@ -1223,10 +1228,6 @@ again:
1223 ret = btrfs_find_dead_roots(fs_info->tree_root, 1228 ret = btrfs_find_dead_roots(fs_info->tree_root,
1224 root->root_key.objectid); 1229 root->root_key.objectid);
1225 WARN_ON(ret); 1230 WARN_ON(ret);
1226
1227 if (!(fs_info->sb->s_flags & MS_RDONLY))
1228 btrfs_orphan_cleanup(root);
1229
1230 return root; 1231 return root;
1231fail: 1232fail:
1232 free_fs_root(root); 1233 free_fs_root(root);
@@ -1475,6 +1476,7 @@ static int cleaner_kthread(void *arg)
1475 1476
1476 if (!(root->fs_info->sb->s_flags & MS_RDONLY) && 1477 if (!(root->fs_info->sb->s_flags & MS_RDONLY) &&
1477 mutex_trylock(&root->fs_info->cleaner_mutex)) { 1478 mutex_trylock(&root->fs_info->cleaner_mutex)) {
1479 btrfs_run_delayed_iputs(root);
1478 btrfs_clean_old_snapshots(root); 1480 btrfs_clean_old_snapshots(root);
1479 mutex_unlock(&root->fs_info->cleaner_mutex); 1481 mutex_unlock(&root->fs_info->cleaner_mutex);
1480 } 1482 }
@@ -1604,6 +1606,7 @@ struct btrfs_root *open_ctree(struct super_block *sb,
1604 INIT_RADIX_TREE(&fs_info->fs_roots_radix, GFP_ATOMIC); 1606 INIT_RADIX_TREE(&fs_info->fs_roots_radix, GFP_ATOMIC);
1605 INIT_LIST_HEAD(&fs_info->trans_list); 1607 INIT_LIST_HEAD(&fs_info->trans_list);
1606 INIT_LIST_HEAD(&fs_info->dead_roots); 1608 INIT_LIST_HEAD(&fs_info->dead_roots);
1609 INIT_LIST_HEAD(&fs_info->delayed_iputs);
1607 INIT_LIST_HEAD(&fs_info->hashers); 1610 INIT_LIST_HEAD(&fs_info->hashers);
1608 INIT_LIST_HEAD(&fs_info->delalloc_inodes); 1611 INIT_LIST_HEAD(&fs_info->delalloc_inodes);
1609 INIT_LIST_HEAD(&fs_info->ordered_operations); 1612 INIT_LIST_HEAD(&fs_info->ordered_operations);
@@ -1612,6 +1615,7 @@ struct btrfs_root *open_ctree(struct super_block *sb,
1612 spin_lock_init(&fs_info->new_trans_lock); 1615 spin_lock_init(&fs_info->new_trans_lock);
1613 spin_lock_init(&fs_info->ref_cache_lock); 1616 spin_lock_init(&fs_info->ref_cache_lock);
1614 spin_lock_init(&fs_info->fs_roots_radix_lock); 1617 spin_lock_init(&fs_info->fs_roots_radix_lock);
1618 spin_lock_init(&fs_info->delayed_iput_lock);
1615 1619
1616 init_completion(&fs_info->kobj_unregister); 1620 init_completion(&fs_info->kobj_unregister);
1617 fs_info->tree_root = tree_root; 1621 fs_info->tree_root = tree_root;
@@ -1687,6 +1691,7 @@ struct btrfs_root *open_ctree(struct super_block *sb,
1687 mutex_init(&fs_info->cleaner_mutex); 1691 mutex_init(&fs_info->cleaner_mutex);
1688 mutex_init(&fs_info->volume_mutex); 1692 mutex_init(&fs_info->volume_mutex);
1689 init_rwsem(&fs_info->extent_commit_sem); 1693 init_rwsem(&fs_info->extent_commit_sem);
1694 init_rwsem(&fs_info->cleanup_work_sem);
1690 init_rwsem(&fs_info->subvol_sem); 1695 init_rwsem(&fs_info->subvol_sem);
1691 1696
1692 btrfs_init_free_cluster(&fs_info->meta_alloc_cluster); 1697 btrfs_init_free_cluster(&fs_info->meta_alloc_cluster);
@@ -1746,21 +1751,25 @@ struct btrfs_root *open_ctree(struct super_block *sb,
1746 err = -EINVAL; 1751 err = -EINVAL;
1747 goto fail_iput; 1752 goto fail_iput;
1748 } 1753 }
1749printk("thread pool is %d\n", fs_info->thread_pool_size); 1754
1750 /* 1755 btrfs_init_workers(&fs_info->generic_worker,
1751 * we need to start all the end_io workers up front because the 1756 "genwork", 1, NULL);
1752 * queue work function gets called at interrupt time, and so it 1757
1753 * cannot dynamically grow.
1754 */
1755 btrfs_init_workers(&fs_info->workers, "worker", 1758 btrfs_init_workers(&fs_info->workers, "worker",
1756 fs_info->thread_pool_size); 1759 fs_info->thread_pool_size,
1760 &fs_info->generic_worker);
1757 1761
1758 btrfs_init_workers(&fs_info->delalloc_workers, "delalloc", 1762 btrfs_init_workers(&fs_info->delalloc_workers, "delalloc",
1759 fs_info->thread_pool_size); 1763 fs_info->thread_pool_size,
1764 &fs_info->generic_worker);
1760 1765
1761 btrfs_init_workers(&fs_info->submit_workers, "submit", 1766 btrfs_init_workers(&fs_info->submit_workers, "submit",
1762 min_t(u64, fs_devices->num_devices, 1767 min_t(u64, fs_devices->num_devices,
1763 fs_info->thread_pool_size)); 1768 fs_info->thread_pool_size),
1769 &fs_info->generic_worker);
1770 btrfs_init_workers(&fs_info->enospc_workers, "enospc",
1771 fs_info->thread_pool_size,
1772 &fs_info->generic_worker);
1764 1773
1765 /* a higher idle thresh on the submit workers makes it much more 1774 /* a higher idle thresh on the submit workers makes it much more
1766 * likely that bios will be send down in a sane order to the 1775 * likely that bios will be send down in a sane order to the
@@ -1774,15 +1783,20 @@ printk("thread pool is %d\n", fs_info->thread_pool_size);
1774 fs_info->delalloc_workers.idle_thresh = 2; 1783 fs_info->delalloc_workers.idle_thresh = 2;
1775 fs_info->delalloc_workers.ordered = 1; 1784 fs_info->delalloc_workers.ordered = 1;
1776 1785
1777 btrfs_init_workers(&fs_info->fixup_workers, "fixup", 1); 1786 btrfs_init_workers(&fs_info->fixup_workers, "fixup", 1,
1787 &fs_info->generic_worker);
1778 btrfs_init_workers(&fs_info->endio_workers, "endio", 1788 btrfs_init_workers(&fs_info->endio_workers, "endio",
1779 fs_info->thread_pool_size); 1789 fs_info->thread_pool_size,
1790 &fs_info->generic_worker);
1780 btrfs_init_workers(&fs_info->endio_meta_workers, "endio-meta", 1791 btrfs_init_workers(&fs_info->endio_meta_workers, "endio-meta",
1781 fs_info->thread_pool_size); 1792 fs_info->thread_pool_size,
1793 &fs_info->generic_worker);
1782 btrfs_init_workers(&fs_info->endio_meta_write_workers, 1794 btrfs_init_workers(&fs_info->endio_meta_write_workers,
1783 "endio-meta-write", fs_info->thread_pool_size); 1795 "endio-meta-write", fs_info->thread_pool_size,
1796 &fs_info->generic_worker);
1784 btrfs_init_workers(&fs_info->endio_write_workers, "endio-write", 1797 btrfs_init_workers(&fs_info->endio_write_workers, "endio-write",
1785 fs_info->thread_pool_size); 1798 fs_info->thread_pool_size,
1799 &fs_info->generic_worker);
1786 1800
1787 /* 1801 /*
1788 * endios are largely parallel and should have a very 1802 * endios are largely parallel and should have a very
@@ -1794,12 +1808,8 @@ printk("thread pool is %d\n", fs_info->thread_pool_size);
1794 fs_info->endio_write_workers.idle_thresh = 2; 1808 fs_info->endio_write_workers.idle_thresh = 2;
1795 fs_info->endio_meta_write_workers.idle_thresh = 2; 1809 fs_info->endio_meta_write_workers.idle_thresh = 2;
1796 1810
1797 fs_info->endio_workers.atomic_worker_start = 1;
1798 fs_info->endio_meta_workers.atomic_worker_start = 1;
1799 fs_info->endio_write_workers.atomic_worker_start = 1;
1800 fs_info->endio_meta_write_workers.atomic_worker_start = 1;
1801
1802 btrfs_start_workers(&fs_info->workers, 1); 1811 btrfs_start_workers(&fs_info->workers, 1);
1812 btrfs_start_workers(&fs_info->generic_worker, 1);
1803 btrfs_start_workers(&fs_info->submit_workers, 1); 1813 btrfs_start_workers(&fs_info->submit_workers, 1);
1804 btrfs_start_workers(&fs_info->delalloc_workers, 1); 1814 btrfs_start_workers(&fs_info->delalloc_workers, 1);
1805 btrfs_start_workers(&fs_info->fixup_workers, 1); 1815 btrfs_start_workers(&fs_info->fixup_workers, 1);
@@ -1807,6 +1817,7 @@ printk("thread pool is %d\n", fs_info->thread_pool_size);
1807 btrfs_start_workers(&fs_info->endio_meta_workers, 1); 1817 btrfs_start_workers(&fs_info->endio_meta_workers, 1);
1808 btrfs_start_workers(&fs_info->endio_meta_write_workers, 1); 1818 btrfs_start_workers(&fs_info->endio_meta_write_workers, 1);
1809 btrfs_start_workers(&fs_info->endio_write_workers, 1); 1819 btrfs_start_workers(&fs_info->endio_write_workers, 1);
1820 btrfs_start_workers(&fs_info->enospc_workers, 1);
1810 1821
1811 fs_info->bdi.ra_pages *= btrfs_super_num_devices(disk_super); 1822 fs_info->bdi.ra_pages *= btrfs_super_num_devices(disk_super);
1812 fs_info->bdi.ra_pages = max(fs_info->bdi.ra_pages, 1823 fs_info->bdi.ra_pages = max(fs_info->bdi.ra_pages,
@@ -2012,6 +2023,7 @@ fail_chunk_root:
2012 free_extent_buffer(chunk_root->node); 2023 free_extent_buffer(chunk_root->node);
2013 free_extent_buffer(chunk_root->commit_root); 2024 free_extent_buffer(chunk_root->commit_root);
2014fail_sb_buffer: 2025fail_sb_buffer:
2026 btrfs_stop_workers(&fs_info->generic_worker);
2015 btrfs_stop_workers(&fs_info->fixup_workers); 2027 btrfs_stop_workers(&fs_info->fixup_workers);
2016 btrfs_stop_workers(&fs_info->delalloc_workers); 2028 btrfs_stop_workers(&fs_info->delalloc_workers);
2017 btrfs_stop_workers(&fs_info->workers); 2029 btrfs_stop_workers(&fs_info->workers);
@@ -2020,6 +2032,7 @@ fail_sb_buffer:
2020 btrfs_stop_workers(&fs_info->endio_meta_write_workers); 2032 btrfs_stop_workers(&fs_info->endio_meta_write_workers);
2021 btrfs_stop_workers(&fs_info->endio_write_workers); 2033 btrfs_stop_workers(&fs_info->endio_write_workers);
2022 btrfs_stop_workers(&fs_info->submit_workers); 2034 btrfs_stop_workers(&fs_info->submit_workers);
2035 btrfs_stop_workers(&fs_info->enospc_workers);
2023fail_iput: 2036fail_iput:
2024 invalidate_inode_pages2(fs_info->btree_inode->i_mapping); 2037 invalidate_inode_pages2(fs_info->btree_inode->i_mapping);
2025 iput(fs_info->btree_inode); 2038 iput(fs_info->btree_inode);
@@ -2376,8 +2389,14 @@ int btrfs_commit_super(struct btrfs_root *root)
2376 int ret; 2389 int ret;
2377 2390
2378 mutex_lock(&root->fs_info->cleaner_mutex); 2391 mutex_lock(&root->fs_info->cleaner_mutex);
2392 btrfs_run_delayed_iputs(root);
2379 btrfs_clean_old_snapshots(root); 2393 btrfs_clean_old_snapshots(root);
2380 mutex_unlock(&root->fs_info->cleaner_mutex); 2394 mutex_unlock(&root->fs_info->cleaner_mutex);
2395
2396 /* wait until ongoing cleanup work done */
2397 down_write(&root->fs_info->cleanup_work_sem);
2398 up_write(&root->fs_info->cleanup_work_sem);
2399
2381 trans = btrfs_start_transaction(root, 1); 2400 trans = btrfs_start_transaction(root, 1);
2382 ret = btrfs_commit_transaction(trans, root); 2401 ret = btrfs_commit_transaction(trans, root);
2383 BUG_ON(ret); 2402 BUG_ON(ret);
@@ -2437,6 +2456,7 @@ int close_ctree(struct btrfs_root *root)
2437 2456
2438 iput(fs_info->btree_inode); 2457 iput(fs_info->btree_inode);
2439 2458
2459 btrfs_stop_workers(&fs_info->generic_worker);
2440 btrfs_stop_workers(&fs_info->fixup_workers); 2460 btrfs_stop_workers(&fs_info->fixup_workers);
2441 btrfs_stop_workers(&fs_info->delalloc_workers); 2461 btrfs_stop_workers(&fs_info->delalloc_workers);
2442 btrfs_stop_workers(&fs_info->workers); 2462 btrfs_stop_workers(&fs_info->workers);
@@ -2445,6 +2465,7 @@ int close_ctree(struct btrfs_root *root)
2445 btrfs_stop_workers(&fs_info->endio_meta_write_workers); 2465 btrfs_stop_workers(&fs_info->endio_meta_write_workers);
2446 btrfs_stop_workers(&fs_info->endio_write_workers); 2466 btrfs_stop_workers(&fs_info->endio_write_workers);
2447 btrfs_stop_workers(&fs_info->submit_workers); 2467 btrfs_stop_workers(&fs_info->submit_workers);
2468 btrfs_stop_workers(&fs_info->enospc_workers);
2448 2469
2449 btrfs_close_devices(fs_info->fs_devices); 2470 btrfs_close_devices(fs_info->fs_devices);
2450 btrfs_mapping_tree_free(&fs_info->mapping_tree); 2471 btrfs_mapping_tree_free(&fs_info->mapping_tree);