aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/disk-io.c
diff options
context:
space:
mode:
authorChris Mason <chris.mason@oracle.com>2009-09-11 19:07:25 -0400
committerChris Mason <chris.mason@oracle.com>2009-09-11 19:07:25 -0400
commit83ebade34bc1a90d0c3f77b87b940f336d075fda (patch)
tree99b6366c52e6bec88119ae995399c985fc61e900 /fs/btrfs/disk-io.c
parent74fca6a42863ffacaf7ba6f1936a9f228950f657 (diff)
parent93c82d575055f1bd0277acae6f966bebafd80dd5 (diff)
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable
Diffstat (limited to 'fs/btrfs/disk-io.c')
-rw-r--r--fs/btrfs/disk-io.c36
1 files changed, 19 insertions, 17 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index e83be2e4602c..253da7e01ab3 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -123,15 +123,15 @@ static struct extent_map *btree_get_extent(struct inode *inode,
123 struct extent_map *em; 123 struct extent_map *em;
124 int ret; 124 int ret;
125 125
126 spin_lock(&em_tree->lock); 126 read_lock(&em_tree->lock);
127 em = lookup_extent_mapping(em_tree, start, len); 127 em = lookup_extent_mapping(em_tree, start, len);
128 if (em) { 128 if (em) {
129 em->bdev = 129 em->bdev =
130 BTRFS_I(inode)->root->fs_info->fs_devices->latest_bdev; 130 BTRFS_I(inode)->root->fs_info->fs_devices->latest_bdev;
131 spin_unlock(&em_tree->lock); 131 read_unlock(&em_tree->lock);
132 goto out; 132 goto out;
133 } 133 }
134 spin_unlock(&em_tree->lock); 134 read_unlock(&em_tree->lock);
135 135
136 em = alloc_extent_map(GFP_NOFS); 136 em = alloc_extent_map(GFP_NOFS);
137 if (!em) { 137 if (!em) {
@@ -144,7 +144,7 @@ static struct extent_map *btree_get_extent(struct inode *inode,
144 em->block_start = 0; 144 em->block_start = 0;
145 em->bdev = BTRFS_I(inode)->root->fs_info->fs_devices->latest_bdev; 145 em->bdev = BTRFS_I(inode)->root->fs_info->fs_devices->latest_bdev;
146 146
147 spin_lock(&em_tree->lock); 147 write_lock(&em_tree->lock);
148 ret = add_extent_mapping(em_tree, em); 148 ret = add_extent_mapping(em_tree, em);
149 if (ret == -EEXIST) { 149 if (ret == -EEXIST) {
150 u64 failed_start = em->start; 150 u64 failed_start = em->start;
@@ -163,7 +163,7 @@ static struct extent_map *btree_get_extent(struct inode *inode,
163 free_extent_map(em); 163 free_extent_map(em);
164 em = NULL; 164 em = NULL;
165 } 165 }
166 spin_unlock(&em_tree->lock); 166 write_unlock(&em_tree->lock);
167 167
168 if (ret) 168 if (ret)
169 em = ERR_PTR(ret); 169 em = ERR_PTR(ret);
@@ -1325,9 +1325,9 @@ static void btrfs_unplug_io_fn(struct backing_dev_info *bdi, struct page *page)
1325 offset = page_offset(page); 1325 offset = page_offset(page);
1326 1326
1327 em_tree = &BTRFS_I(inode)->extent_tree; 1327 em_tree = &BTRFS_I(inode)->extent_tree;
1328 spin_lock(&em_tree->lock); 1328 read_lock(&em_tree->lock);
1329 em = lookup_extent_mapping(em_tree, offset, PAGE_CACHE_SIZE); 1329 em = lookup_extent_mapping(em_tree, offset, PAGE_CACHE_SIZE);
1330 spin_unlock(&em_tree->lock); 1330 read_unlock(&em_tree->lock);
1331 if (!em) { 1331 if (!em) {
1332 __unplug_io_fn(bdi, page); 1332 __unplug_io_fn(bdi, page);
1333 return; 1333 return;
@@ -1698,7 +1698,7 @@ struct btrfs_root *open_ctree(struct super_block *sb,
1698 err = -EINVAL; 1698 err = -EINVAL;
1699 goto fail_iput; 1699 goto fail_iput;
1700 } 1700 }
1701 1701printk("thread pool is %d\n", fs_info->thread_pool_size);
1702 /* 1702 /*
1703 * we need to start all the end_io workers up front because the 1703 * we need to start all the end_io workers up front because the
1704 * queue work function gets called at interrupt time, and so it 1704 * queue work function gets called at interrupt time, and so it
@@ -1743,20 +1743,22 @@ struct btrfs_root *open_ctree(struct super_block *sb,
1743 fs_info->endio_workers.idle_thresh = 4; 1743 fs_info->endio_workers.idle_thresh = 4;
1744 fs_info->endio_meta_workers.idle_thresh = 4; 1744 fs_info->endio_meta_workers.idle_thresh = 4;
1745 1745
1746 fs_info->endio_write_workers.idle_thresh = 64; 1746 fs_info->endio_write_workers.idle_thresh = 2;
1747 fs_info->endio_meta_write_workers.idle_thresh = 64; 1747 fs_info->endio_meta_write_workers.idle_thresh = 2;
1748
1749 fs_info->endio_workers.atomic_worker_start = 1;
1750 fs_info->endio_meta_workers.atomic_worker_start = 1;
1751 fs_info->endio_write_workers.atomic_worker_start = 1;
1752 fs_info->endio_meta_write_workers.atomic_worker_start = 1;
1748 1753
1749 btrfs_start_workers(&fs_info->workers, 1); 1754 btrfs_start_workers(&fs_info->workers, 1);
1750 btrfs_start_workers(&fs_info->submit_workers, 1); 1755 btrfs_start_workers(&fs_info->submit_workers, 1);
1751 btrfs_start_workers(&fs_info->delalloc_workers, 1); 1756 btrfs_start_workers(&fs_info->delalloc_workers, 1);
1752 btrfs_start_workers(&fs_info->fixup_workers, 1); 1757 btrfs_start_workers(&fs_info->fixup_workers, 1);
1753 btrfs_start_workers(&fs_info->endio_workers, fs_info->thread_pool_size); 1758 btrfs_start_workers(&fs_info->endio_workers, 1);
1754 btrfs_start_workers(&fs_info->endio_meta_workers, 1759 btrfs_start_workers(&fs_info->endio_meta_workers, 1);
1755 fs_info->thread_pool_size); 1760 btrfs_start_workers(&fs_info->endio_meta_write_workers, 1);
1756 btrfs_start_workers(&fs_info->endio_meta_write_workers, 1761 btrfs_start_workers(&fs_info->endio_write_workers, 1);
1757 fs_info->thread_pool_size);
1758 btrfs_start_workers(&fs_info->endio_write_workers,
1759 fs_info->thread_pool_size);
1760 1762
1761 fs_info->bdi.ra_pages *= btrfs_super_num_devices(disk_super); 1763 fs_info->bdi.ra_pages *= btrfs_super_num_devices(disk_super);
1762 fs_info->bdi.ra_pages = max(fs_info->bdi.ra_pages, 1764 fs_info->bdi.ra_pages = max(fs_info->bdi.ra_pages,