diff options
author | Chris Mason <chris.mason@oracle.com> | 2007-10-15 16:18:14 -0400 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2008-09-25 11:03:56 -0400 |
commit | 4dc119046d0d8501afa4346472917fb05586ad9c (patch) | |
tree | 712c98f8f66aa1e83020574a19d015df88c5024e /fs/btrfs/disk-io.c | |
parent | e19caa5f0e34b571ed0c2617554af5c43cb124d1 (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.c | 25 |
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 | ||
648 | int btrfs_buffer_uptodate(struct extent_buffer *buf) | 645 | int 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 | ||
654 | int btrfs_set_buffer_uptodate(struct extent_buffer *buf) | 651 | int 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 | ||
661 | void btrfs_mark_buffer_dirty(struct extent_buffer *buf) | 658 | void 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 | ||
682 | void btrfs_set_buffer_defrag(struct extent_buffer *buf) | 679 | void 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 | ||
690 | void btrfs_set_buffer_defrag_done(struct extent_buffer *buf) | 687 | void 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 | ||
699 | int btrfs_buffer_defrag(struct extent_buffer *buf) | 696 | int 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 | ||
707 | int btrfs_buffer_defrag_done(struct extent_buffer *buf) | 704 | int 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 | ||
716 | int btrfs_clear_buffer_defrag_done(struct extent_buffer *buf) | 713 | int 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 | ||
725 | int btrfs_clear_buffer_defrag(struct extent_buffer *buf) | 722 | int 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 | ||
734 | int btrfs_read_buffer(struct extent_buffer *buf) | 731 | int 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); |