aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/disk-io.c
diff options
context:
space:
mode:
authorChris Mason <chris.mason@oracle.com>2007-10-15 16:18:14 -0400
committerChris Mason <chris.mason@oracle.com>2008-09-25 11:03:56 -0400
commit4dc119046d0d8501afa4346472917fb05586ad9c (patch)
tree712c98f8f66aa1e83020574a19d015df88c5024e /fs/btrfs/disk-io.c
parente19caa5f0e34b571ed0c2617554af5c43cb124d1 (diff)
Btrfs: Add an extent buffer LRU to reduce radix tree hits
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/disk-io.c')
-rw-r--r--fs/btrfs/disk-io.c25
1 files changed, 11 insertions, 14 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index 8e606e6658aa..fd7e6c182b9d 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -50,8 +50,6 @@ struct extent_buffer *btrfs_find_tree_block(struct btrfs_root *root,
50 struct extent_buffer *eb; 50 struct extent_buffer *eb;
51 eb = find_extent_buffer(&BTRFS_I(btree_inode)->extent_tree, 51 eb = find_extent_buffer(&BTRFS_I(btree_inode)->extent_tree,
52 bytenr, blocksize, GFP_NOFS); 52 bytenr, blocksize, GFP_NOFS);
53 if (eb)
54 eb->alloc_addr = (unsigned long)__builtin_return_address(0);
55 return eb; 53 return eb;
56} 54}
57 55
@@ -63,7 +61,6 @@ struct extent_buffer *btrfs_find_create_tree_block(struct btrfs_root *root,
63 61
64 eb = alloc_extent_buffer(&BTRFS_I(btree_inode)->extent_tree, 62 eb = alloc_extent_buffer(&BTRFS_I(btree_inode)->extent_tree,
65 bytenr, blocksize, GFP_NOFS); 63 bytenr, blocksize, GFP_NOFS);
66 eb->alloc_addr = (unsigned long)__builtin_return_address(0);
67 return eb; 64 return eb;
68} 65}
69 66
@@ -234,7 +231,6 @@ struct extent_buffer *read_tree_block(struct btrfs_root *root, u64 bytenr,
234 return NULL; 231 return NULL;
235 read_extent_buffer_pages(&BTRFS_I(btree_inode)->extent_tree, 232 read_extent_buffer_pages(&BTRFS_I(btree_inode)->extent_tree,
236 buf, 1); 233 buf, 1);
237 buf->alloc_addr = (unsigned long)__builtin_return_address(0);
238 return buf; 234 return buf;
239} 235}
240 236
@@ -638,6 +634,7 @@ int close_ctree(struct btrfs_root *root)
638 634
639 btrfs_free_block_groups(root->fs_info); 635 btrfs_free_block_groups(root->fs_info);
640 del_fs_roots(fs_info); 636 del_fs_roots(fs_info);
637 extent_map_tree_cleanup(&BTRFS_I(fs_info->btree_inode)->extent_tree);
641 truncate_inode_pages(fs_info->btree_inode->i_mapping, 0); 638 truncate_inode_pages(fs_info->btree_inode->i_mapping, 0);
642 iput(fs_info->btree_inode); 639 iput(fs_info->btree_inode);
643 kfree(fs_info->extent_root); 640 kfree(fs_info->extent_root);
@@ -647,20 +644,20 @@ int close_ctree(struct btrfs_root *root)
647 644
648int btrfs_buffer_uptodate(struct extent_buffer *buf) 645int btrfs_buffer_uptodate(struct extent_buffer *buf)
649{ 646{
650 struct inode *btree_inode = buf->pages[0]->mapping->host; 647 struct inode *btree_inode = buf->last_page->mapping->host;
651 return extent_buffer_uptodate(&BTRFS_I(btree_inode)->extent_tree, buf); 648 return extent_buffer_uptodate(&BTRFS_I(btree_inode)->extent_tree, buf);
652} 649}
653 650
654int btrfs_set_buffer_uptodate(struct extent_buffer *buf) 651int btrfs_set_buffer_uptodate(struct extent_buffer *buf)
655{ 652{
656 struct inode *btree_inode = buf->pages[0]->mapping->host; 653 struct inode *btree_inode = buf->last_page->mapping->host;
657 return set_extent_buffer_uptodate(&BTRFS_I(btree_inode)->extent_tree, 654 return set_extent_buffer_uptodate(&BTRFS_I(btree_inode)->extent_tree,
658 buf); 655 buf);
659} 656}
660 657
661void btrfs_mark_buffer_dirty(struct extent_buffer *buf) 658void btrfs_mark_buffer_dirty(struct extent_buffer *buf)
662{ 659{
663 struct btrfs_root *root = BTRFS_I(buf->pages[0]->mapping->host)->root; 660 struct btrfs_root *root = BTRFS_I(buf->last_page->mapping->host)->root;
664 u64 transid = btrfs_header_generation(buf); 661 u64 transid = btrfs_header_generation(buf);
665 struct inode *btree_inode = root->fs_info->btree_inode; 662 struct inode *btree_inode = root->fs_info->btree_inode;
666 663
@@ -681,7 +678,7 @@ void btrfs_btree_balance_dirty(struct btrfs_root *root, unsigned long nr)
681 678
682void btrfs_set_buffer_defrag(struct extent_buffer *buf) 679void btrfs_set_buffer_defrag(struct extent_buffer *buf)
683{ 680{
684 struct btrfs_root *root = BTRFS_I(buf->pages[0]->mapping->host)->root; 681 struct btrfs_root *root = BTRFS_I(buf->last_page->mapping->host)->root;
685 struct inode *btree_inode = root->fs_info->btree_inode; 682 struct inode *btree_inode = root->fs_info->btree_inode;
686 set_extent_bits(&BTRFS_I(btree_inode)->extent_tree, buf->start, 683 set_extent_bits(&BTRFS_I(btree_inode)->extent_tree, buf->start,
687 buf->start + buf->len - 1, EXTENT_DEFRAG, GFP_NOFS); 684 buf->start + buf->len - 1, EXTENT_DEFRAG, GFP_NOFS);
@@ -689,7 +686,7 @@ void btrfs_set_buffer_defrag(struct extent_buffer *buf)
689 686
690void btrfs_set_buffer_defrag_done(struct extent_buffer *buf) 687void btrfs_set_buffer_defrag_done(struct extent_buffer *buf)
691{ 688{
692 struct btrfs_root *root = BTRFS_I(buf->pages[0]->mapping->host)->root; 689 struct btrfs_root *root = BTRFS_I(buf->last_page->mapping->host)->root;
693 struct inode *btree_inode = root->fs_info->btree_inode; 690 struct inode *btree_inode = root->fs_info->btree_inode;
694 set_extent_bits(&BTRFS_I(btree_inode)->extent_tree, buf->start, 691 set_extent_bits(&BTRFS_I(btree_inode)->extent_tree, buf->start,
695 buf->start + buf->len - 1, EXTENT_DEFRAG_DONE, 692 buf->start + buf->len - 1, EXTENT_DEFRAG_DONE,
@@ -698,7 +695,7 @@ void btrfs_set_buffer_defrag_done(struct extent_buffer *buf)
698 695
699int btrfs_buffer_defrag(struct extent_buffer *buf) 696int btrfs_buffer_defrag(struct extent_buffer *buf)
700{ 697{
701 struct btrfs_root *root = BTRFS_I(buf->pages[0]->mapping->host)->root; 698 struct btrfs_root *root = BTRFS_I(buf->last_page->mapping->host)->root;
702 struct inode *btree_inode = root->fs_info->btree_inode; 699 struct inode *btree_inode = root->fs_info->btree_inode;
703 return test_range_bit(&BTRFS_I(btree_inode)->extent_tree, 700 return test_range_bit(&BTRFS_I(btree_inode)->extent_tree,
704 buf->start, buf->start + buf->len - 1, EXTENT_DEFRAG, 0); 701 buf->start, buf->start + buf->len - 1, EXTENT_DEFRAG, 0);
@@ -706,7 +703,7 @@ int btrfs_buffer_defrag(struct extent_buffer *buf)
706 703
707int btrfs_buffer_defrag_done(struct extent_buffer *buf) 704int btrfs_buffer_defrag_done(struct extent_buffer *buf)
708{ 705{
709 struct btrfs_root *root = BTRFS_I(buf->pages[0]->mapping->host)->root; 706 struct btrfs_root *root = BTRFS_I(buf->last_page->mapping->host)->root;
710 struct inode *btree_inode = root->fs_info->btree_inode; 707 struct inode *btree_inode = root->fs_info->btree_inode;
711 return test_range_bit(&BTRFS_I(btree_inode)->extent_tree, 708 return test_range_bit(&BTRFS_I(btree_inode)->extent_tree,
712 buf->start, buf->start + buf->len - 1, 709 buf->start, buf->start + buf->len - 1,
@@ -715,7 +712,7 @@ int btrfs_buffer_defrag_done(struct extent_buffer *buf)
715 712
716int btrfs_clear_buffer_defrag_done(struct extent_buffer *buf) 713int btrfs_clear_buffer_defrag_done(struct extent_buffer *buf)
717{ 714{
718 struct btrfs_root *root = BTRFS_I(buf->pages[0]->mapping->host)->root; 715 struct btrfs_root *root = BTRFS_I(buf->last_page->mapping->host)->root;
719 struct inode *btree_inode = root->fs_info->btree_inode; 716 struct inode *btree_inode = root->fs_info->btree_inode;
720 return clear_extent_bits(&BTRFS_I(btree_inode)->extent_tree, 717 return clear_extent_bits(&BTRFS_I(btree_inode)->extent_tree,
721 buf->start, buf->start + buf->len - 1, 718 buf->start, buf->start + buf->len - 1,
@@ -724,7 +721,7 @@ int btrfs_clear_buffer_defrag_done(struct extent_buffer *buf)
724 721
725int btrfs_clear_buffer_defrag(struct extent_buffer *buf) 722int btrfs_clear_buffer_defrag(struct extent_buffer *buf)
726{ 723{
727 struct btrfs_root *root = BTRFS_I(buf->pages[0]->mapping->host)->root; 724 struct btrfs_root *root = BTRFS_I(buf->last_page->mapping->host)->root;
728 struct inode *btree_inode = root->fs_info->btree_inode; 725 struct inode *btree_inode = root->fs_info->btree_inode;
729 return clear_extent_bits(&BTRFS_I(btree_inode)->extent_tree, 726 return clear_extent_bits(&BTRFS_I(btree_inode)->extent_tree,
730 buf->start, buf->start + buf->len - 1, 727 buf->start, buf->start + buf->len - 1,
@@ -733,7 +730,7 @@ int btrfs_clear_buffer_defrag(struct extent_buffer *buf)
733 730
734int btrfs_read_buffer(struct extent_buffer *buf) 731int btrfs_read_buffer(struct extent_buffer *buf)
735{ 732{
736 struct btrfs_root *root = BTRFS_I(buf->pages[0]->mapping->host)->root; 733 struct btrfs_root *root = BTRFS_I(buf->last_page->mapping->host)->root;
737 struct inode *btree_inode = root->fs_info->btree_inode; 734 struct inode *btree_inode = root->fs_info->btree_inode;
738 return read_extent_buffer_pages(&BTRFS_I(btree_inode)->extent_tree, 735 return read_extent_buffer_pages(&BTRFS_I(btree_inode)->extent_tree,
739 buf, 1); 736 buf, 1);