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; |
