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.c30
1 files changed, 15 insertions, 15 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index 98ff4fbcb386..c6a710a668cb 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -1117,6 +1117,7 @@ struct btrfs_root *open_ctree(struct super_block *sb,
1117 GFP_NOFS); 1117 GFP_NOFS);
1118 int ret; 1118 int ret;
1119 int err = -EINVAL; 1119 int err = -EINVAL;
1120
1120 struct btrfs_super_block *disk_super; 1121 struct btrfs_super_block *disk_super;
1121 1122
1122 if (!extent_root || !tree_root || !fs_info) { 1123 if (!extent_root || !tree_root || !fs_info) {
@@ -1148,6 +1149,7 @@ struct btrfs_root *open_ctree(struct super_block *sb,
1148 fs_info->btree_inode = new_inode(sb); 1149 fs_info->btree_inode = new_inode(sb);
1149 fs_info->btree_inode->i_ino = 1; 1150 fs_info->btree_inode->i_ino = 1;
1150 fs_info->btree_inode->i_nlink = 1; 1151 fs_info->btree_inode->i_nlink = 1;
1152 fs_info->thread_pool_size = min(num_online_cpus() + 2, 8);
1151 1153
1152 sb->s_blocksize = 4096; 1154 sb->s_blocksize = 4096;
1153 sb->s_blocksize_bits = blksize_bits(4096); 1155 sb->s_blocksize_bits = blksize_bits(4096);
@@ -1195,19 +1197,6 @@ struct btrfs_root *open_ctree(struct super_block *sb,
1195 mutex_init(&fs_info->trans_mutex); 1197 mutex_init(&fs_info->trans_mutex);
1196 mutex_init(&fs_info->fs_mutex); 1198 mutex_init(&fs_info->fs_mutex);
1197 1199
1198 /* we need to start all the end_io workers up front because the
1199 * queue work function gets called at interrupt time. The endio
1200 * workers don't normally start IO, so some number of them <= the
1201 * number of cpus is fine. They handle checksumming after a read.
1202 *
1203 * The other worker threads do start IO, so the max is larger than
1204 * the number of CPUs. FIXME, tune this for huge machines
1205 */
1206 btrfs_init_workers(&fs_info->workers, num_online_cpus() * 2);
1207 btrfs_init_workers(&fs_info->endio_workers, num_online_cpus());
1208 btrfs_start_workers(&fs_info->workers, 1);
1209 btrfs_start_workers(&fs_info->endio_workers, num_online_cpus());
1210
1211#if 0 1200#if 0
1212 ret = add_hasher(fs_info, "crc32c"); 1201 ret = add_hasher(fs_info, "crc32c");
1213 if (ret) { 1202 if (ret) {
@@ -1238,6 +1227,17 @@ struct btrfs_root *open_ctree(struct super_block *sb,
1238 if (err) 1227 if (err)
1239 goto fail_sb_buffer; 1228 goto fail_sb_buffer;
1240 1229
1230 /*
1231 * we need to start all the end_io workers up front because the
1232 * queue work function gets called at interrupt time, and so it
1233 * cannot dynamically grow.
1234 */
1235 btrfs_init_workers(&fs_info->workers, fs_info->thread_pool_size);
1236 btrfs_init_workers(&fs_info->endio_workers, fs_info->thread_pool_size);
1237 btrfs_start_workers(&fs_info->workers, 1);
1238 btrfs_start_workers(&fs_info->endio_workers, fs_info->thread_pool_size);
1239
1240
1241 err = -EINVAL; 1241 err = -EINVAL;
1242 if (btrfs_super_num_devices(disk_super) > fs_devices->open_devices) { 1242 if (btrfs_super_num_devices(disk_super) > fs_devices->open_devices) {
1243 printk("Btrfs: wanted %llu devices, but found %llu\n", 1243 printk("Btrfs: wanted %llu devices, but found %llu\n",
@@ -1341,10 +1341,10 @@ fail_sys_array:
1341 mutex_unlock(&fs_info->fs_mutex); 1341 mutex_unlock(&fs_info->fs_mutex);
1342fail_sb_buffer: 1342fail_sb_buffer:
1343 extent_io_tree_empty_lru(&BTRFS_I(fs_info->btree_inode)->io_tree); 1343 extent_io_tree_empty_lru(&BTRFS_I(fs_info->btree_inode)->io_tree);
1344fail_iput:
1345 iput(fs_info->btree_inode);
1346 btrfs_stop_workers(&fs_info->workers); 1344 btrfs_stop_workers(&fs_info->workers);
1347 btrfs_stop_workers(&fs_info->endio_workers); 1345 btrfs_stop_workers(&fs_info->endio_workers);
1346fail_iput:
1347 iput(fs_info->btree_inode);
1348fail: 1348fail:
1349 btrfs_close_devices(fs_info->fs_devices); 1349 btrfs_close_devices(fs_info->fs_devices);
1350 btrfs_mapping_tree_free(&fs_info->mapping_tree); 1350 btrfs_mapping_tree_free(&fs_info->mapping_tree);