diff options
author | Chris Mason <chris.mason@oracle.com> | 2008-06-12 14:46:17 -0400 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2008-09-25 11:04:03 -0400 |
commit | 1cc127b5d1b71453091859301de4a7dd6ee96fa8 (patch) | |
tree | cb1280305a04eb5e6838f91781e668e3bdeed208 /fs/btrfs/disk-io.c | |
parent | df5b5520b21d8a2554ede65c09b288833c77144d (diff) |
Btrfs: Add a thread pool just for submit_bio
If a bio submission is after a lock holder waiting for the bio
on the work queue, it is possible to deadlock. Move the bios
into their own pool.
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/disk-io.c')
-rw-r--r-- | fs/btrfs/disk-io.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index c6a710a668cb..e5c758e306d5 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
@@ -1233,8 +1233,10 @@ struct btrfs_root *open_ctree(struct super_block *sb, | |||
1233 | * cannot dynamically grow. | 1233 | * cannot dynamically grow. |
1234 | */ | 1234 | */ |
1235 | btrfs_init_workers(&fs_info->workers, fs_info->thread_pool_size); | 1235 | btrfs_init_workers(&fs_info->workers, fs_info->thread_pool_size); |
1236 | btrfs_init_workers(&fs_info->submit_workers, fs_info->thread_pool_size); | ||
1236 | btrfs_init_workers(&fs_info->endio_workers, fs_info->thread_pool_size); | 1237 | 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->workers, 1); |
1239 | btrfs_start_workers(&fs_info->submit_workers, 1); | ||
1238 | btrfs_start_workers(&fs_info->endio_workers, fs_info->thread_pool_size); | 1240 | btrfs_start_workers(&fs_info->endio_workers, fs_info->thread_pool_size); |
1239 | 1241 | ||
1240 | 1242 | ||
@@ -1343,6 +1345,7 @@ fail_sb_buffer: | |||
1343 | extent_io_tree_empty_lru(&BTRFS_I(fs_info->btree_inode)->io_tree); | 1345 | extent_io_tree_empty_lru(&BTRFS_I(fs_info->btree_inode)->io_tree); |
1344 | btrfs_stop_workers(&fs_info->workers); | 1346 | btrfs_stop_workers(&fs_info->workers); |
1345 | btrfs_stop_workers(&fs_info->endio_workers); | 1347 | btrfs_stop_workers(&fs_info->endio_workers); |
1348 | btrfs_stop_workers(&fs_info->submit_workers); | ||
1346 | fail_iput: | 1349 | fail_iput: |
1347 | iput(fs_info->btree_inode); | 1350 | iput(fs_info->btree_inode); |
1348 | fail: | 1351 | fail: |
@@ -1597,6 +1600,7 @@ int close_ctree(struct btrfs_root *root) | |||
1597 | 1600 | ||
1598 | btrfs_stop_workers(&fs_info->workers); | 1601 | btrfs_stop_workers(&fs_info->workers); |
1599 | btrfs_stop_workers(&fs_info->endio_workers); | 1602 | btrfs_stop_workers(&fs_info->endio_workers); |
1603 | btrfs_stop_workers(&fs_info->submit_workers); | ||
1600 | 1604 | ||
1601 | iput(fs_info->btree_inode); | 1605 | iput(fs_info->btree_inode); |
1602 | #if 0 | 1606 | #if 0 |