diff options
| author | Ingo Molnar <mingo@elte.hu> | 2009-08-11 08:19:09 -0400 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2009-08-11 08:19:09 -0400 |
| commit | 89034bc2c7b839702c00a704e79d112737f98be0 (patch) | |
| tree | e65b1f3d4c751baa840efc81bc4734f089379eb3 /fs/btrfs/ctree.c | |
| parent | fb82ad719831db58e9baa4c67015aae3fe27e7e3 (diff) | |
| parent | 85dfd81dc57e8183a277ddd7a56aa65c96f3f487 (diff) | |
Merge branch 'linus' into tracing/core
Conflicts:
kernel/trace/trace_events_filter.c
We use the tracing/core version.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'fs/btrfs/ctree.c')
| -rw-r--r-- | fs/btrfs/ctree.c | 121 |
1 files changed, 68 insertions, 53 deletions
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c index 60a45f3a4e91..3fdcc0512d3a 100644 --- a/fs/btrfs/ctree.c +++ b/fs/btrfs/ctree.c | |||
| @@ -557,19 +557,7 @@ static int comp_keys(struct btrfs_disk_key *disk, struct btrfs_key *k2) | |||
| 557 | 557 | ||
| 558 | btrfs_disk_key_to_cpu(&k1, disk); | 558 | btrfs_disk_key_to_cpu(&k1, disk); |
| 559 | 559 | ||
| 560 | if (k1.objectid > k2->objectid) | 560 | return btrfs_comp_cpu_keys(&k1, k2); |
| 561 | return 1; | ||
| 562 | if (k1.objectid < k2->objectid) | ||
| 563 | return -1; | ||
| 564 | if (k1.type > k2->type) | ||
| 565 | return 1; | ||
| 566 | if (k1.type < k2->type) | ||
| 567 | return -1; | ||
| 568 | if (k1.offset > k2->offset) | ||
| 569 | return 1; | ||
| 570 | if (k1.offset < k2->offset) | ||
| 571 | return -1; | ||
| 572 | return 0; | ||
| 573 | } | 561 | } |
| 574 | 562 | ||
| 575 | /* | 563 | /* |
| @@ -1052,9 +1040,6 @@ static noinline int balance_level(struct btrfs_trans_handle *trans, | |||
| 1052 | BTRFS_NODEPTRS_PER_BLOCK(root) / 4) | 1040 | BTRFS_NODEPTRS_PER_BLOCK(root) / 4) |
| 1053 | return 0; | 1041 | return 0; |
| 1054 | 1042 | ||
| 1055 | if (btrfs_header_nritems(mid) > 2) | ||
| 1056 | return 0; | ||
| 1057 | |||
| 1058 | if (btrfs_header_nritems(mid) < 2) | 1043 | if (btrfs_header_nritems(mid) < 2) |
| 1059 | err_on_enospc = 1; | 1044 | err_on_enospc = 1; |
| 1060 | 1045 | ||
| @@ -1701,6 +1686,7 @@ int btrfs_search_slot(struct btrfs_trans_handle *trans, struct btrfs_root | |||
| 1701 | struct extent_buffer *b; | 1686 | struct extent_buffer *b; |
| 1702 | int slot; | 1687 | int slot; |
| 1703 | int ret; | 1688 | int ret; |
| 1689 | int err; | ||
| 1704 | int level; | 1690 | int level; |
| 1705 | int lowest_unlock = 1; | 1691 | int lowest_unlock = 1; |
| 1706 | u8 lowest_level = 0; | 1692 | u8 lowest_level = 0; |
| @@ -1737,8 +1723,6 @@ again: | |||
| 1737 | p->locks[level] = 1; | 1723 | p->locks[level] = 1; |
| 1738 | 1724 | ||
| 1739 | if (cow) { | 1725 | if (cow) { |
| 1740 | int wret; | ||
| 1741 | |||
| 1742 | /* | 1726 | /* |
| 1743 | * if we don't really need to cow this block | 1727 | * if we don't really need to cow this block |
| 1744 | * then we don't want to set the path blocking, | 1728 | * then we don't want to set the path blocking, |
| @@ -1749,12 +1733,12 @@ again: | |||
| 1749 | 1733 | ||
| 1750 | btrfs_set_path_blocking(p); | 1734 | btrfs_set_path_blocking(p); |
| 1751 | 1735 | ||
| 1752 | wret = btrfs_cow_block(trans, root, b, | 1736 | err = btrfs_cow_block(trans, root, b, |
| 1753 | p->nodes[level + 1], | 1737 | p->nodes[level + 1], |
| 1754 | p->slots[level + 1], &b); | 1738 | p->slots[level + 1], &b); |
| 1755 | if (wret) { | 1739 | if (err) { |
| 1756 | free_extent_buffer(b); | 1740 | free_extent_buffer(b); |
| 1757 | ret = wret; | 1741 | ret = err; |
| 1758 | goto done; | 1742 | goto done; |
| 1759 | } | 1743 | } |
| 1760 | } | 1744 | } |
| @@ -1793,41 +1777,45 @@ cow_done: | |||
| 1793 | ret = bin_search(b, key, level, &slot); | 1777 | ret = bin_search(b, key, level, &slot); |
| 1794 | 1778 | ||
| 1795 | if (level != 0) { | 1779 | if (level != 0) { |
| 1796 | if (ret && slot > 0) | 1780 | int dec = 0; |
| 1781 | if (ret && slot > 0) { | ||
| 1782 | dec = 1; | ||
| 1797 | slot -= 1; | 1783 | slot -= 1; |
| 1784 | } | ||
| 1798 | p->slots[level] = slot; | 1785 | p->slots[level] = slot; |
| 1799 | ret = setup_nodes_for_search(trans, root, p, b, level, | 1786 | err = setup_nodes_for_search(trans, root, p, b, level, |
| 1800 | ins_len); | 1787 | ins_len); |
| 1801 | if (ret == -EAGAIN) | 1788 | if (err == -EAGAIN) |
| 1802 | goto again; | 1789 | goto again; |
| 1803 | else if (ret) | 1790 | if (err) { |
| 1791 | ret = err; | ||
| 1804 | goto done; | 1792 | goto done; |
| 1793 | } | ||
| 1805 | b = p->nodes[level]; | 1794 | b = p->nodes[level]; |
| 1806 | slot = p->slots[level]; | 1795 | slot = p->slots[level]; |
| 1807 | 1796 | ||
| 1808 | unlock_up(p, level, lowest_unlock); | 1797 | unlock_up(p, level, lowest_unlock); |
| 1809 | 1798 | ||
| 1810 | /* this is only true while dropping a snapshot */ | ||
| 1811 | if (level == lowest_level) { | 1799 | if (level == lowest_level) { |
| 1812 | ret = 0; | 1800 | if (dec) |
| 1801 | p->slots[level]++; | ||
| 1813 | goto done; | 1802 | goto done; |
| 1814 | } | 1803 | } |
| 1815 | 1804 | ||
| 1816 | ret = read_block_for_search(trans, root, p, | 1805 | err = read_block_for_search(trans, root, p, |
| 1817 | &b, level, slot, key); | 1806 | &b, level, slot, key); |
| 1818 | if (ret == -EAGAIN) | 1807 | if (err == -EAGAIN) |
| 1819 | goto again; | 1808 | goto again; |
| 1820 | 1809 | if (err) { | |
| 1821 | if (ret == -EIO) | 1810 | ret = err; |
| 1822 | goto done; | 1811 | goto done; |
| 1812 | } | ||
| 1823 | 1813 | ||
| 1824 | if (!p->skip_locking) { | 1814 | if (!p->skip_locking) { |
| 1825 | int lret; | ||
| 1826 | |||
| 1827 | btrfs_clear_path_blocking(p, NULL); | 1815 | btrfs_clear_path_blocking(p, NULL); |
| 1828 | lret = btrfs_try_spin_lock(b); | 1816 | err = btrfs_try_spin_lock(b); |
| 1829 | 1817 | ||
| 1830 | if (!lret) { | 1818 | if (!err) { |
| 1831 | btrfs_set_path_blocking(p); | 1819 | btrfs_set_path_blocking(p); |
| 1832 | btrfs_tree_lock(b); | 1820 | btrfs_tree_lock(b); |
| 1833 | btrfs_clear_path_blocking(p, b); | 1821 | btrfs_clear_path_blocking(p, b); |
| @@ -1837,16 +1825,14 @@ cow_done: | |||
| 1837 | p->slots[level] = slot; | 1825 | p->slots[level] = slot; |
| 1838 | if (ins_len > 0 && | 1826 | if (ins_len > 0 && |
| 1839 | btrfs_leaf_free_space(root, b) < ins_len) { | 1827 | btrfs_leaf_free_space(root, b) < ins_len) { |
| 1840 | int sret; | ||
| 1841 | |||
| 1842 | btrfs_set_path_blocking(p); | 1828 | btrfs_set_path_blocking(p); |
| 1843 | sret = split_leaf(trans, root, key, | 1829 | err = split_leaf(trans, root, key, |
| 1844 | p, ins_len, ret == 0); | 1830 | p, ins_len, ret == 0); |
| 1845 | btrfs_clear_path_blocking(p, NULL); | 1831 | btrfs_clear_path_blocking(p, NULL); |
| 1846 | 1832 | ||
| 1847 | BUG_ON(sret > 0); | 1833 | BUG_ON(err > 0); |
| 1848 | if (sret) { | 1834 | if (err) { |
| 1849 | ret = sret; | 1835 | ret = err; |
| 1850 | goto done; | 1836 | goto done; |
| 1851 | } | 1837 | } |
| 1852 | } | 1838 | } |
| @@ -3807,7 +3793,7 @@ int btrfs_del_items(struct btrfs_trans_handle *trans, struct btrfs_root *root, | |||
| 3807 | } | 3793 | } |
| 3808 | 3794 | ||
| 3809 | /* delete the leaf if it is mostly empty */ | 3795 | /* delete the leaf if it is mostly empty */ |
| 3810 | if (used < BTRFS_LEAF_DATA_SIZE(root) / 2) { | 3796 | if (used < BTRFS_LEAF_DATA_SIZE(root) / 3) { |
| 3811 | /* push_leaf_left fixes the path. | 3797 | /* push_leaf_left fixes the path. |
| 3812 | * make sure the path still points to our leaf | 3798 | * make sure the path still points to our leaf |
| 3813 | * for possible call to del_ptr below | 3799 | * for possible call to del_ptr below |
| @@ -4042,10 +4028,9 @@ out: | |||
| 4042 | * calling this function. | 4028 | * calling this function. |
| 4043 | */ | 4029 | */ |
| 4044 | int btrfs_find_next_key(struct btrfs_root *root, struct btrfs_path *path, | 4030 | int btrfs_find_next_key(struct btrfs_root *root, struct btrfs_path *path, |
| 4045 | struct btrfs_key *key, int lowest_level, | 4031 | struct btrfs_key *key, int level, |
| 4046 | int cache_only, u64 min_trans) | 4032 | int cache_only, u64 min_trans) |
| 4047 | { | 4033 | { |
| 4048 | int level = lowest_level; | ||
| 4049 | int slot; | 4034 | int slot; |
| 4050 | struct extent_buffer *c; | 4035 | struct extent_buffer *c; |
| 4051 | 4036 | ||
| @@ -4058,11 +4043,40 @@ int btrfs_find_next_key(struct btrfs_root *root, struct btrfs_path *path, | |||
| 4058 | c = path->nodes[level]; | 4043 | c = path->nodes[level]; |
| 4059 | next: | 4044 | next: |
| 4060 | if (slot >= btrfs_header_nritems(c)) { | 4045 | if (slot >= btrfs_header_nritems(c)) { |
| 4061 | level++; | 4046 | int ret; |
| 4062 | if (level == BTRFS_MAX_LEVEL) | 4047 | int orig_lowest; |
| 4048 | struct btrfs_key cur_key; | ||
| 4049 | if (level + 1 >= BTRFS_MAX_LEVEL || | ||
| 4050 | !path->nodes[level + 1]) | ||
| 4063 | return 1; | 4051 | return 1; |
| 4064 | continue; | 4052 | |
| 4053 | if (path->locks[level + 1]) { | ||
| 4054 | level++; | ||
| 4055 | continue; | ||
| 4056 | } | ||
| 4057 | |||
| 4058 | slot = btrfs_header_nritems(c) - 1; | ||
| 4059 | if (level == 0) | ||
| 4060 | btrfs_item_key_to_cpu(c, &cur_key, slot); | ||
| 4061 | else | ||
| 4062 | btrfs_node_key_to_cpu(c, &cur_key, slot); | ||
| 4063 | |||
| 4064 | orig_lowest = path->lowest_level; | ||
| 4065 | btrfs_release_path(root, path); | ||
| 4066 | path->lowest_level = level; | ||
| 4067 | ret = btrfs_search_slot(NULL, root, &cur_key, path, | ||
| 4068 | 0, 0); | ||
| 4069 | path->lowest_level = orig_lowest; | ||
| 4070 | if (ret < 0) | ||
| 4071 | return ret; | ||
| 4072 | |||
| 4073 | c = path->nodes[level]; | ||
| 4074 | slot = path->slots[level]; | ||
| 4075 | if (ret == 0) | ||
| 4076 | slot++; | ||
| 4077 | goto next; | ||
| 4065 | } | 4078 | } |
| 4079 | |||
| 4066 | if (level == 0) | 4080 | if (level == 0) |
| 4067 | btrfs_item_key_to_cpu(c, key, slot); | 4081 | btrfs_item_key_to_cpu(c, key, slot); |
| 4068 | else { | 4082 | else { |
| @@ -4146,7 +4160,8 @@ again: | |||
| 4146 | * advance the path if there are now more items available. | 4160 | * advance the path if there are now more items available. |
| 4147 | */ | 4161 | */ |
| 4148 | if (nritems > 0 && path->slots[0] < nritems - 1) { | 4162 | if (nritems > 0 && path->slots[0] < nritems - 1) { |
| 4149 | path->slots[0]++; | 4163 | if (ret == 0) |
| 4164 | path->slots[0]++; | ||
| 4150 | ret = 0; | 4165 | ret = 0; |
| 4151 | goto done; | 4166 | goto done; |
| 4152 | } | 4167 | } |
| @@ -4278,10 +4293,10 @@ int btrfs_previous_item(struct btrfs_root *root, | |||
| 4278 | path->slots[0]--; | 4293 | path->slots[0]--; |
| 4279 | 4294 | ||
| 4280 | btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]); | 4295 | btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]); |
| 4281 | if (found_key.type == type) | ||
| 4282 | return 0; | ||
| 4283 | if (found_key.objectid < min_objectid) | 4296 | if (found_key.objectid < min_objectid) |
| 4284 | break; | 4297 | break; |
| 4298 | if (found_key.type == type) | ||
| 4299 | return 0; | ||
| 4285 | if (found_key.objectid == min_objectid && | 4300 | if (found_key.objectid == min_objectid && |
| 4286 | found_key.type < type) | 4301 | found_key.type < type) |
| 4287 | break; | 4302 | break; |
