diff options
author | Tejun Heo <tj@kernel.org> | 2010-01-04 19:17:33 -0500 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2010-01-04 19:17:33 -0500 |
commit | 32032df6c2f6c9c6b2ada2ce42322231824f70c2 (patch) | |
tree | b1ce838a37044bb38dfc128e2116ca35630e629a /fs/btrfs/disk-io.c | |
parent | 22b737f4c75197372d64afc6ed1bccd58c00e549 (diff) | |
parent | c5974b835a909ff15c3b7e6cf6789b5eb919f419 (diff) |
Merge branch 'master' into percpu
Conflicts:
arch/powerpc/platforms/pseries/hvCall.S
include/linux/percpu.h
Diffstat (limited to 'fs/btrfs/disk-io.c')
-rw-r--r-- | fs/btrfs/disk-io.c | 77 |
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; |
1231 | fail: | 1232 | fail: |
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 | } |
1749 | printk("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); |
2014 | fail_sb_buffer: | 2025 | fail_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); | ||
2023 | fail_iput: | 2036 | fail_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); |