diff options
Diffstat (limited to 'fs/btrfs/disk-io.c')
| -rw-r--r-- | fs/btrfs/disk-io.c | 281 |
1 files changed, 153 insertions, 128 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 81ea55314b1f..bd0f752b797b 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
| @@ -678,32 +678,31 @@ static void end_workqueue_bio(struct bio *bio, int err) | |||
| 678 | 678 | ||
| 679 | fs_info = end_io_wq->info; | 679 | fs_info = end_io_wq->info; |
| 680 | end_io_wq->error = err; | 680 | end_io_wq->error = err; |
| 681 | end_io_wq->work.func = end_workqueue_fn; | 681 | btrfs_init_work(&end_io_wq->work, end_workqueue_fn, NULL, NULL); |
| 682 | end_io_wq->work.flags = 0; | ||
| 683 | 682 | ||
| 684 | if (bio->bi_rw & REQ_WRITE) { | 683 | if (bio->bi_rw & REQ_WRITE) { |
| 685 | if (end_io_wq->metadata == BTRFS_WQ_ENDIO_METADATA) | 684 | if (end_io_wq->metadata == BTRFS_WQ_ENDIO_METADATA) |
| 686 | btrfs_queue_worker(&fs_info->endio_meta_write_workers, | 685 | btrfs_queue_work(fs_info->endio_meta_write_workers, |
| 687 | &end_io_wq->work); | 686 | &end_io_wq->work); |
| 688 | else if (end_io_wq->metadata == BTRFS_WQ_ENDIO_FREE_SPACE) | 687 | else if (end_io_wq->metadata == BTRFS_WQ_ENDIO_FREE_SPACE) |
| 689 | btrfs_queue_worker(&fs_info->endio_freespace_worker, | 688 | btrfs_queue_work(fs_info->endio_freespace_worker, |
| 690 | &end_io_wq->work); | 689 | &end_io_wq->work); |
| 691 | else if (end_io_wq->metadata == BTRFS_WQ_ENDIO_RAID56) | 690 | else if (end_io_wq->metadata == BTRFS_WQ_ENDIO_RAID56) |
| 692 | btrfs_queue_worker(&fs_info->endio_raid56_workers, | 691 | btrfs_queue_work(fs_info->endio_raid56_workers, |
| 693 | &end_io_wq->work); | 692 | &end_io_wq->work); |
| 694 | else | 693 | else |
| 695 | btrfs_queue_worker(&fs_info->endio_write_workers, | 694 | btrfs_queue_work(fs_info->endio_write_workers, |
| 696 | &end_io_wq->work); | 695 | &end_io_wq->work); |
| 697 | } else { | 696 | } else { |
| 698 | if (end_io_wq->metadata == BTRFS_WQ_ENDIO_RAID56) | 697 | if (end_io_wq->metadata == BTRFS_WQ_ENDIO_RAID56) |
| 699 | btrfs_queue_worker(&fs_info->endio_raid56_workers, | 698 | btrfs_queue_work(fs_info->endio_raid56_workers, |
| 700 | &end_io_wq->work); | 699 | &end_io_wq->work); |
| 701 | else if (end_io_wq->metadata) | 700 | else if (end_io_wq->metadata) |
| 702 | btrfs_queue_worker(&fs_info->endio_meta_workers, | 701 | btrfs_queue_work(fs_info->endio_meta_workers, |
| 703 | &end_io_wq->work); | 702 | &end_io_wq->work); |
| 704 | else | 703 | else |
| 705 | btrfs_queue_worker(&fs_info->endio_workers, | 704 | btrfs_queue_work(fs_info->endio_workers, |
| 706 | &end_io_wq->work); | 705 | &end_io_wq->work); |
| 707 | } | 706 | } |
| 708 | } | 707 | } |
| 709 | 708 | ||
| @@ -738,7 +737,7 @@ int btrfs_bio_wq_end_io(struct btrfs_fs_info *info, struct bio *bio, | |||
| 738 | unsigned long btrfs_async_submit_limit(struct btrfs_fs_info *info) | 737 | unsigned long btrfs_async_submit_limit(struct btrfs_fs_info *info) |
| 739 | { | 738 | { |
| 740 | unsigned long limit = min_t(unsigned long, | 739 | unsigned long limit = min_t(unsigned long, |
| 741 | info->workers.max_workers, | 740 | info->thread_pool_size, |
| 742 | info->fs_devices->open_devices); | 741 | info->fs_devices->open_devices); |
| 743 | return 256 * limit; | 742 | return 256 * limit; |
| 744 | } | 743 | } |
| @@ -811,11 +810,9 @@ int btrfs_wq_submit_bio(struct btrfs_fs_info *fs_info, struct inode *inode, | |||
| 811 | async->submit_bio_start = submit_bio_start; | 810 | async->submit_bio_start = submit_bio_start; |
| 812 | async->submit_bio_done = submit_bio_done; | 811 | async->submit_bio_done = submit_bio_done; |
| 813 | 812 | ||
| 814 | async->work.func = run_one_async_start; | 813 | btrfs_init_work(&async->work, run_one_async_start, |
| 815 | async->work.ordered_func = run_one_async_done; | 814 | run_one_async_done, run_one_async_free); |
| 816 | async->work.ordered_free = run_one_async_free; | ||
| 817 | 815 | ||
| 818 | async->work.flags = 0; | ||
| 819 | async->bio_flags = bio_flags; | 816 | async->bio_flags = bio_flags; |
| 820 | async->bio_offset = bio_offset; | 817 | async->bio_offset = bio_offset; |
| 821 | 818 | ||
| @@ -824,9 +821,9 @@ int btrfs_wq_submit_bio(struct btrfs_fs_info *fs_info, struct inode *inode, | |||
| 824 | atomic_inc(&fs_info->nr_async_submits); | 821 | atomic_inc(&fs_info->nr_async_submits); |
| 825 | 822 | ||
| 826 | if (rw & REQ_SYNC) | 823 | if (rw & REQ_SYNC) |
| 827 | btrfs_set_work_high_prio(&async->work); | 824 | btrfs_set_work_high_priority(&async->work); |
| 828 | 825 | ||
| 829 | btrfs_queue_worker(&fs_info->workers, &async->work); | 826 | btrfs_queue_work(fs_info->workers, &async->work); |
| 830 | 827 | ||
| 831 | while (atomic_read(&fs_info->async_submit_draining) && | 828 | while (atomic_read(&fs_info->async_submit_draining) && |
| 832 | atomic_read(&fs_info->nr_async_submits)) { | 829 | atomic_read(&fs_info->nr_async_submits)) { |
| @@ -1149,6 +1146,32 @@ void clean_tree_block(struct btrfs_trans_handle *trans, struct btrfs_root *root, | |||
| 1149 | } | 1146 | } |
| 1150 | } | 1147 | } |
| 1151 | 1148 | ||
| 1149 | static struct btrfs_subvolume_writers *btrfs_alloc_subvolume_writers(void) | ||
| 1150 | { | ||
| 1151 | struct btrfs_subvolume_writers *writers; | ||
| 1152 | int ret; | ||
| 1153 | |||
| 1154 | writers = kmalloc(sizeof(*writers), GFP_NOFS); | ||
| 1155 | if (!writers) | ||
| 1156 | return ERR_PTR(-ENOMEM); | ||
| 1157 | |||
| 1158 | ret = percpu_counter_init(&writers->counter, 0); | ||
| 1159 | if (ret < 0) { | ||
| 1160 | kfree(writers); | ||
| 1161 | return ERR_PTR(ret); | ||
| 1162 | } | ||
| 1163 | |||
| 1164 | init_waitqueue_head(&writers->wait); | ||
| 1165 | return writers; | ||
| 1166 | } | ||
| 1167 | |||
| 1168 | static void | ||
| 1169 | btrfs_free_subvolume_writers(struct btrfs_subvolume_writers *writers) | ||
| 1170 | { | ||
| 1171 | percpu_counter_destroy(&writers->counter); | ||
| 1172 | kfree(writers); | ||
| 1173 | } | ||
| 1174 | |||
| 1152 | static void __setup_root(u32 nodesize, u32 leafsize, u32 sectorsize, | 1175 | static void __setup_root(u32 nodesize, u32 leafsize, u32 sectorsize, |
| 1153 | u32 stripesize, struct btrfs_root *root, | 1176 | u32 stripesize, struct btrfs_root *root, |
| 1154 | struct btrfs_fs_info *fs_info, | 1177 | struct btrfs_fs_info *fs_info, |
| @@ -1194,16 +1217,22 @@ static void __setup_root(u32 nodesize, u32 leafsize, u32 sectorsize, | |||
| 1194 | spin_lock_init(&root->log_extents_lock[1]); | 1217 | spin_lock_init(&root->log_extents_lock[1]); |
| 1195 | mutex_init(&root->objectid_mutex); | 1218 | mutex_init(&root->objectid_mutex); |
| 1196 | mutex_init(&root->log_mutex); | 1219 | mutex_init(&root->log_mutex); |
| 1220 | mutex_init(&root->ordered_extent_mutex); | ||
| 1221 | mutex_init(&root->delalloc_mutex); | ||
| 1197 | init_waitqueue_head(&root->log_writer_wait); | 1222 | init_waitqueue_head(&root->log_writer_wait); |
| 1198 | init_waitqueue_head(&root->log_commit_wait[0]); | 1223 | init_waitqueue_head(&root->log_commit_wait[0]); |
| 1199 | init_waitqueue_head(&root->log_commit_wait[1]); | 1224 | init_waitqueue_head(&root->log_commit_wait[1]); |
| 1225 | INIT_LIST_HEAD(&root->log_ctxs[0]); | ||
| 1226 | INIT_LIST_HEAD(&root->log_ctxs[1]); | ||
| 1200 | atomic_set(&root->log_commit[0], 0); | 1227 | atomic_set(&root->log_commit[0], 0); |
| 1201 | atomic_set(&root->log_commit[1], 0); | 1228 | atomic_set(&root->log_commit[1], 0); |
| 1202 | atomic_set(&root->log_writers, 0); | 1229 | atomic_set(&root->log_writers, 0); |
| 1203 | atomic_set(&root->log_batch, 0); | 1230 | atomic_set(&root->log_batch, 0); |
| 1204 | atomic_set(&root->orphan_inodes, 0); | 1231 | atomic_set(&root->orphan_inodes, 0); |
| 1205 | atomic_set(&root->refs, 1); | 1232 | atomic_set(&root->refs, 1); |
| 1233 | atomic_set(&root->will_be_snapshoted, 0); | ||
| 1206 | root->log_transid = 0; | 1234 | root->log_transid = 0; |
| 1235 | root->log_transid_committed = -1; | ||
| 1207 | root->last_log_commit = 0; | 1236 | root->last_log_commit = 0; |
| 1208 | if (fs_info) | 1237 | if (fs_info) |
| 1209 | extent_io_tree_init(&root->dirty_log_pages, | 1238 | extent_io_tree_init(&root->dirty_log_pages, |
| @@ -1417,6 +1446,7 @@ int btrfs_add_log_tree(struct btrfs_trans_handle *trans, | |||
| 1417 | WARN_ON(root->log_root); | 1446 | WARN_ON(root->log_root); |
| 1418 | root->log_root = log_root; | 1447 | root->log_root = log_root; |
| 1419 | root->log_transid = 0; | 1448 | root->log_transid = 0; |
| 1449 | root->log_transid_committed = -1; | ||
| 1420 | root->last_log_commit = 0; | 1450 | root->last_log_commit = 0; |
| 1421 | return 0; | 1451 | return 0; |
| 1422 | } | 1452 | } |
| @@ -1498,6 +1528,7 @@ struct btrfs_root *btrfs_read_fs_root(struct btrfs_root *tree_root, | |||
| 1498 | int btrfs_init_fs_root(struct btrfs_root *root) | 1528 | int btrfs_init_fs_root(struct btrfs_root *root) |
| 1499 | { | 1529 | { |
| 1500 | int ret; | 1530 | int ret; |
| 1531 | struct btrfs_subvolume_writers *writers; | ||
| 1501 | 1532 | ||
| 1502 | root->free_ino_ctl = kzalloc(sizeof(*root->free_ino_ctl), GFP_NOFS); | 1533 | root->free_ino_ctl = kzalloc(sizeof(*root->free_ino_ctl), GFP_NOFS); |
| 1503 | root->free_ino_pinned = kzalloc(sizeof(*root->free_ino_pinned), | 1534 | root->free_ino_pinned = kzalloc(sizeof(*root->free_ino_pinned), |
| @@ -1507,6 +1538,13 @@ int btrfs_init_fs_root(struct btrfs_root *root) | |||
| 1507 | goto fail; | 1538 | goto fail; |
| 1508 | } | 1539 | } |
| 1509 | 1540 | ||
| 1541 | writers = btrfs_alloc_subvolume_writers(); | ||
| 1542 | if (IS_ERR(writers)) { | ||
| 1543 | ret = PTR_ERR(writers); | ||
| 1544 | goto fail; | ||
| 1545 | } | ||
| 1546 | root->subv_writers = writers; | ||
| 1547 | |||
| 1510 | btrfs_init_free_ino_ctl(root); | 1548 | btrfs_init_free_ino_ctl(root); |
| 1511 | mutex_init(&root->fs_commit_mutex); | 1549 | mutex_init(&root->fs_commit_mutex); |
| 1512 | spin_lock_init(&root->cache_lock); | 1550 | spin_lock_init(&root->cache_lock); |
| @@ -1514,8 +1552,11 @@ int btrfs_init_fs_root(struct btrfs_root *root) | |||
| 1514 | 1552 | ||
| 1515 | ret = get_anon_bdev(&root->anon_dev); | 1553 | ret = get_anon_bdev(&root->anon_dev); |
| 1516 | if (ret) | 1554 | if (ret) |
| 1517 | goto fail; | 1555 | goto free_writers; |
| 1518 | return 0; | 1556 | return 0; |
| 1557 | |||
| 1558 | free_writers: | ||
| 1559 | btrfs_free_subvolume_writers(root->subv_writers); | ||
| 1519 | fail: | 1560 | fail: |
| 1520 | kfree(root->free_ino_ctl); | 1561 | kfree(root->free_ino_ctl); |
| 1521 | kfree(root->free_ino_pinned); | 1562 | kfree(root->free_ino_pinned); |
| @@ -1990,23 +2031,22 @@ static noinline int next_root_backup(struct btrfs_fs_info *info, | |||
| 1990 | /* helper to cleanup workers */ | 2031 | /* helper to cleanup workers */ |
| 1991 | static void btrfs_stop_all_workers(struct btrfs_fs_info *fs_info) | 2032 | static void btrfs_stop_all_workers(struct btrfs_fs_info *fs_info) |
| 1992 | { | 2033 | { |
| 1993 | btrfs_stop_workers(&fs_info->generic_worker); | 2034 | btrfs_destroy_workqueue(fs_info->fixup_workers); |
| 1994 | btrfs_stop_workers(&fs_info->fixup_workers); | 2035 | btrfs_destroy_workqueue(fs_info->delalloc_workers); |
| 1995 | btrfs_stop_workers(&fs_info->delalloc_workers); | 2036 | btrfs_destroy_workqueue(fs_info->workers); |
| 1996 | btrfs_stop_workers(&fs_info->workers); | 2037 | btrfs_destroy_workqueue(fs_info->endio_workers); |
| 1997 | btrfs_stop_workers(&fs_info->endio_workers); | 2038 | btrfs_destroy_workqueue(fs_info->endio_meta_workers); |
| 1998 | btrfs_stop_workers(&fs_info->endio_meta_workers); | 2039 | btrfs_destroy_workqueue(fs_info->endio_raid56_workers); |
| 1999 | btrfs_stop_workers(&fs_info->endio_raid56_workers); | 2040 | btrfs_destroy_workqueue(fs_info->rmw_workers); |
| 2000 | btrfs_stop_workers(&fs_info->rmw_workers); | 2041 | btrfs_destroy_workqueue(fs_info->endio_meta_write_workers); |
| 2001 | btrfs_stop_workers(&fs_info->endio_meta_write_workers); | 2042 | btrfs_destroy_workqueue(fs_info->endio_write_workers); |
| 2002 | btrfs_stop_workers(&fs_info->endio_write_workers); | 2043 | btrfs_destroy_workqueue(fs_info->endio_freespace_worker); |
| 2003 | btrfs_stop_workers(&fs_info->endio_freespace_worker); | 2044 | btrfs_destroy_workqueue(fs_info->submit_workers); |
| 2004 | btrfs_stop_workers(&fs_info->submit_workers); | 2045 | btrfs_destroy_workqueue(fs_info->delayed_workers); |
| 2005 | btrfs_stop_workers(&fs_info->delayed_workers); | 2046 | btrfs_destroy_workqueue(fs_info->caching_workers); |
| 2006 | btrfs_stop_workers(&fs_info->caching_workers); | 2047 | btrfs_destroy_workqueue(fs_info->readahead_workers); |
| 2007 | btrfs_stop_workers(&fs_info->readahead_workers); | 2048 | btrfs_destroy_workqueue(fs_info->flush_workers); |
| 2008 | btrfs_stop_workers(&fs_info->flush_workers); | 2049 | btrfs_destroy_workqueue(fs_info->qgroup_rescan_workers); |
| 2009 | btrfs_stop_workers(&fs_info->qgroup_rescan_workers); | ||
| 2010 | } | 2050 | } |
| 2011 | 2051 | ||
| 2012 | static void free_root_extent_buffers(struct btrfs_root *root) | 2052 | static void free_root_extent_buffers(struct btrfs_root *root) |
| @@ -2097,6 +2137,8 @@ int open_ctree(struct super_block *sb, | |||
| 2097 | int err = -EINVAL; | 2137 | int err = -EINVAL; |
| 2098 | int num_backups_tried = 0; | 2138 | int num_backups_tried = 0; |
| 2099 | int backup_index = 0; | 2139 | int backup_index = 0; |
| 2140 | int max_active; | ||
| 2141 | int flags = WQ_MEM_RECLAIM | WQ_FREEZABLE | WQ_UNBOUND; | ||
| 2100 | bool create_uuid_tree; | 2142 | bool create_uuid_tree; |
| 2101 | bool check_uuid_tree; | 2143 | bool check_uuid_tree; |
| 2102 | 2144 | ||
| @@ -2133,10 +2175,16 @@ int open_ctree(struct super_block *sb, | |||
| 2133 | goto fail_dirty_metadata_bytes; | 2175 | goto fail_dirty_metadata_bytes; |
| 2134 | } | 2176 | } |
| 2135 | 2177 | ||
| 2178 | ret = percpu_counter_init(&fs_info->bio_counter, 0); | ||
| 2179 | if (ret) { | ||
| 2180 | err = ret; | ||
| 2181 | goto fail_delalloc_bytes; | ||
| 2182 | } | ||
| 2183 | |||
| 2136 | fs_info->btree_inode = new_inode(sb); | 2184 | fs_info->btree_inode = new_inode(sb); |
| 2137 | if (!fs_info->btree_inode) { | 2185 | if (!fs_info->btree_inode) { |
| 2138 | err = -ENOMEM; | 2186 | err = -ENOMEM; |
| 2139 | goto fail_delalloc_bytes; | 2187 | goto fail_bio_counter; |
| 2140 | } | 2188 | } |
| 2141 | 2189 | ||
| 2142 | mapping_set_gfp_mask(fs_info->btree_inode->i_mapping, GFP_NOFS); | 2190 | mapping_set_gfp_mask(fs_info->btree_inode->i_mapping, GFP_NOFS); |
| @@ -2159,6 +2207,7 @@ int open_ctree(struct super_block *sb, | |||
| 2159 | spin_lock_init(&fs_info->buffer_lock); | 2207 | spin_lock_init(&fs_info->buffer_lock); |
| 2160 | rwlock_init(&fs_info->tree_mod_log_lock); | 2208 | rwlock_init(&fs_info->tree_mod_log_lock); |
| 2161 | mutex_init(&fs_info->reloc_mutex); | 2209 | mutex_init(&fs_info->reloc_mutex); |
| 2210 | mutex_init(&fs_info->delalloc_root_mutex); | ||
| 2162 | seqlock_init(&fs_info->profiles_lock); | 2211 | seqlock_init(&fs_info->profiles_lock); |
| 2163 | 2212 | ||
| 2164 | init_completion(&fs_info->kobj_unregister); | 2213 | init_completion(&fs_info->kobj_unregister); |
| @@ -2211,6 +2260,7 @@ int open_ctree(struct super_block *sb, | |||
| 2211 | atomic_set(&fs_info->scrub_pause_req, 0); | 2260 | atomic_set(&fs_info->scrub_pause_req, 0); |
| 2212 | atomic_set(&fs_info->scrubs_paused, 0); | 2261 | atomic_set(&fs_info->scrubs_paused, 0); |
| 2213 | atomic_set(&fs_info->scrub_cancel_req, 0); | 2262 | atomic_set(&fs_info->scrub_cancel_req, 0); |
| 2263 | init_waitqueue_head(&fs_info->replace_wait); | ||
| 2214 | init_waitqueue_head(&fs_info->scrub_pause_wait); | 2264 | init_waitqueue_head(&fs_info->scrub_pause_wait); |
| 2215 | fs_info->scrub_workers_refcnt = 0; | 2265 | fs_info->scrub_workers_refcnt = 0; |
| 2216 | #ifdef CONFIG_BTRFS_FS_CHECK_INTEGRITY | 2266 | #ifdef CONFIG_BTRFS_FS_CHECK_INTEGRITY |
| @@ -2458,104 +2508,68 @@ int open_ctree(struct super_block *sb, | |||
| 2458 | goto fail_alloc; | 2508 | goto fail_alloc; |
| 2459 | } | 2509 | } |
| 2460 | 2510 | ||
| 2461 | btrfs_init_workers(&fs_info->generic_worker, | 2511 | max_active = fs_info->thread_pool_size; |
| 2462 | "genwork", 1, NULL); | ||
| 2463 | |||
| 2464 | btrfs_init_workers(&fs_info->workers, "worker", | ||
| 2465 | fs_info->thread_pool_size, | ||
| 2466 | &fs_info->generic_worker); | ||
| 2467 | 2512 | ||
| 2468 | btrfs_init_workers(&fs_info->delalloc_workers, "delalloc", | 2513 | fs_info->workers = |
| 2469 | fs_info->thread_pool_size, NULL); | 2514 | btrfs_alloc_workqueue("worker", flags | WQ_HIGHPRI, |
| 2515 | max_active, 16); | ||
| 2470 | 2516 | ||
| 2471 | btrfs_init_workers(&fs_info->flush_workers, "flush_delalloc", | 2517 | fs_info->delalloc_workers = |
| 2472 | fs_info->thread_pool_size, NULL); | 2518 | btrfs_alloc_workqueue("delalloc", flags, max_active, 2); |
| 2473 | 2519 | ||
| 2474 | btrfs_init_workers(&fs_info->submit_workers, "submit", | 2520 | fs_info->flush_workers = |
| 2475 | min_t(u64, fs_devices->num_devices, | 2521 | btrfs_alloc_workqueue("flush_delalloc", flags, max_active, 0); |
| 2476 | fs_info->thread_pool_size), NULL); | ||
| 2477 | 2522 | ||
| 2478 | btrfs_init_workers(&fs_info->caching_workers, "cache", | 2523 | fs_info->caching_workers = |
| 2479 | fs_info->thread_pool_size, NULL); | 2524 | btrfs_alloc_workqueue("cache", flags, max_active, 0); |
| 2480 | 2525 | ||
| 2481 | /* a higher idle thresh on the submit workers makes it much more | 2526 | /* |
| 2527 | * a higher idle thresh on the submit workers makes it much more | ||
| 2482 | * likely that bios will be send down in a sane order to the | 2528 | * likely that bios will be send down in a sane order to the |
| 2483 | * devices | 2529 | * devices |
| 2484 | */ | 2530 | */ |
| 2485 | fs_info->submit_workers.idle_thresh = 64; | 2531 | fs_info->submit_workers = |
| 2486 | 2532 | btrfs_alloc_workqueue("submit", flags, | |
| 2487 | fs_info->workers.idle_thresh = 16; | 2533 | min_t(u64, fs_devices->num_devices, |
| 2488 | fs_info->workers.ordered = 1; | 2534 | max_active), 64); |
| 2489 | 2535 | ||
| 2490 | fs_info->delalloc_workers.idle_thresh = 2; | 2536 | fs_info->fixup_workers = |
| 2491 | fs_info->delalloc_workers.ordered = 1; | 2537 | btrfs_alloc_workqueue("fixup", flags, 1, 0); |
| 2492 | |||
| 2493 | btrfs_init_workers(&fs_info->fixup_workers, "fixup", 1, | ||
| 2494 | &fs_info->generic_worker); | ||
| 2495 | btrfs_init_workers(&fs_info->endio_workers, "endio", | ||
| 2496 | fs_info->thread_pool_size, | ||
| 2497 | &fs_info->generic_worker); | ||
| 2498 | btrfs_init_workers(&fs_info->endio_meta_workers, "endio-meta", | ||
| 2499 | fs_info->thread_pool_size, | ||
| 2500 | &fs_info->generic_worker); | ||
| 2501 | btrfs_init_workers(&fs_info->endio_meta_write_workers, | ||
| 2502 | "endio-meta-write", fs_info->thread_pool_size, | ||
| 2503 | &fs_info->generic_worker); | ||
| 2504 | btrfs_init_workers(&fs_info->endio_raid56_workers, | ||
| 2505 | "endio-raid56", fs_info->thread_pool_size, | ||
| 2506 | &fs_info->generic_worker); | ||
| 2507 | btrfs_init_workers(&fs_info->rmw_workers, | ||
| 2508 | "rmw", fs_info->thread_pool_size, | ||
| 2509 | &fs_info->generic_worker); | ||
| 2510 | btrfs_init_workers(&fs_info->endio_write_workers, "endio-write", | ||
| 2511 | fs_info->thread_pool_size, | ||
| 2512 | &fs_info->generic_worker); | ||
| 2513 | btrfs_init_workers(&fs_info->endio_freespace_worker, "freespace-write", | ||
| 2514 | 1, &fs_info->generic_worker); | ||
| 2515 | btrfs_init_workers(&fs_info->delayed_workers, "delayed-meta", | ||
| 2516 | fs_info->thread_pool_size, | ||
| 2517 | &fs_info->generic_worker); | ||
| 2518 | btrfs_init_workers(&fs_info->readahead_workers, "readahead", | ||
| 2519 | fs_info->thread_pool_size, | ||
| 2520 | &fs_info->generic_worker); | ||
| 2521 | btrfs_init_workers(&fs_info->qgroup_rescan_workers, "qgroup-rescan", 1, | ||
| 2522 | &fs_info->generic_worker); | ||
| 2523 | 2538 | ||
| 2524 | /* | 2539 | /* |
| 2525 | * endios are largely parallel and should have a very | 2540 | * endios are largely parallel and should have a very |
| 2526 | * low idle thresh | 2541 | * low idle thresh |
| 2527 | */ | 2542 | */ |
| 2528 | fs_info->endio_workers.idle_thresh = 4; | 2543 | fs_info->endio_workers = |
| 2529 | fs_info->endio_meta_workers.idle_thresh = 4; | 2544 | btrfs_alloc_workqueue("endio", flags, max_active, 4); |
| 2530 | fs_info->endio_raid56_workers.idle_thresh = 4; | 2545 | fs_info->endio_meta_workers = |
| 2531 | fs_info->rmw_workers.idle_thresh = 2; | 2546 | btrfs_alloc_workqueue("endio-meta", flags, max_active, 4); |
| 2532 | 2547 | fs_info->endio_meta_write_workers = | |
| 2533 | fs_info->endio_write_workers.idle_thresh = 2; | 2548 | btrfs_alloc_workqueue("endio-meta-write", flags, max_active, 2); |
| 2534 | fs_info->endio_meta_write_workers.idle_thresh = 2; | 2549 | fs_info->endio_raid56_workers = |
| 2535 | fs_info->readahead_workers.idle_thresh = 2; | 2550 | btrfs_alloc_workqueue("endio-raid56", flags, max_active, 4); |
| 2536 | 2551 | fs_info->rmw_workers = | |
| 2537 | /* | 2552 | btrfs_alloc_workqueue("rmw", flags, max_active, 2); |
| 2538 | * btrfs_start_workers can really only fail because of ENOMEM so just | 2553 | fs_info->endio_write_workers = |
| 2539 | * return -ENOMEM if any of these fail. | 2554 | btrfs_alloc_workqueue("endio-write", flags, max_active, 2); |
| 2540 | */ | 2555 | fs_info->endio_freespace_worker = |
| 2541 | ret = btrfs_start_workers(&fs_info->workers); | 2556 | btrfs_alloc_workqueue("freespace-write", flags, max_active, 0); |
| 2542 | ret |= btrfs_start_workers(&fs_info->generic_worker); | 2557 | fs_info->delayed_workers = |
| 2543 | ret |= btrfs_start_workers(&fs_info->submit_workers); | 2558 | btrfs_alloc_workqueue("delayed-meta", flags, max_active, 0); |
| 2544 | ret |= btrfs_start_workers(&fs_info->delalloc_workers); | 2559 | fs_info->readahead_workers = |
| 2545 | ret |= btrfs_start_workers(&fs_info->fixup_workers); | 2560 | btrfs_alloc_workqueue("readahead", flags, max_active, 2); |
| 2546 | ret |= btrfs_start_workers(&fs_info->endio_workers); | 2561 | fs_info->qgroup_rescan_workers = |
| 2547 | ret |= btrfs_start_workers(&fs_info->endio_meta_workers); | 2562 | btrfs_alloc_workqueue("qgroup-rescan", flags, 1, 0); |
| 2548 | ret |= btrfs_start_workers(&fs_info->rmw_workers); | 2563 | |
| 2549 | ret |= btrfs_start_workers(&fs_info->endio_raid56_workers); | 2564 | if (!(fs_info->workers && fs_info->delalloc_workers && |
| 2550 | ret |= btrfs_start_workers(&fs_info->endio_meta_write_workers); | 2565 | fs_info->submit_workers && fs_info->flush_workers && |
| 2551 | ret |= btrfs_start_workers(&fs_info->endio_write_workers); | 2566 | fs_info->endio_workers && fs_info->endio_meta_workers && |
| 2552 | ret |= btrfs_start_workers(&fs_info->endio_freespace_worker); | 2567 | fs_info->endio_meta_write_workers && |
| 2553 | ret |= btrfs_start_workers(&fs_info->delayed_workers); | 2568 | fs_info->endio_write_workers && fs_info->endio_raid56_workers && |
| 2554 | ret |= btrfs_start_workers(&fs_info->caching_workers); | 2569 | fs_info->endio_freespace_worker && fs_info->rmw_workers && |
| 2555 | ret |= btrfs_start_workers(&fs_info->readahead_workers); | 2570 | fs_info->caching_workers && fs_info->readahead_workers && |
| 2556 | ret |= btrfs_start_workers(&fs_info->flush_workers); | 2571 | fs_info->fixup_workers && fs_info->delayed_workers && |
| 2557 | ret |= btrfs_start_workers(&fs_info->qgroup_rescan_workers); | 2572 | fs_info->qgroup_rescan_workers)) { |
| 2558 | if (ret) { | ||
| 2559 | err = -ENOMEM; | 2573 | err = -ENOMEM; |
| 2560 | goto fail_sb_buffer; | 2574 | goto fail_sb_buffer; |
| 2561 | } | 2575 | } |
| @@ -2963,6 +2977,8 @@ fail_iput: | |||
| 2963 | btrfs_mapping_tree_free(&fs_info->mapping_tree); | 2977 | btrfs_mapping_tree_free(&fs_info->mapping_tree); |
| 2964 | 2978 | ||
| 2965 | iput(fs_info->btree_inode); | 2979 | iput(fs_info->btree_inode); |
| 2980 | fail_bio_counter: | ||
| 2981 | percpu_counter_destroy(&fs_info->bio_counter); | ||
| 2966 | fail_delalloc_bytes: | 2982 | fail_delalloc_bytes: |
| 2967 | percpu_counter_destroy(&fs_info->delalloc_bytes); | 2983 | percpu_counter_destroy(&fs_info->delalloc_bytes); |
| 2968 | fail_dirty_metadata_bytes: | 2984 | fail_dirty_metadata_bytes: |
| @@ -3244,6 +3260,8 @@ static int barrier_all_devices(struct btrfs_fs_info *info) | |||
| 3244 | /* send down all the barriers */ | 3260 | /* send down all the barriers */ |
| 3245 | head = &info->fs_devices->devices; | 3261 | head = &info->fs_devices->devices; |
| 3246 | list_for_each_entry_rcu(dev, head, dev_list) { | 3262 | list_for_each_entry_rcu(dev, head, dev_list) { |
| 3263 | if (dev->missing) | ||
| 3264 | continue; | ||
| 3247 | if (!dev->bdev) { | 3265 | if (!dev->bdev) { |
| 3248 | errors_send++; | 3266 | errors_send++; |
| 3249 | continue; | 3267 | continue; |
| @@ -3258,6 +3276,8 @@ static int barrier_all_devices(struct btrfs_fs_info *info) | |||
| 3258 | 3276 | ||
| 3259 | /* wait for all the barriers */ | 3277 | /* wait for all the barriers */ |
| 3260 | list_for_each_entry_rcu(dev, head, dev_list) { | 3278 | list_for_each_entry_rcu(dev, head, dev_list) { |
| 3279 | if (dev->missing) | ||
| 3280 | continue; | ||
| 3261 | if (!dev->bdev) { | 3281 | if (!dev->bdev) { |
| 3262 | errors_wait++; | 3282 | errors_wait++; |
| 3263 | continue; | 3283 | continue; |
| @@ -3477,6 +3497,8 @@ static void free_fs_root(struct btrfs_root *root) | |||
| 3477 | root->orphan_block_rsv = NULL; | 3497 | root->orphan_block_rsv = NULL; |
| 3478 | if (root->anon_dev) | 3498 | if (root->anon_dev) |
| 3479 | free_anon_bdev(root->anon_dev); | 3499 | free_anon_bdev(root->anon_dev); |
| 3500 | if (root->subv_writers) | ||
| 3501 | btrfs_free_subvolume_writers(root->subv_writers); | ||
| 3480 | free_extent_buffer(root->node); | 3502 | free_extent_buffer(root->node); |
| 3481 | free_extent_buffer(root->commit_root); | 3503 | free_extent_buffer(root->commit_root); |
| 3482 | kfree(root->free_ino_ctl); | 3504 | kfree(root->free_ino_ctl); |
| @@ -3610,6 +3632,7 @@ int close_ctree(struct btrfs_root *root) | |||
| 3610 | 3632 | ||
| 3611 | percpu_counter_destroy(&fs_info->dirty_metadata_bytes); | 3633 | percpu_counter_destroy(&fs_info->dirty_metadata_bytes); |
| 3612 | percpu_counter_destroy(&fs_info->delalloc_bytes); | 3634 | percpu_counter_destroy(&fs_info->delalloc_bytes); |
| 3635 | percpu_counter_destroy(&fs_info->bio_counter); | ||
| 3613 | bdi_destroy(&fs_info->bdi); | 3636 | bdi_destroy(&fs_info->bdi); |
| 3614 | cleanup_srcu_struct(&fs_info->subvol_srcu); | 3637 | cleanup_srcu_struct(&fs_info->subvol_srcu); |
| 3615 | 3638 | ||
| @@ -3791,9 +3814,11 @@ static void btrfs_destroy_all_ordered_extents(struct btrfs_fs_info *fs_info) | |||
| 3791 | list_move_tail(&root->ordered_root, | 3814 | list_move_tail(&root->ordered_root, |
| 3792 | &fs_info->ordered_roots); | 3815 | &fs_info->ordered_roots); |
| 3793 | 3816 | ||
| 3817 | spin_unlock(&fs_info->ordered_root_lock); | ||
| 3794 | btrfs_destroy_ordered_extents(root); | 3818 | btrfs_destroy_ordered_extents(root); |
| 3795 | 3819 | ||
| 3796 | cond_resched_lock(&fs_info->ordered_root_lock); | 3820 | cond_resched(); |
| 3821 | spin_lock(&fs_info->ordered_root_lock); | ||
| 3797 | } | 3822 | } |
| 3798 | spin_unlock(&fs_info->ordered_root_lock); | 3823 | spin_unlock(&fs_info->ordered_root_lock); |
| 3799 | } | 3824 | } |
