diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-07-28 17:27:06 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-07-28 17:27:06 -0400 |
| commit | 655c5d8fc110a9d4f90cc831bd009936f3e8df28 (patch) | |
| tree | 6acb038a6dd8831830d8ae2f5485a4e411d0b579 | |
| parent | ce4adcc6e5320062e0d993eb75152d165aaabbe6 (diff) | |
| parent | f25784b35f590c81d5fb8245a8cd45e1afb6f1b2 (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable
* git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable: (22 commits)
Btrfs: Fix async caching interaction with unmount
Btrfs: change how we unpin extents
Btrfs: Correct redundant test in add_inode_ref
Btrfs: find smallest available device extent during chunk allocation
Btrfs: clear all space_info->full after removing a block group
Btrfs: make flushoncommit mount option correctly wait on ordered_extents
Btrfs: Avoid delayed reference update looping
Btrfs: Fix ordering of key field checks in btrfs_previous_item
Btrfs: find_free_dev_extent doesn't handle holes at the start of the device
Btrfs: Remove code duplication in comp_keys
Btrfs: async block group caching
Btrfs: use hybrid extents+bitmap rb tree for free space
Btrfs: Fix crash on read failures at mount
Btrfs: remove of redundant btrfs_header_level
Btrfs: adjust NULL test
Btrfs: Remove broken sanity check from btrfs_rmap_block()
Btrfs: convert nested spin_lock_irqsave to spin_lock
Btrfs: make sure all dirty blocks are written at commit time
Btrfs: fix locking issue in btrfs_find_next_key
Btrfs: fix double increment of path->slots[0] in btrfs_next_leaf
...
| -rw-r--r-- | fs/btrfs/async-thread.c | 4 | ||||
| -rw-r--r-- | fs/btrfs/ctree.c | 121 | ||||
| -rw-r--r-- | fs/btrfs/ctree.h | 29 | ||||
| -rw-r--r-- | fs/btrfs/disk-io.c | 15 | ||||
| -rw-r--r-- | fs/btrfs/extent-tree.c | 516 | ||||
| -rw-r--r-- | fs/btrfs/free-space-cache.c | 1003 | ||||
| -rw-r--r-- | fs/btrfs/free-space-cache.h | 8 | ||||
| -rw-r--r-- | fs/btrfs/inode.c | 2 | ||||
| -rw-r--r-- | fs/btrfs/print-tree.c | 6 | ||||
| -rw-r--r-- | fs/btrfs/relocation.c | 3 | ||||
| -rw-r--r-- | fs/btrfs/transaction.c | 40 | ||||
| -rw-r--r-- | fs/btrfs/tree-log.c | 2 | ||||
| -rw-r--r-- | fs/btrfs/volumes.c | 46 |
13 files changed, 1343 insertions, 452 deletions
diff --git a/fs/btrfs/async-thread.c b/fs/btrfs/async-thread.c index 6e4f6c50a120..019e8af449ab 100644 --- a/fs/btrfs/async-thread.c +++ b/fs/btrfs/async-thread.c | |||
| @@ -424,11 +424,11 @@ int btrfs_requeue_work(struct btrfs_work *work) | |||
| 424 | * list | 424 | * list |
| 425 | */ | 425 | */ |
| 426 | if (worker->idle) { | 426 | if (worker->idle) { |
| 427 | spin_lock_irqsave(&worker->workers->lock, flags); | 427 | spin_lock(&worker->workers->lock); |
| 428 | worker->idle = 0; | 428 | worker->idle = 0; |
| 429 | list_move_tail(&worker->worker_list, | 429 | list_move_tail(&worker->worker_list, |
| 430 | &worker->workers->worker_list); | 430 | &worker->workers->worker_list); |
| 431 | spin_unlock_irqrestore(&worker->workers->lock, flags); | 431 | spin_unlock(&worker->workers->lock); |
| 432 | } | 432 | } |
| 433 | if (!worker->working) { | 433 | if (!worker->working) { |
| 434 | wake = 1; | 434 | wake = 1; |
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 && |
