diff options
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r-- | fs/btrfs/inode.c | 567 |
1 files changed, 358 insertions, 209 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index b3ad168a0bfc..5440bab23635 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -88,13 +88,14 @@ static noinline int cow_file_range(struct inode *inode, | |||
88 | u64 start, u64 end, int *page_started, | 88 | u64 start, u64 end, int *page_started, |
89 | unsigned long *nr_written, int unlock); | 89 | unsigned long *nr_written, int unlock); |
90 | 90 | ||
91 | static int btrfs_init_inode_security(struct inode *inode, struct inode *dir) | 91 | static int btrfs_init_inode_security(struct btrfs_trans_handle *trans, |
92 | struct inode *inode, struct inode *dir) | ||
92 | { | 93 | { |
93 | int err; | 94 | int err; |
94 | 95 | ||
95 | err = btrfs_init_acl(inode, dir); | 96 | err = btrfs_init_acl(trans, inode, dir); |
96 | if (!err) | 97 | if (!err) |
97 | err = btrfs_xattr_security_init(inode, dir); | 98 | err = btrfs_xattr_security_init(trans, inode, dir); |
98 | return err; | 99 | return err; |
99 | } | 100 | } |
100 | 101 | ||
@@ -188,8 +189,18 @@ static noinline int insert_inline_extent(struct btrfs_trans_handle *trans, | |||
188 | btrfs_mark_buffer_dirty(leaf); | 189 | btrfs_mark_buffer_dirty(leaf); |
189 | btrfs_free_path(path); | 190 | btrfs_free_path(path); |
190 | 191 | ||
192 | /* | ||
193 | * we're an inline extent, so nobody can | ||
194 | * extend the file past i_size without locking | ||
195 | * a page we already have locked. | ||
196 | * | ||
197 | * We must do any isize and inode updates | ||
198 | * before we unlock the pages. Otherwise we | ||
199 | * could end up racing with unlink. | ||
200 | */ | ||
191 | BTRFS_I(inode)->disk_i_size = inode->i_size; | 201 | BTRFS_I(inode)->disk_i_size = inode->i_size; |
192 | btrfs_update_inode(trans, root, inode); | 202 | btrfs_update_inode(trans, root, inode); |
203 | |||
193 | return 0; | 204 | return 0; |
194 | fail: | 205 | fail: |
195 | btrfs_free_path(path); | 206 | btrfs_free_path(path); |
@@ -230,8 +241,7 @@ static noinline int cow_file_range_inline(struct btrfs_trans_handle *trans, | |||
230 | return 1; | 241 | return 1; |
231 | } | 242 | } |
232 | 243 | ||
233 | ret = btrfs_drop_extents(trans, root, inode, start, | 244 | ret = btrfs_drop_extents(trans, inode, start, aligned_end, |
234 | aligned_end, aligned_end, start, | ||
235 | &hint_byte, 1); | 245 | &hint_byte, 1); |
236 | BUG_ON(ret); | 246 | BUG_ON(ret); |
237 | 247 | ||
@@ -416,7 +426,6 @@ again: | |||
416 | start, end, | 426 | start, end, |
417 | total_compressed, pages); | 427 | total_compressed, pages); |
418 | } | 428 | } |
419 | btrfs_end_transaction(trans, root); | ||
420 | if (ret == 0) { | 429 | if (ret == 0) { |
421 | /* | 430 | /* |
422 | * inline extent creation worked, we don't need | 431 | * inline extent creation worked, we don't need |
@@ -430,9 +439,11 @@ again: | |||
430 | EXTENT_CLEAR_DELALLOC | | 439 | EXTENT_CLEAR_DELALLOC | |
431 | EXTENT_CLEAR_ACCOUNTING | | 440 | EXTENT_CLEAR_ACCOUNTING | |
432 | EXTENT_SET_WRITEBACK | EXTENT_END_WRITEBACK); | 441 | EXTENT_SET_WRITEBACK | EXTENT_END_WRITEBACK); |
433 | ret = 0; | 442 | |
443 | btrfs_end_transaction(trans, root); | ||
434 | goto free_pages_out; | 444 | goto free_pages_out; |
435 | } | 445 | } |
446 | btrfs_end_transaction(trans, root); | ||
436 | } | 447 | } |
437 | 448 | ||
438 | if (will_compress) { | 449 | if (will_compress) { |
@@ -543,7 +554,6 @@ static noinline int submit_compressed_extents(struct inode *inode, | |||
543 | if (list_empty(&async_cow->extents)) | 554 | if (list_empty(&async_cow->extents)) |
544 | return 0; | 555 | return 0; |
545 | 556 | ||
546 | trans = btrfs_join_transaction(root, 1); | ||
547 | 557 | ||
548 | while (!list_empty(&async_cow->extents)) { | 558 | while (!list_empty(&async_cow->extents)) { |
549 | async_extent = list_entry(async_cow->extents.next, | 559 | async_extent = list_entry(async_cow->extents.next, |
@@ -590,19 +600,15 @@ retry: | |||
590 | lock_extent(io_tree, async_extent->start, | 600 | lock_extent(io_tree, async_extent->start, |
591 | async_extent->start + async_extent->ram_size - 1, | 601 | async_extent->start + async_extent->ram_size - 1, |
592 | GFP_NOFS); | 602 | GFP_NOFS); |
593 | /* | ||
594 | * here we're doing allocation and writeback of the | ||
595 | * compressed pages | ||
596 | */ | ||
597 | btrfs_drop_extent_cache(inode, async_extent->start, | ||
598 | async_extent->start + | ||
599 | async_extent->ram_size - 1, 0); | ||
600 | 603 | ||
604 | trans = btrfs_join_transaction(root, 1); | ||
601 | ret = btrfs_reserve_extent(trans, root, | 605 | ret = btrfs_reserve_extent(trans, root, |
602 | async_extent->compressed_size, | 606 | async_extent->compressed_size, |
603 | async_extent->compressed_size, | 607 | async_extent->compressed_size, |
604 | 0, alloc_hint, | 608 | 0, alloc_hint, |
605 | (u64)-1, &ins, 1); | 609 | (u64)-1, &ins, 1); |
610 | btrfs_end_transaction(trans, root); | ||
611 | |||
606 | if (ret) { | 612 | if (ret) { |
607 | int i; | 613 | int i; |
608 | for (i = 0; i < async_extent->nr_pages; i++) { | 614 | for (i = 0; i < async_extent->nr_pages; i++) { |
@@ -618,6 +624,14 @@ retry: | |||
618 | goto retry; | 624 | goto retry; |
619 | } | 625 | } |
620 | 626 | ||
627 | /* | ||
628 | * here we're doing allocation and writeback of the | ||
629 | * compressed pages | ||
630 | */ | ||
631 | btrfs_drop_extent_cache(inode, async_extent->start, | ||
632 | async_extent->start + | ||
633 | async_extent->ram_size - 1, 0); | ||
634 | |||
621 | em = alloc_extent_map(GFP_NOFS); | 635 | em = alloc_extent_map(GFP_NOFS); |
622 | em->start = async_extent->start; | 636 | em->start = async_extent->start; |
623 | em->len = async_extent->ram_size; | 637 | em->len = async_extent->ram_size; |
@@ -649,8 +663,6 @@ retry: | |||
649 | BTRFS_ORDERED_COMPRESSED); | 663 | BTRFS_ORDERED_COMPRESSED); |
650 | BUG_ON(ret); | 664 | BUG_ON(ret); |
651 | 665 | ||
652 | btrfs_end_transaction(trans, root); | ||
653 | |||
654 | /* | 666 | /* |
655 | * clear dirty, set writeback and unlock the pages. | 667 | * clear dirty, set writeback and unlock the pages. |
656 | */ | 668 | */ |
@@ -672,13 +684,11 @@ retry: | |||
672 | async_extent->nr_pages); | 684 | async_extent->nr_pages); |
673 | 685 | ||
674 | BUG_ON(ret); | 686 | BUG_ON(ret); |
675 | trans = btrfs_join_transaction(root, 1); | ||
676 | alloc_hint = ins.objectid + ins.offset; | 687 | alloc_hint = ins.objectid + ins.offset; |
677 | kfree(async_extent); | 688 | kfree(async_extent); |
678 | cond_resched(); | 689 | cond_resched(); |
679 | } | 690 | } |
680 | 691 | ||
681 | btrfs_end_transaction(trans, root); | ||
682 | return 0; | 692 | return 0; |
683 | } | 693 | } |
684 | 694 | ||
@@ -742,6 +752,7 @@ static noinline int cow_file_range(struct inode *inode, | |||
742 | EXTENT_CLEAR_DIRTY | | 752 | EXTENT_CLEAR_DIRTY | |
743 | EXTENT_SET_WRITEBACK | | 753 | EXTENT_SET_WRITEBACK | |
744 | EXTENT_END_WRITEBACK); | 754 | EXTENT_END_WRITEBACK); |
755 | |||
745 | *nr_written = *nr_written + | 756 | *nr_written = *nr_written + |
746 | (end - start + PAGE_CACHE_SIZE) / PAGE_CACHE_SIZE; | 757 | (end - start + PAGE_CACHE_SIZE) / PAGE_CACHE_SIZE; |
747 | *page_started = 1; | 758 | *page_started = 1; |
@@ -1596,7 +1607,6 @@ static int insert_reserved_file_extent(struct btrfs_trans_handle *trans, | |||
1596 | struct inode *inode, u64 file_pos, | 1607 | struct inode *inode, u64 file_pos, |
1597 | u64 disk_bytenr, u64 disk_num_bytes, | 1608 | u64 disk_bytenr, u64 disk_num_bytes, |
1598 | u64 num_bytes, u64 ram_bytes, | 1609 | u64 num_bytes, u64 ram_bytes, |
1599 | u64 locked_end, | ||
1600 | u8 compression, u8 encryption, | 1610 | u8 compression, u8 encryption, |
1601 | u16 other_encoding, int extent_type) | 1611 | u16 other_encoding, int extent_type) |
1602 | { | 1612 | { |
@@ -1622,9 +1632,8 @@ static int insert_reserved_file_extent(struct btrfs_trans_handle *trans, | |||
1622 | * the caller is expected to unpin it and allow it to be merged | 1632 | * the caller is expected to unpin it and allow it to be merged |
1623 | * with the others. | 1633 | * with the others. |
1624 | */ | 1634 | */ |
1625 | ret = btrfs_drop_extents(trans, root, inode, file_pos, | 1635 | ret = btrfs_drop_extents(trans, inode, file_pos, file_pos + num_bytes, |
1626 | file_pos + num_bytes, locked_end, | 1636 | &hint, 0); |
1627 | file_pos, &hint, 0); | ||
1628 | BUG_ON(ret); | 1637 | BUG_ON(ret); |
1629 | 1638 | ||
1630 | ins.objectid = inode->i_ino; | 1639 | ins.objectid = inode->i_ino; |
@@ -1730,23 +1739,32 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) | |||
1730 | } | 1739 | } |
1731 | } | 1740 | } |
1732 | 1741 | ||
1733 | trans = btrfs_join_transaction(root, 1); | ||
1734 | |||
1735 | if (!ordered_extent) | 1742 | if (!ordered_extent) |
1736 | ordered_extent = btrfs_lookup_ordered_extent(inode, start); | 1743 | ordered_extent = btrfs_lookup_ordered_extent(inode, start); |
1737 | BUG_ON(!ordered_extent); | 1744 | BUG_ON(!ordered_extent); |
1738 | if (test_bit(BTRFS_ORDERED_NOCOW, &ordered_extent->flags)) | 1745 | if (test_bit(BTRFS_ORDERED_NOCOW, &ordered_extent->flags)) { |
1739 | goto nocow; | 1746 | BUG_ON(!list_empty(&ordered_extent->list)); |
1747 | ret = btrfs_ordered_update_i_size(inode, 0, ordered_extent); | ||
1748 | if (!ret) { | ||
1749 | trans = btrfs_join_transaction(root, 1); | ||
1750 | ret = btrfs_update_inode(trans, root, inode); | ||
1751 | BUG_ON(ret); | ||
1752 | btrfs_end_transaction(trans, root); | ||
1753 | } | ||
1754 | goto out; | ||
1755 | } | ||
1740 | 1756 | ||
1741 | lock_extent(io_tree, ordered_extent->file_offset, | 1757 | lock_extent(io_tree, ordered_extent->file_offset, |
1742 | ordered_extent->file_offset + ordered_extent->len - 1, | 1758 | ordered_extent->file_offset + ordered_extent->len - 1, |
1743 | GFP_NOFS); | 1759 | GFP_NOFS); |
1744 | 1760 | ||
1761 | trans = btrfs_join_transaction(root, 1); | ||
1762 | |||
1745 | if (test_bit(BTRFS_ORDERED_COMPRESSED, &ordered_extent->flags)) | 1763 | if (test_bit(BTRFS_ORDERED_COMPRESSED, &ordered_extent->flags)) |
1746 | compressed = 1; | 1764 | compressed = 1; |
1747 | if (test_bit(BTRFS_ORDERED_PREALLOC, &ordered_extent->flags)) { | 1765 | if (test_bit(BTRFS_ORDERED_PREALLOC, &ordered_extent->flags)) { |
1748 | BUG_ON(compressed); | 1766 | BUG_ON(compressed); |
1749 | ret = btrfs_mark_extent_written(trans, root, inode, | 1767 | ret = btrfs_mark_extent_written(trans, inode, |
1750 | ordered_extent->file_offset, | 1768 | ordered_extent->file_offset, |
1751 | ordered_extent->file_offset + | 1769 | ordered_extent->file_offset + |
1752 | ordered_extent->len); | 1770 | ordered_extent->len); |
@@ -1758,8 +1776,6 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) | |||
1758 | ordered_extent->disk_len, | 1776 | ordered_extent->disk_len, |
1759 | ordered_extent->len, | 1777 | ordered_extent->len, |
1760 | ordered_extent->len, | 1778 | ordered_extent->len, |
1761 | ordered_extent->file_offset + | ||
1762 | ordered_extent->len, | ||
1763 | compressed, 0, 0, | 1779 | compressed, 0, 0, |
1764 | BTRFS_FILE_EXTENT_REG); | 1780 | BTRFS_FILE_EXTENT_REG); |
1765 | unpin_extent_cache(&BTRFS_I(inode)->extent_tree, | 1781 | unpin_extent_cache(&BTRFS_I(inode)->extent_tree, |
@@ -1770,22 +1786,20 @@ static int btrfs_finish_ordered_io(struct inode *inode, u64 start, u64 end) | |||
1770 | unlock_extent(io_tree, ordered_extent->file_offset, | 1786 | unlock_extent(io_tree, ordered_extent->file_offset, |
1771 | ordered_extent->file_offset + ordered_extent->len - 1, | 1787 | ordered_extent->file_offset + ordered_extent->len - 1, |
1772 | GFP_NOFS); | 1788 | GFP_NOFS); |
1773 | nocow: | ||
1774 | add_pending_csums(trans, inode, ordered_extent->file_offset, | 1789 | add_pending_csums(trans, inode, ordered_extent->file_offset, |
1775 | &ordered_extent->list); | 1790 | &ordered_extent->list); |
1776 | 1791 | ||
1777 | mutex_lock(&BTRFS_I(inode)->extent_mutex); | 1792 | /* this also removes the ordered extent from the tree */ |
1778 | btrfs_ordered_update_i_size(inode, ordered_extent); | 1793 | btrfs_ordered_update_i_size(inode, 0, ordered_extent); |
1779 | btrfs_update_inode(trans, root, inode); | 1794 | ret = btrfs_update_inode(trans, root, inode); |
1780 | btrfs_remove_ordered_extent(inode, ordered_extent); | 1795 | BUG_ON(ret); |
1781 | mutex_unlock(&BTRFS_I(inode)->extent_mutex); | 1796 | btrfs_end_transaction(trans, root); |
1782 | 1797 | out: | |
1783 | /* once for us */ | 1798 | /* once for us */ |
1784 | btrfs_put_ordered_extent(ordered_extent); | 1799 | btrfs_put_ordered_extent(ordered_extent); |
1785 | /* once for the tree */ | 1800 | /* once for the tree */ |
1786 | btrfs_put_ordered_extent(ordered_extent); | 1801 | btrfs_put_ordered_extent(ordered_extent); |
1787 | 1802 | ||
1788 | btrfs_end_transaction(trans, root); | ||
1789 | return 0; | 1803 | return 0; |
1790 | } | 1804 | } |
1791 | 1805 | ||
@@ -2008,6 +2022,54 @@ zeroit: | |||
2008 | return -EIO; | 2022 | return -EIO; |
2009 | } | 2023 | } |
2010 | 2024 | ||
2025 | struct delayed_iput { | ||
2026 | struct list_head list; | ||
2027 | struct inode *inode; | ||
2028 | }; | ||
2029 | |||
2030 | void btrfs_add_delayed_iput(struct inode *inode) | ||
2031 | { | ||
2032 | struct btrfs_fs_info *fs_info = BTRFS_I(inode)->root->fs_info; | ||
2033 | struct delayed_iput *delayed; | ||
2034 | |||
2035 | if (atomic_add_unless(&inode->i_count, -1, 1)) | ||
2036 | return; | ||
2037 | |||
2038 | delayed = kmalloc(sizeof(*delayed), GFP_NOFS | __GFP_NOFAIL); | ||
2039 | delayed->inode = inode; | ||
2040 | |||
2041 | spin_lock(&fs_info->delayed_iput_lock); | ||
2042 | list_add_tail(&delayed->list, &fs_info->delayed_iputs); | ||
2043 | spin_unlock(&fs_info->delayed_iput_lock); | ||
2044 | } | ||
2045 | |||
2046 | void btrfs_run_delayed_iputs(struct btrfs_root *root) | ||
2047 | { | ||
2048 | LIST_HEAD(list); | ||
2049 | struct btrfs_fs_info *fs_info = root->fs_info; | ||
2050 | struct delayed_iput *delayed; | ||
2051 | int empty; | ||
2052 | |||
2053 | spin_lock(&fs_info->delayed_iput_lock); | ||
2054 | empty = list_empty(&fs_info->delayed_iputs); | ||
2055 | spin_unlock(&fs_info->delayed_iput_lock); | ||
2056 | if (empty) | ||
2057 | return; | ||
2058 | |||
2059 | down_read(&root->fs_info->cleanup_work_sem); | ||
2060 | spin_lock(&fs_info->delayed_iput_lock); | ||
2061 | list_splice_init(&fs_info->delayed_iputs, &list); | ||
2062 | spin_unlock(&fs_info->delayed_iput_lock); | ||
2063 | |||
2064 | while (!list_empty(&list)) { | ||
2065 | delayed = list_entry(list.next, struct delayed_iput, list); | ||
2066 | list_del(&delayed->list); | ||
2067 | iput(delayed->inode); | ||
2068 | kfree(delayed); | ||
2069 | } | ||
2070 | up_read(&root->fs_info->cleanup_work_sem); | ||
2071 | } | ||
2072 | |||
2011 | /* | 2073 | /* |
2012 | * This creates an orphan entry for the given inode in case something goes | 2074 | * This creates an orphan entry for the given inode in case something goes |
2013 | * wrong in the middle of an unlink/truncate. | 2075 | * wrong in the middle of an unlink/truncate. |
@@ -2080,16 +2142,17 @@ void btrfs_orphan_cleanup(struct btrfs_root *root) | |||
2080 | struct inode *inode; | 2142 | struct inode *inode; |
2081 | int ret = 0, nr_unlink = 0, nr_truncate = 0; | 2143 | int ret = 0, nr_unlink = 0, nr_truncate = 0; |
2082 | 2144 | ||
2083 | path = btrfs_alloc_path(); | 2145 | if (!xchg(&root->clean_orphans, 0)) |
2084 | if (!path) | ||
2085 | return; | 2146 | return; |
2147 | |||
2148 | path = btrfs_alloc_path(); | ||
2149 | BUG_ON(!path); | ||
2086 | path->reada = -1; | 2150 | path->reada = -1; |
2087 | 2151 | ||
2088 | key.objectid = BTRFS_ORPHAN_OBJECTID; | 2152 | key.objectid = BTRFS_ORPHAN_OBJECTID; |
2089 | btrfs_set_key_type(&key, BTRFS_ORPHAN_ITEM_KEY); | 2153 | btrfs_set_key_type(&key, BTRFS_ORPHAN_ITEM_KEY); |
2090 | key.offset = (u64)-1; | 2154 | key.offset = (u64)-1; |
2091 | 2155 | ||
2092 | |||
2093 | while (1) { | 2156 | while (1) { |
2094 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); | 2157 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); |
2095 | if (ret < 0) { | 2158 | if (ret < 0) { |
@@ -2834,37 +2897,40 @@ out: | |||
2834 | * min_type is the minimum key type to truncate down to. If set to 0, this | 2897 | * min_type is the minimum key type to truncate down to. If set to 0, this |
2835 | * will kill all the items on this inode, including the INODE_ITEM_KEY. | 2898 | * will kill all the items on this inode, including the INODE_ITEM_KEY. |
2836 | */ | 2899 | */ |
2837 | noinline int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans, | 2900 | int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans, |
2838 | struct btrfs_root *root, | 2901 | struct btrfs_root *root, |
2839 | struct inode *inode, | 2902 | struct inode *inode, |
2840 | u64 new_size, u32 min_type) | 2903 | u64 new_size, u32 min_type) |
2841 | { | 2904 | { |
2842 | int ret; | ||
2843 | struct btrfs_path *path; | 2905 | struct btrfs_path *path; |
2844 | struct btrfs_key key; | ||
2845 | struct btrfs_key found_key; | ||
2846 | u32 found_type = (u8)-1; | ||
2847 | struct extent_buffer *leaf; | 2906 | struct extent_buffer *leaf; |
2848 | struct btrfs_file_extent_item *fi; | 2907 | struct btrfs_file_extent_item *fi; |
2908 | struct btrfs_key key; | ||
2909 | struct btrfs_key found_key; | ||
2849 | u64 extent_start = 0; | 2910 | u64 extent_start = 0; |
2850 | u64 extent_num_bytes = 0; | 2911 | u64 extent_num_bytes = 0; |
2851 | u64 extent_offset = 0; | 2912 | u64 extent_offset = 0; |
2852 | u64 item_end = 0; | 2913 | u64 item_end = 0; |
2914 | u64 mask = root->sectorsize - 1; | ||
2915 | u32 found_type = (u8)-1; | ||
2853 | int found_extent; | 2916 | int found_extent; |
2854 | int del_item; | 2917 | int del_item; |
2855 | int pending_del_nr = 0; | 2918 | int pending_del_nr = 0; |
2856 | int pending_del_slot = 0; | 2919 | int pending_del_slot = 0; |
2857 | int extent_type = -1; | 2920 | int extent_type = -1; |
2858 | int encoding; | 2921 | int encoding; |
2859 | u64 mask = root->sectorsize - 1; | 2922 | int ret; |
2923 | int err = 0; | ||
2924 | |||
2925 | BUG_ON(new_size > 0 && min_type != BTRFS_EXTENT_DATA_KEY); | ||
2860 | 2926 | ||
2861 | if (root->ref_cows) | 2927 | if (root->ref_cows) |
2862 | btrfs_drop_extent_cache(inode, new_size & (~mask), (u64)-1, 0); | 2928 | btrfs_drop_extent_cache(inode, new_size & (~mask), (u64)-1, 0); |
2929 | |||
2863 | path = btrfs_alloc_path(); | 2930 | path = btrfs_alloc_path(); |
2864 | BUG_ON(!path); | 2931 | BUG_ON(!path); |
2865 | path->reada = -1; | 2932 | path->reada = -1; |
2866 | 2933 | ||
2867 | /* FIXME, add redo link to tree so we don't leak on crash */ | ||
2868 | key.objectid = inode->i_ino; | 2934 | key.objectid = inode->i_ino; |
2869 | key.offset = (u64)-1; | 2935 | key.offset = (u64)-1; |
2870 | key.type = (u8)-1; | 2936 | key.type = (u8)-1; |
@@ -2872,17 +2938,17 @@ noinline int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans, | |||
2872 | search_again: | 2938 | search_again: |
2873 | path->leave_spinning = 1; | 2939 | path->leave_spinning = 1; |
2874 | ret = btrfs_search_slot(trans, root, &key, path, -1, 1); | 2940 | ret = btrfs_search_slot(trans, root, &key, path, -1, 1); |
2875 | if (ret < 0) | 2941 | if (ret < 0) { |
2876 | goto error; | 2942 | err = ret; |
2943 | goto out; | ||
2944 | } | ||
2877 | 2945 | ||
2878 | if (ret > 0) { | 2946 | if (ret > 0) { |
2879 | /* there are no items in the tree for us to truncate, we're | 2947 | /* there are no items in the tree for us to truncate, we're |
2880 | * done | 2948 | * done |
2881 | */ | 2949 | */ |
2882 | if (path->slots[0] == 0) { | 2950 | if (path->slots[0] == 0) |
2883 | ret = 0; | 2951 | goto out; |
2884 | goto error; | ||
2885 | } | ||
2886 | path->slots[0]--; | 2952 | path->slots[0]--; |
2887 | } | 2953 | } |
2888 | 2954 | ||
@@ -2917,28 +2983,17 @@ search_again: | |||
2917 | } | 2983 | } |
2918 | item_end--; | 2984 | item_end--; |
2919 | } | 2985 | } |
2920 | if (item_end < new_size) { | 2986 | if (found_type > min_type) { |
2921 | if (found_type == BTRFS_DIR_ITEM_KEY) | 2987 | del_item = 1; |
2922 | found_type = BTRFS_INODE_ITEM_KEY; | 2988 | } else { |
2923 | else if (found_type == BTRFS_EXTENT_ITEM_KEY) | 2989 | if (item_end < new_size) |
2924 | found_type = BTRFS_EXTENT_DATA_KEY; | ||
2925 | else if (found_type == BTRFS_EXTENT_DATA_KEY) | ||
2926 | found_type = BTRFS_XATTR_ITEM_KEY; | ||
2927 | else if (found_type == BTRFS_XATTR_ITEM_KEY) | ||
2928 | found_type = BTRFS_INODE_REF_KEY; | ||
2929 | else if (found_type) | ||
2930 | found_type--; | ||
2931 | else | ||
2932 | break; | 2990 | break; |
2933 | btrfs_set_key_type(&key, found_type); | 2991 | if (found_key.offset >= new_size) |
2934 | goto next; | 2992 | del_item = 1; |
2993 | else | ||
2994 | del_item = 0; | ||
2935 | } | 2995 | } |
2936 | if (found_key.offset >= new_size) | ||
2937 | del_item = 1; | ||
2938 | else | ||
2939 | del_item = 0; | ||
2940 | found_extent = 0; | 2996 | found_extent = 0; |
2941 | |||
2942 | /* FIXME, shrink the extent if the ref count is only 1 */ | 2997 | /* FIXME, shrink the extent if the ref count is only 1 */ |
2943 | if (found_type != BTRFS_EXTENT_DATA_KEY) | 2998 | if (found_type != BTRFS_EXTENT_DATA_KEY) |
2944 | goto delete; | 2999 | goto delete; |
@@ -3025,42 +3080,36 @@ delete: | |||
3025 | inode->i_ino, extent_offset); | 3080 | inode->i_ino, extent_offset); |
3026 | BUG_ON(ret); | 3081 | BUG_ON(ret); |
3027 | } | 3082 | } |
3028 | next: | ||
3029 | if (path->slots[0] == 0) { | ||
3030 | if (pending_del_nr) | ||
3031 | goto del_pending; | ||
3032 | btrfs_release_path(root, path); | ||
3033 | if (found_type == BTRFS_INODE_ITEM_KEY) | ||
3034 | break; | ||
3035 | goto search_again; | ||
3036 | } | ||
3037 | 3083 | ||
3038 | path->slots[0]--; | 3084 | if (found_type == BTRFS_INODE_ITEM_KEY) |
3039 | if (pending_del_nr && | 3085 | break; |
3040 | path->slots[0] + 1 != pending_del_slot) { | 3086 | |
3041 | struct btrfs_key debug; | 3087 | if (path->slots[0] == 0 || |
3042 | del_pending: | 3088 | path->slots[0] != pending_del_slot) { |
3043 | btrfs_item_key_to_cpu(path->nodes[0], &debug, | 3089 | if (root->ref_cows) { |
3044 | pending_del_slot); | 3090 | err = -EAGAIN; |
3045 | ret = btrfs_del_items(trans, root, path, | 3091 | goto out; |
3046 | pending_del_slot, | 3092 | } |
3047 | pending_del_nr); | 3093 | if (pending_del_nr) { |
3048 | BUG_ON(ret); | 3094 | ret = btrfs_del_items(trans, root, path, |
3049 | pending_del_nr = 0; | 3095 | pending_del_slot, |
3096 | pending_del_nr); | ||
3097 | BUG_ON(ret); | ||
3098 | pending_del_nr = 0; | ||
3099 | } | ||
3050 | btrfs_release_path(root, path); | 3100 | btrfs_release_path(root, path); |
3051 | if (found_type == BTRFS_INODE_ITEM_KEY) | ||
3052 | break; | ||
3053 | goto search_again; | 3101 | goto search_again; |
3102 | } else { | ||
3103 | path->slots[0]--; | ||
3054 | } | 3104 | } |
3055 | } | 3105 | } |
3056 | ret = 0; | 3106 | out: |
3057 | error: | ||
3058 | if (pending_del_nr) { | 3107 | if (pending_del_nr) { |
3059 | ret = btrfs_del_items(trans, root, path, pending_del_slot, | 3108 | ret = btrfs_del_items(trans, root, path, pending_del_slot, |
3060 | pending_del_nr); | 3109 | pending_del_nr); |
3061 | } | 3110 | } |
3062 | btrfs_free_path(path); | 3111 | btrfs_free_path(path); |
3063 | return ret; | 3112 | return err; |
3064 | } | 3113 | } |
3065 | 3114 | ||
3066 | /* | 3115 | /* |
@@ -3180,10 +3229,6 @@ int btrfs_cont_expand(struct inode *inode, loff_t size) | |||
3180 | if (size <= hole_start) | 3229 | if (size <= hole_start) |
3181 | return 0; | 3230 | return 0; |
3182 | 3231 | ||
3183 | err = btrfs_truncate_page(inode->i_mapping, inode->i_size); | ||
3184 | if (err) | ||
3185 | return err; | ||
3186 | |||
3187 | while (1) { | 3232 | while (1) { |
3188 | struct btrfs_ordered_extent *ordered; | 3233 | struct btrfs_ordered_extent *ordered; |
3189 | btrfs_wait_ordered_range(inode, hole_start, | 3234 | btrfs_wait_ordered_range(inode, hole_start, |
@@ -3196,9 +3241,6 @@ int btrfs_cont_expand(struct inode *inode, loff_t size) | |||
3196 | btrfs_put_ordered_extent(ordered); | 3241 | btrfs_put_ordered_extent(ordered); |
3197 | } | 3242 | } |
3198 | 3243 | ||
3199 | trans = btrfs_start_transaction(root, 1); | ||
3200 | btrfs_set_trans_block_group(trans, inode); | ||
3201 | |||
3202 | cur_offset = hole_start; | 3244 | cur_offset = hole_start; |
3203 | while (1) { | 3245 | while (1) { |
3204 | em = btrfs_get_extent(inode, NULL, 0, cur_offset, | 3246 | em = btrfs_get_extent(inode, NULL, 0, cur_offset, |
@@ -3206,40 +3248,120 @@ int btrfs_cont_expand(struct inode *inode, loff_t size) | |||
3206 | BUG_ON(IS_ERR(em) || !em); | 3248 | BUG_ON(IS_ERR(em) || !em); |
3207 | last_byte = min(extent_map_end(em), block_end); | 3249 | last_byte = min(extent_map_end(em), block_end); |
3208 | last_byte = (last_byte + mask) & ~mask; | 3250 | last_byte = (last_byte + mask) & ~mask; |
3209 | if (test_bit(EXTENT_FLAG_VACANCY, &em->flags)) { | 3251 | if (!test_bit(EXTENT_FLAG_PREALLOC, &em->flags)) { |
3210 | u64 hint_byte = 0; | 3252 | u64 hint_byte = 0; |
3211 | hole_size = last_byte - cur_offset; | 3253 | hole_size = last_byte - cur_offset; |
3212 | err = btrfs_drop_extents(trans, root, inode, | ||
3213 | cur_offset, | ||
3214 | cur_offset + hole_size, | ||
3215 | block_end, | ||
3216 | cur_offset, &hint_byte, 1); | ||
3217 | if (err) | ||
3218 | break; | ||
3219 | 3254 | ||
3220 | err = btrfs_reserve_metadata_space(root, 1); | 3255 | err = btrfs_reserve_metadata_space(root, 2); |
3221 | if (err) | 3256 | if (err) |
3222 | break; | 3257 | break; |
3223 | 3258 | ||
3259 | trans = btrfs_start_transaction(root, 1); | ||
3260 | btrfs_set_trans_block_group(trans, inode); | ||
3261 | |||
3262 | err = btrfs_drop_extents(trans, inode, cur_offset, | ||
3263 | cur_offset + hole_size, | ||
3264 | &hint_byte, 1); | ||
3265 | BUG_ON(err); | ||
3266 | |||
3224 | err = btrfs_insert_file_extent(trans, root, | 3267 | err = btrfs_insert_file_extent(trans, root, |
3225 | inode->i_ino, cur_offset, 0, | 3268 | inode->i_ino, cur_offset, 0, |
3226 | 0, hole_size, 0, hole_size, | 3269 | 0, hole_size, 0, hole_size, |
3227 | 0, 0, 0); | 3270 | 0, 0, 0); |
3271 | BUG_ON(err); | ||
3272 | |||
3228 | btrfs_drop_extent_cache(inode, hole_start, | 3273 | btrfs_drop_extent_cache(inode, hole_start, |
3229 | last_byte - 1, 0); | 3274 | last_byte - 1, 0); |
3230 | btrfs_unreserve_metadata_space(root, 1); | 3275 | |
3276 | btrfs_end_transaction(trans, root); | ||
3277 | btrfs_unreserve_metadata_space(root, 2); | ||
3231 | } | 3278 | } |
3232 | free_extent_map(em); | 3279 | free_extent_map(em); |
3233 | cur_offset = last_byte; | 3280 | cur_offset = last_byte; |
3234 | if (err || cur_offset >= block_end) | 3281 | if (cur_offset >= block_end) |
3235 | break; | 3282 | break; |
3236 | } | 3283 | } |
3237 | 3284 | ||
3238 | btrfs_end_transaction(trans, root); | ||
3239 | unlock_extent(io_tree, hole_start, block_end - 1, GFP_NOFS); | 3285 | unlock_extent(io_tree, hole_start, block_end - 1, GFP_NOFS); |
3240 | return err; | 3286 | return err; |
3241 | } | 3287 | } |
3242 | 3288 | ||
3289 | static int btrfs_setattr_size(struct inode *inode, struct iattr *attr) | ||
3290 | { | ||
3291 | struct btrfs_root *root = BTRFS_I(inode)->root; | ||
3292 | struct btrfs_trans_handle *trans; | ||
3293 | unsigned long nr; | ||
3294 | int ret; | ||
3295 | |||
3296 | if (attr->ia_size == inode->i_size) | ||
3297 | return 0; | ||
3298 | |||
3299 | if (attr->ia_size > inode->i_size) { | ||
3300 | unsigned long limit; | ||
3301 | limit = current->signal->rlim[RLIMIT_FSIZE].rlim_cur; | ||
3302 | if (attr->ia_size > inode->i_sb->s_maxbytes) | ||
3303 | return -EFBIG; | ||
3304 | if (limit != RLIM_INFINITY && attr->ia_size > limit) { | ||
3305 | send_sig(SIGXFSZ, current, 0); | ||
3306 | return -EFBIG; | ||
3307 | } | ||
3308 | } | ||
3309 | |||
3310 | ret = btrfs_reserve_metadata_space(root, 1); | ||
3311 | if (ret) | ||
3312 | return ret; | ||
3313 | |||
3314 | trans = btrfs_start_transaction(root, 1); | ||
3315 | btrfs_set_trans_block_group(trans, inode); | ||
3316 | |||
3317 | ret = btrfs_orphan_add(trans, inode); | ||
3318 | BUG_ON(ret); | ||
3319 | |||
3320 | nr = trans->blocks_used; | ||
3321 | btrfs_end_transaction(trans, root); | ||
3322 | btrfs_unreserve_metadata_space(root, 1); | ||
3323 | btrfs_btree_balance_dirty(root, nr); | ||
3324 | |||
3325 | if (attr->ia_size > inode->i_size) { | ||
3326 | ret = btrfs_cont_expand(inode, attr->ia_size); | ||
3327 | if (ret) { | ||
3328 | btrfs_truncate(inode); | ||
3329 | return ret; | ||
3330 | } | ||
3331 | |||
3332 | i_size_write(inode, attr->ia_size); | ||
3333 | btrfs_ordered_update_i_size(inode, inode->i_size, NULL); | ||
3334 | |||
3335 | trans = btrfs_start_transaction(root, 1); | ||
3336 | btrfs_set_trans_block_group(trans, inode); | ||
3337 | |||
3338 | ret = btrfs_update_inode(trans, root, inode); | ||
3339 | BUG_ON(ret); | ||
3340 | if (inode->i_nlink > 0) { | ||
3341 | ret = btrfs_orphan_del(trans, inode); | ||
3342 | BUG_ON(ret); | ||
3343 | } | ||
3344 | nr = trans->blocks_used; | ||
3345 | btrfs_end_transaction(trans, root); | ||
3346 | btrfs_btree_balance_dirty(root, nr); | ||
3347 | return 0; | ||
3348 | } | ||
3349 | |||
3350 | /* | ||
3351 | * We're truncating a file that used to have good data down to | ||
3352 | * zero. Make sure it gets into the ordered flush list so that | ||
3353 | * any new writes get down to disk quickly. | ||
3354 | */ | ||
3355 | if (attr->ia_size == 0) | ||
3356 | BTRFS_I(inode)->ordered_data_close = 1; | ||
3357 | |||
3358 | /* we don't support swapfiles, so vmtruncate shouldn't fail */ | ||
3359 | ret = vmtruncate(inode, attr->ia_size); | ||
3360 | BUG_ON(ret); | ||
3361 | |||
3362 | return 0; | ||
3363 | } | ||
3364 | |||
3243 | static int btrfs_setattr(struct dentry *dentry, struct iattr *attr) | 3365 | static int btrfs_setattr(struct dentry *dentry, struct iattr *attr) |
3244 | { | 3366 | { |
3245 | struct inode *inode = dentry->d_inode; | 3367 | struct inode *inode = dentry->d_inode; |
@@ -3250,23 +3372,14 @@ static int btrfs_setattr(struct dentry *dentry, struct iattr *attr) | |||
3250 | return err; | 3372 | return err; |
3251 | 3373 | ||
3252 | if (S_ISREG(inode->i_mode) && (attr->ia_valid & ATTR_SIZE)) { | 3374 | if (S_ISREG(inode->i_mode) && (attr->ia_valid & ATTR_SIZE)) { |
3253 | if (attr->ia_size > inode->i_size) { | 3375 | err = btrfs_setattr_size(inode, attr); |
3254 | err = btrfs_cont_expand(inode, attr->ia_size); | 3376 | if (err) |
3255 | if (err) | 3377 | return err; |
3256 | return err; | ||
3257 | } else if (inode->i_size > 0 && | ||
3258 | attr->ia_size == 0) { | ||
3259 | |||
3260 | /* we're truncating a file that used to have good | ||
3261 | * data down to zero. Make sure it gets into | ||
3262 | * the ordered flush list so that any new writes | ||
3263 | * get down to disk quickly. | ||
3264 | */ | ||
3265 | BTRFS_I(inode)->ordered_data_close = 1; | ||
3266 | } | ||
3267 | } | 3378 | } |
3379 | attr->ia_valid &= ~ATTR_SIZE; | ||
3268 | 3380 | ||
3269 | err = inode_setattr(inode, attr); | 3381 | if (attr->ia_valid) |
3382 | err = inode_setattr(inode, attr); | ||
3270 | 3383 | ||
3271 | if (!err && ((attr->ia_valid & ATTR_MODE))) | 3384 | if (!err && ((attr->ia_valid & ATTR_MODE))) |
3272 | err = btrfs_acl_chmod(inode); | 3385 | err = btrfs_acl_chmod(inode); |
@@ -3287,36 +3400,43 @@ void btrfs_delete_inode(struct inode *inode) | |||
3287 | } | 3400 | } |
3288 | btrfs_wait_ordered_range(inode, 0, (u64)-1); | 3401 | btrfs_wait_ordered_range(inode, 0, (u64)-1); |
3289 | 3402 | ||
3403 | if (root->fs_info->log_root_recovering) { | ||
3404 | BUG_ON(!list_empty(&BTRFS_I(inode)->i_orphan)); | ||
3405 | goto no_delete; | ||
3406 | } | ||
3407 | |||
3290 | if (inode->i_nlink > 0) { | 3408 | if (inode->i_nlink > 0) { |
3291 | BUG_ON(btrfs_root_refs(&root->root_item) != 0); | 3409 | BUG_ON(btrfs_root_refs(&root->root_item) != 0); |
3292 | goto no_delete; | 3410 | goto no_delete; |
3293 | } | 3411 | } |
3294 | 3412 | ||
3295 | btrfs_i_size_write(inode, 0); | 3413 | btrfs_i_size_write(inode, 0); |
3296 | trans = btrfs_join_transaction(root, 1); | ||
3297 | 3414 | ||
3298 | btrfs_set_trans_block_group(trans, inode); | 3415 | while (1) { |
3299 | ret = btrfs_truncate_inode_items(trans, root, inode, inode->i_size, 0); | 3416 | trans = btrfs_start_transaction(root, 1); |
3300 | if (ret) { | 3417 | btrfs_set_trans_block_group(trans, inode); |
3301 | btrfs_orphan_del(NULL, inode); | 3418 | ret = btrfs_truncate_inode_items(trans, root, inode, 0, 0); |
3302 | goto no_delete_lock; | ||
3303 | } | ||
3304 | 3419 | ||
3305 | btrfs_orphan_del(trans, inode); | 3420 | if (ret != -EAGAIN) |
3421 | break; | ||
3306 | 3422 | ||
3307 | nr = trans->blocks_used; | 3423 | nr = trans->blocks_used; |
3308 | clear_inode(inode); | 3424 | btrfs_end_transaction(trans, root); |
3425 | trans = NULL; | ||
3426 | btrfs_btree_balance_dirty(root, nr); | ||
3427 | } | ||
3309 | 3428 | ||
3310 | btrfs_end_transaction(trans, root); | 3429 | if (ret == 0) { |
3311 | btrfs_btree_balance_dirty(root, nr); | 3430 | ret = btrfs_orphan_del(trans, inode); |
3312 | return; | 3431 | BUG_ON(ret); |
3432 | } | ||
3313 | 3433 | ||
3314 | no_delete_lock: | ||
3315 | nr = trans->blocks_used; | 3434 | nr = trans->blocks_used; |
3316 | btrfs_end_transaction(trans, root); | 3435 | btrfs_end_transaction(trans, root); |
3317 | btrfs_btree_balance_dirty(root, nr); | 3436 | btrfs_btree_balance_dirty(root, nr); |
3318 | no_delete: | 3437 | no_delete: |
3319 | clear_inode(inode); | 3438 | clear_inode(inode); |
3439 | return; | ||
3320 | } | 3440 | } |
3321 | 3441 | ||
3322 | /* | 3442 | /* |
@@ -3569,7 +3689,6 @@ static noinline void init_btrfs_i(struct inode *inode) | |||
3569 | INIT_LIST_HEAD(&BTRFS_I(inode)->ordered_operations); | 3689 | INIT_LIST_HEAD(&BTRFS_I(inode)->ordered_operations); |
3570 | RB_CLEAR_NODE(&BTRFS_I(inode)->rb_node); | 3690 | RB_CLEAR_NODE(&BTRFS_I(inode)->rb_node); |
3571 | btrfs_ordered_inode_tree_init(&BTRFS_I(inode)->ordered_tree); | 3691 | btrfs_ordered_inode_tree_init(&BTRFS_I(inode)->ordered_tree); |
3572 | mutex_init(&BTRFS_I(inode)->extent_mutex); | ||
3573 | mutex_init(&BTRFS_I(inode)->log_mutex); | 3692 | mutex_init(&BTRFS_I(inode)->log_mutex); |
3574 | } | 3693 | } |
3575 | 3694 | ||
@@ -3695,6 +3814,13 @@ struct inode *btrfs_lookup_dentry(struct inode *dir, struct dentry *dentry) | |||
3695 | } | 3814 | } |
3696 | srcu_read_unlock(&root->fs_info->subvol_srcu, index); | 3815 | srcu_read_unlock(&root->fs_info->subvol_srcu, index); |
3697 | 3816 | ||
3817 | if (root != sub_root) { | ||
3818 | down_read(&root->fs_info->cleanup_work_sem); | ||
3819 | if (!(inode->i_sb->s_flags & MS_RDONLY)) | ||
3820 | btrfs_orphan_cleanup(sub_root); | ||
3821 | up_read(&root->fs_info->cleanup_work_sem); | ||
3822 | } | ||
3823 | |||
3698 | return inode; | 3824 | return inode; |
3699 | } | 3825 | } |
3700 | 3826 | ||
@@ -4219,7 +4345,7 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry, | |||
4219 | if (IS_ERR(inode)) | 4345 | if (IS_ERR(inode)) |
4220 | goto out_unlock; | 4346 | goto out_unlock; |
4221 | 4347 | ||
4222 | err = btrfs_init_inode_security(inode, dir); | 4348 | err = btrfs_init_inode_security(trans, inode, dir); |
4223 | if (err) { | 4349 | if (err) { |
4224 | drop_inode = 1; | 4350 | drop_inode = 1; |
4225 | goto out_unlock; | 4351 | goto out_unlock; |
@@ -4290,7 +4416,7 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry, | |||
4290 | if (IS_ERR(inode)) | 4416 | if (IS_ERR(inode)) |
4291 | goto out_unlock; | 4417 | goto out_unlock; |
4292 | 4418 | ||
4293 | err = btrfs_init_inode_security(inode, dir); | 4419 | err = btrfs_init_inode_security(trans, inode, dir); |
4294 | if (err) { | 4420 | if (err) { |
4295 | drop_inode = 1; | 4421 | drop_inode = 1; |
4296 | goto out_unlock; | 4422 | goto out_unlock; |
@@ -4336,6 +4462,10 @@ static int btrfs_link(struct dentry *old_dentry, struct inode *dir, | |||
4336 | if (inode->i_nlink == 0) | 4462 | if (inode->i_nlink == 0) |
4337 | return -ENOENT; | 4463 | return -ENOENT; |
4338 | 4464 | ||
4465 | /* do not allow sys_link's with other subvols of the same device */ | ||
4466 | if (root->objectid != BTRFS_I(inode)->root->objectid) | ||
4467 | return -EPERM; | ||
4468 | |||
4339 | /* | 4469 | /* |
4340 | * 1 item for inode ref | 4470 | * 1 item for inode ref |
4341 | * 2 items for dir items | 4471 | * 2 items for dir items |
@@ -4423,7 +4553,7 @@ static int btrfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
4423 | 4553 | ||
4424 | drop_on_err = 1; | 4554 | drop_on_err = 1; |
4425 | 4555 | ||
4426 | err = btrfs_init_inode_security(inode, dir); | 4556 | err = btrfs_init_inode_security(trans, inode, dir); |
4427 | if (err) | 4557 | if (err) |
4428 | goto out_fail; | 4558 | goto out_fail; |
4429 | 4559 | ||
@@ -5074,17 +5204,20 @@ static void btrfs_truncate(struct inode *inode) | |||
5074 | unsigned long nr; | 5204 | unsigned long nr; |
5075 | u64 mask = root->sectorsize - 1; | 5205 | u64 mask = root->sectorsize - 1; |
5076 | 5206 | ||
5077 | if (!S_ISREG(inode->i_mode)) | 5207 | if (!S_ISREG(inode->i_mode)) { |
5078 | return; | 5208 | WARN_ON(1); |
5079 | if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) | ||
5080 | return; | 5209 | return; |
5210 | } | ||
5081 | 5211 | ||
5082 | ret = btrfs_truncate_page(inode->i_mapping, inode->i_size); | 5212 | ret = btrfs_truncate_page(inode->i_mapping, inode->i_size); |
5083 | if (ret) | 5213 | if (ret) |
5084 | return; | 5214 | return; |
5215 | |||
5085 | btrfs_wait_ordered_range(inode, inode->i_size & (~mask), (u64)-1); | 5216 | btrfs_wait_ordered_range(inode, inode->i_size & (~mask), (u64)-1); |
5217 | btrfs_ordered_update_i_size(inode, inode->i_size, NULL); | ||
5086 | 5218 | ||
5087 | trans = btrfs_start_transaction(root, 1); | 5219 | trans = btrfs_start_transaction(root, 1); |
5220 | btrfs_set_trans_block_group(trans, inode); | ||
5088 | 5221 | ||
5089 | /* | 5222 | /* |
5090 | * setattr is responsible for setting the ordered_data_close flag, | 5223 | * setattr is responsible for setting the ordered_data_close flag, |
@@ -5106,21 +5239,32 @@ static void btrfs_truncate(struct inode *inode) | |||
5106 | if (inode->i_size == 0 && BTRFS_I(inode)->ordered_data_close) | 5239 | if (inode->i_size == 0 && BTRFS_I(inode)->ordered_data_close) |
5107 | btrfs_add_ordered_operation(trans, root, inode); | 5240 | btrfs_add_ordered_operation(trans, root, inode); |
5108 | 5241 | ||
5109 | btrfs_set_trans_block_group(trans, inode); | 5242 | while (1) { |
5110 | btrfs_i_size_write(inode, inode->i_size); | 5243 | ret = btrfs_truncate_inode_items(trans, root, inode, |
5244 | inode->i_size, | ||
5245 | BTRFS_EXTENT_DATA_KEY); | ||
5246 | if (ret != -EAGAIN) | ||
5247 | break; | ||
5111 | 5248 | ||
5112 | ret = btrfs_orphan_add(trans, inode); | 5249 | ret = btrfs_update_inode(trans, root, inode); |
5113 | if (ret) | 5250 | BUG_ON(ret); |
5114 | goto out; | 5251 | |
5115 | /* FIXME, add redo link to tree so we don't leak on crash */ | 5252 | nr = trans->blocks_used; |
5116 | ret = btrfs_truncate_inode_items(trans, root, inode, inode->i_size, | 5253 | btrfs_end_transaction(trans, root); |
5117 | BTRFS_EXTENT_DATA_KEY); | 5254 | btrfs_btree_balance_dirty(root, nr); |
5118 | btrfs_update_inode(trans, root, inode); | 5255 | |
5256 | trans = btrfs_start_transaction(root, 1); | ||
5257 | btrfs_set_trans_block_group(trans, inode); | ||
5258 | } | ||
5119 | 5259 | ||
5120 | ret = btrfs_orphan_del(trans, inode); | 5260 | if (ret == 0 && inode->i_nlink > 0) { |
5261 | ret = btrfs_orphan_del(trans, inode); | ||
5262 | BUG_ON(ret); | ||
5263 | } | ||
5264 | |||
5265 | ret = btrfs_update_inode(trans, root, inode); | ||
5121 | BUG_ON(ret); | 5266 | BUG_ON(ret); |
5122 | 5267 | ||
5123 | out: | ||
5124 | nr = trans->blocks_used; | 5268 | nr = trans->blocks_used; |
5125 | ret = btrfs_end_transaction_throttle(trans, root); | 5269 | ret = btrfs_end_transaction_throttle(trans, root); |
5126 | BUG_ON(ret); | 5270 | BUG_ON(ret); |
@@ -5217,9 +5361,9 @@ void btrfs_destroy_inode(struct inode *inode) | |||
5217 | 5361 | ||
5218 | spin_lock(&root->list_lock); | 5362 | spin_lock(&root->list_lock); |
5219 | if (!list_empty(&BTRFS_I(inode)->i_orphan)) { | 5363 | if (!list_empty(&BTRFS_I(inode)->i_orphan)) { |
5220 | printk(KERN_ERR "BTRFS: inode %lu: inode still on the orphan" | 5364 | printk(KERN_INFO "BTRFS: inode %lu still on the orphan list\n", |
5221 | " list\n", inode->i_ino); | 5365 | inode->i_ino); |
5222 | dump_stack(); | 5366 | list_del_init(&BTRFS_I(inode)->i_orphan); |
5223 | } | 5367 | } |
5224 | spin_unlock(&root->list_lock); | 5368 | spin_unlock(&root->list_lock); |
5225 | 5369 | ||
@@ -5476,7 +5620,7 @@ out_fail: | |||
5476 | * some fairly slow code that needs optimization. This walks the list | 5620 | * some fairly slow code that needs optimization. This walks the list |
5477 | * of all the inodes with pending delalloc and forces them to disk. | 5621 | * of all the inodes with pending delalloc and forces them to disk. |
5478 | */ | 5622 | */ |
5479 | int btrfs_start_delalloc_inodes(struct btrfs_root *root) | 5623 | int btrfs_start_delalloc_inodes(struct btrfs_root *root, int delay_iput) |
5480 | { | 5624 | { |
5481 | struct list_head *head = &root->fs_info->delalloc_inodes; | 5625 | struct list_head *head = &root->fs_info->delalloc_inodes; |
5482 | struct btrfs_inode *binode; | 5626 | struct btrfs_inode *binode; |
@@ -5495,7 +5639,10 @@ int btrfs_start_delalloc_inodes(struct btrfs_root *root) | |||
5495 | spin_unlock(&root->fs_info->delalloc_lock); | 5639 | spin_unlock(&root->fs_info->delalloc_lock); |
5496 | if (inode) { | 5640 | if (inode) { |
5497 | filemap_flush(inode->i_mapping); | 5641 | filemap_flush(inode->i_mapping); |
5498 | iput(inode); | 5642 | if (delay_iput) |
5643 | btrfs_add_delayed_iput(inode); | ||
5644 | else | ||
5645 | iput(inode); | ||
5499 | } | 5646 | } |
5500 | cond_resched(); | 5647 | cond_resched(); |
5501 | spin_lock(&root->fs_info->delalloc_lock); | 5648 | spin_lock(&root->fs_info->delalloc_lock); |
@@ -5569,7 +5716,7 @@ static int btrfs_symlink(struct inode *dir, struct dentry *dentry, | |||
5569 | if (IS_ERR(inode)) | 5716 | if (IS_ERR(inode)) |
5570 | goto out_unlock; | 5717 | goto out_unlock; |
5571 | 5718 | ||
5572 | err = btrfs_init_inode_security(inode, dir); | 5719 | err = btrfs_init_inode_security(trans, inode, dir); |
5573 | if (err) { | 5720 | if (err) { |
5574 | drop_inode = 1; | 5721 | drop_inode = 1; |
5575 | goto out_unlock; | 5722 | goto out_unlock; |
@@ -5641,10 +5788,10 @@ out_fail: | |||
5641 | return err; | 5788 | return err; |
5642 | } | 5789 | } |
5643 | 5790 | ||
5644 | static int prealloc_file_range(struct btrfs_trans_handle *trans, | 5791 | static int prealloc_file_range(struct inode *inode, u64 start, u64 end, |
5645 | struct inode *inode, u64 start, u64 end, | 5792 | u64 alloc_hint, int mode) |
5646 | u64 locked_end, u64 alloc_hint, int mode) | ||
5647 | { | 5793 | { |
5794 | struct btrfs_trans_handle *trans; | ||
5648 | struct btrfs_root *root = BTRFS_I(inode)->root; | 5795 | struct btrfs_root *root = BTRFS_I(inode)->root; |
5649 | struct btrfs_key ins; | 5796 | struct btrfs_key ins; |
5650 | u64 alloc_size; | 5797 | u64 alloc_size; |
@@ -5655,43 +5802,56 @@ static int prealloc_file_range(struct btrfs_trans_handle *trans, | |||
5655 | while (num_bytes > 0) { | 5802 | while (num_bytes > 0) { |
5656 | alloc_size = min(num_bytes, root->fs_info->max_extent); | 5803 | alloc_size = min(num_bytes, root->fs_info->max_extent); |
5657 | 5804 | ||
5658 | ret = btrfs_reserve_metadata_space(root, 1); | 5805 | trans = btrfs_start_transaction(root, 1); |
5659 | if (ret) | ||
5660 | goto out; | ||
5661 | 5806 | ||
5662 | ret = btrfs_reserve_extent(trans, root, alloc_size, | 5807 | ret = btrfs_reserve_extent(trans, root, alloc_size, |
5663 | root->sectorsize, 0, alloc_hint, | 5808 | root->sectorsize, 0, alloc_hint, |
5664 | (u64)-1, &ins, 1); | 5809 | (u64)-1, &ins, 1); |
5665 | if (ret) { | 5810 | if (ret) { |
5666 | WARN_ON(1); | 5811 | WARN_ON(1); |
5667 | goto out; | 5812 | goto stop_trans; |
5813 | } | ||
5814 | |||
5815 | ret = btrfs_reserve_metadata_space(root, 3); | ||
5816 | if (ret) { | ||
5817 | btrfs_free_reserved_extent(root, ins.objectid, | ||
5818 | ins.offset); | ||
5819 | goto stop_trans; | ||
5668 | } | 5820 | } |
5821 | |||
5669 | ret = insert_reserved_file_extent(trans, inode, | 5822 | ret = insert_reserved_file_extent(trans, inode, |
5670 | cur_offset, ins.objectid, | 5823 | cur_offset, ins.objectid, |
5671 | ins.offset, ins.offset, | 5824 | ins.offset, ins.offset, |
5672 | ins.offset, locked_end, | 5825 | ins.offset, 0, 0, 0, |
5673 | 0, 0, 0, | ||
5674 | BTRFS_FILE_EXTENT_PREALLOC); | 5826 | BTRFS_FILE_EXTENT_PREALLOC); |
5675 | BUG_ON(ret); | 5827 | BUG_ON(ret); |
5676 | btrfs_drop_extent_cache(inode, cur_offset, | 5828 | btrfs_drop_extent_cache(inode, cur_offset, |
5677 | cur_offset + ins.offset -1, 0); | 5829 | cur_offset + ins.offset -1, 0); |
5830 | |||
5678 | num_bytes -= ins.offset; | 5831 | num_bytes -= ins.offset; |
5679 | cur_offset += ins.offset; | 5832 | cur_offset += ins.offset; |
5680 | alloc_hint = ins.objectid + ins.offset; | 5833 | alloc_hint = ins.objectid + ins.offset; |
5681 | btrfs_unreserve_metadata_space(root, 1); | 5834 | |
5682 | } | ||
5683 | out: | ||
5684 | if (cur_offset > start) { | ||
5685 | inode->i_ctime = CURRENT_TIME; | 5835 | inode->i_ctime = CURRENT_TIME; |
5686 | BTRFS_I(inode)->flags |= BTRFS_INODE_PREALLOC; | 5836 | BTRFS_I(inode)->flags |= BTRFS_INODE_PREALLOC; |
5687 | if (!(mode & FALLOC_FL_KEEP_SIZE) && | 5837 | if (!(mode & FALLOC_FL_KEEP_SIZE) && |
5688 | cur_offset > i_size_read(inode)) | 5838 | cur_offset > inode->i_size) { |
5689 | btrfs_i_size_write(inode, cur_offset); | 5839 | i_size_write(inode, cur_offset); |
5840 | btrfs_ordered_update_i_size(inode, cur_offset, NULL); | ||
5841 | } | ||
5842 | |||
5690 | ret = btrfs_update_inode(trans, root, inode); | 5843 | ret = btrfs_update_inode(trans, root, inode); |
5691 | BUG_ON(ret); | 5844 | BUG_ON(ret); |
5845 | |||
5846 | btrfs_end_transaction(trans, root); | ||
5847 | btrfs_unreserve_metadata_space(root, 3); | ||
5692 | } | 5848 | } |
5849 | return ret; | ||
5693 | 5850 | ||
5851 | stop_trans: | ||
5852 | btrfs_end_transaction(trans, root); | ||
5694 | return ret; | 5853 | return ret; |
5854 | |||
5695 | } | 5855 | } |
5696 | 5856 | ||
5697 | static long btrfs_fallocate(struct inode *inode, int mode, | 5857 | static long btrfs_fallocate(struct inode *inode, int mode, |
@@ -5705,8 +5865,6 @@ static long btrfs_fallocate(struct inode *inode, int mode, | |||
5705 | u64 locked_end; | 5865 | u64 locked_end; |
5706 | u64 mask = BTRFS_I(inode)->root->sectorsize - 1; | 5866 | u64 mask = BTRFS_I(inode)->root->sectorsize - 1; |
5707 | struct extent_map *em; | 5867 | struct extent_map *em; |
5708 | struct btrfs_trans_handle *trans; | ||
5709 | struct btrfs_root *root; | ||
5710 | int ret; | 5868 | int ret; |
5711 | 5869 | ||
5712 | alloc_start = offset & ~mask; | 5870 | alloc_start = offset & ~mask; |
@@ -5725,9 +5883,7 @@ static long btrfs_fallocate(struct inode *inode, int mode, | |||
5725 | goto out; | 5883 | goto out; |
5726 | } | 5884 | } |
5727 | 5885 | ||
5728 | root = BTRFS_I(inode)->root; | 5886 | ret = btrfs_check_data_free_space(BTRFS_I(inode)->root, inode, |
5729 | |||
5730 | ret = btrfs_check_data_free_space(root, inode, | ||
5731 | alloc_end - alloc_start); | 5887 | alloc_end - alloc_start); |
5732 | if (ret) | 5888 | if (ret) |
5733 | goto out; | 5889 | goto out; |
@@ -5736,12 +5892,6 @@ static long btrfs_fallocate(struct inode *inode, int mode, | |||
5736 | while (1) { | 5892 | while (1) { |
5737 | struct btrfs_ordered_extent *ordered; | 5893 | struct btrfs_ordered_extent *ordered; |
5738 | 5894 | ||
5739 | trans = btrfs_start_transaction(BTRFS_I(inode)->root, 1); | ||
5740 | if (!trans) { | ||
5741 | ret = -EIO; | ||
5742 | goto out_free; | ||
5743 | } | ||
5744 | |||
5745 | /* the extent lock is ordered inside the running | 5895 | /* the extent lock is ordered inside the running |
5746 | * transaction | 5896 | * transaction |
5747 | */ | 5897 | */ |
@@ -5755,8 +5905,6 @@ static long btrfs_fallocate(struct inode *inode, int mode, | |||
5755 | btrfs_put_ordered_extent(ordered); | 5905 | btrfs_put_ordered_extent(ordered); |
5756 | unlock_extent(&BTRFS_I(inode)->io_tree, | 5906 | unlock_extent(&BTRFS_I(inode)->io_tree, |
5757 | alloc_start, locked_end, GFP_NOFS); | 5907 | alloc_start, locked_end, GFP_NOFS); |
5758 | btrfs_end_transaction(trans, BTRFS_I(inode)->root); | ||
5759 | |||
5760 | /* | 5908 | /* |
5761 | * we can't wait on the range with the transaction | 5909 | * we can't wait on the range with the transaction |
5762 | * running or with the extent lock held | 5910 | * running or with the extent lock held |
@@ -5777,10 +5925,12 @@ static long btrfs_fallocate(struct inode *inode, int mode, | |||
5777 | BUG_ON(IS_ERR(em) || !em); | 5925 | BUG_ON(IS_ERR(em) || !em); |
5778 | last_byte = min(extent_map_end(em), alloc_end); | 5926 | last_byte = min(extent_map_end(em), alloc_end); |
5779 | last_byte = (last_byte + mask) & ~mask; | 5927 | last_byte = (last_byte + mask) & ~mask; |
5780 | if (em->block_start == EXTENT_MAP_HOLE) { | 5928 | if (em->block_start == EXTENT_MAP_HOLE || |
5781 | ret = prealloc_file_range(trans, inode, cur_offset, | 5929 | (cur_offset >= inode->i_size && |
5782 | last_byte, locked_end + 1, | 5930 | !test_bit(EXTENT_FLAG_PREALLOC, &em->flags))) { |
5783 | alloc_hint, mode); | 5931 | ret = prealloc_file_range(inode, |
5932 | cur_offset, last_byte, | ||
5933 | alloc_hint, mode); | ||
5784 | if (ret < 0) { | 5934 | if (ret < 0) { |
5785 | free_extent_map(em); | 5935 | free_extent_map(em); |
5786 | break; | 5936 | break; |
@@ -5799,9 +5949,8 @@ static long btrfs_fallocate(struct inode *inode, int mode, | |||
5799 | unlock_extent(&BTRFS_I(inode)->io_tree, alloc_start, locked_end, | 5949 | unlock_extent(&BTRFS_I(inode)->io_tree, alloc_start, locked_end, |
5800 | GFP_NOFS); | 5950 | GFP_NOFS); |
5801 | 5951 | ||
5802 | btrfs_end_transaction(trans, BTRFS_I(inode)->root); | 5952 | btrfs_free_reserved_data_space(BTRFS_I(inode)->root, inode, |
5803 | out_free: | 5953 | alloc_end - alloc_start); |
5804 | btrfs_free_reserved_data_space(root, inode, alloc_end - alloc_start); | ||
5805 | out: | 5954 | out: |
5806 | mutex_unlock(&inode->i_mutex); | 5955 | mutex_unlock(&inode->i_mutex); |
5807 | return ret; | 5956 | return ret; |