aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/disk-io.c
diff options
context:
space:
mode:
authorChris Mason <chris.mason@oracle.com>2008-07-22 11:18:07 -0400
committerChris Mason <chris.mason@oracle.com>2008-09-25 11:04:05 -0400
commit6af118ce51b52ceda357c671550c79628b9c4a65 (patch)
treeb03fb64eb4567d1d1320a43f5d2142bc65193c18 /fs/btrfs/disk-io.c
parent4a09675279674041862d2210635b0cc1f60be28e (diff)
Btrfs: Index extent buffers in an rbtree
Before, extent buffers were a temporary object, meant to map a number of pages at once and collect operations on them. But, a few extra fields have crept in, and they are also the best place to store a per-tree block lock field as well. This commit puts the extent buffers into an rbtree, and ensures a single extent buffer for each tree block. Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/disk-io.c')
-rw-r--r--fs/btrfs/disk-io.c26
1 files changed, 9 insertions, 17 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index 99bb385c2982..86e84a8579e3 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -381,7 +381,6 @@ int btree_readpage_end_io_hook(struct page *page, u64 start, u64 end,
381 381
382 end = min_t(u64, eb->len, PAGE_CACHE_SIZE); 382 end = min_t(u64, eb->len, PAGE_CACHE_SIZE);
383 end = eb->start + end - 1; 383 end = eb->start + end - 1;
384 release_extent_buffer_tail_pages(eb);
385err: 384err:
386 free_extent_buffer(eb); 385 free_extent_buffer(eb);
387out: 386out:
@@ -563,21 +562,21 @@ static int btree_releasepage(struct page *page, gfp_t gfp_flags)
563 struct extent_map_tree *map; 562 struct extent_map_tree *map;
564 int ret; 563 int ret;
565 564
566 if (page_count(page) > 3) {
567 /* once for page->private, once for the caller, once
568 * once for the page cache
569 */
570 return 0;
571 }
572 tree = &BTRFS_I(page->mapping->host)->io_tree; 565 tree = &BTRFS_I(page->mapping->host)->io_tree;
573 map = &BTRFS_I(page->mapping->host)->extent_tree; 566 map = &BTRFS_I(page->mapping->host)->extent_tree;
567
574 ret = try_release_extent_state(map, tree, page, gfp_flags); 568 ret = try_release_extent_state(map, tree, page, gfp_flags);
569 if (!ret) {
570 return 0;
571 }
572
573 ret = try_release_extent_buffer(tree, page);
575 if (ret == 1) { 574 if (ret == 1) {
576 invalidate_extent_lru(tree, page_offset(page), PAGE_CACHE_SIZE);
577 ClearPagePrivate(page); 575 ClearPagePrivate(page);
578 set_page_private(page, 0); 576 set_page_private(page, 0);
579 page_cache_release(page); 577 page_cache_release(page);
580 } 578 }
579
581 return ret; 580 return ret;
582} 581}
583 582
@@ -588,7 +587,8 @@ static void btree_invalidatepage(struct page *page, unsigned long offset)
588 extent_invalidatepage(tree, page, offset); 587 extent_invalidatepage(tree, page, offset);
589 btree_releasepage(page, GFP_NOFS); 588 btree_releasepage(page, GFP_NOFS);
590 if (PagePrivate(page)) { 589 if (PagePrivate(page)) {
591 invalidate_extent_lru(tree, page_offset(page), PAGE_CACHE_SIZE); 590 printk("warning page private not zero on page %Lu\n",
591 page_offset(page));
592 ClearPagePrivate(page); 592 ClearPagePrivate(page);
593 set_page_private(page, 0); 593 set_page_private(page, 0);
594 page_cache_release(page); 594 page_cache_release(page);
@@ -1456,7 +1456,6 @@ fail_tree_root:
1456 free_extent_buffer(tree_root->node); 1456 free_extent_buffer(tree_root->node);
1457fail_sys_array: 1457fail_sys_array:
1458fail_sb_buffer: 1458fail_sb_buffer:
1459 extent_io_tree_empty_lru(&BTRFS_I(fs_info->btree_inode)->io_tree);
1460 btrfs_stop_workers(&fs_info->fixup_workers); 1459 btrfs_stop_workers(&fs_info->fixup_workers);
1461 btrfs_stop_workers(&fs_info->workers); 1460 btrfs_stop_workers(&fs_info->workers);
1462 btrfs_stop_workers(&fs_info->endio_workers); 1461 btrfs_stop_workers(&fs_info->endio_workers);
@@ -1705,13 +1704,6 @@ int close_ctree(struct btrfs_root *root)
1705 1704
1706 filemap_write_and_wait(fs_info->btree_inode->i_mapping); 1705 filemap_write_and_wait(fs_info->btree_inode->i_mapping);
1707 1706
1708 extent_io_tree_empty_lru(&fs_info->free_space_cache);
1709 extent_io_tree_empty_lru(&fs_info->block_group_cache);
1710 extent_io_tree_empty_lru(&fs_info->pinned_extents);
1711 extent_io_tree_empty_lru(&fs_info->pending_del);
1712 extent_io_tree_empty_lru(&fs_info->extent_ins);
1713 extent_io_tree_empty_lru(&BTRFS_I(fs_info->btree_inode)->io_tree);
1714
1715 truncate_inode_pages(fs_info->btree_inode->i_mapping, 0); 1707 truncate_inode_pages(fs_info->btree_inode->i_mapping, 0);
1716 1708
1717 btrfs_stop_workers(&fs_info->fixup_workers); 1709 btrfs_stop_workers(&fs_info->fixup_workers);