diff options
Diffstat (limited to 'fs/btrfs/inode.c')
| -rw-r--r-- | fs/btrfs/inode.c | 1064 |
1 files changed, 890 insertions, 174 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 55c07b650378..c226daefd65d 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
| @@ -39,12 +39,13 @@ | |||
| 39 | #include <linux/slab.h> | 39 | #include <linux/slab.h> |
| 40 | #include <linux/ratelimit.h> | 40 | #include <linux/ratelimit.h> |
| 41 | #include <linux/mount.h> | 41 | #include <linux/mount.h> |
| 42 | #include <linux/btrfs.h> | ||
| 43 | #include <linux/blkdev.h> | ||
| 42 | #include "compat.h" | 44 | #include "compat.h" |
| 43 | #include "ctree.h" | 45 | #include "ctree.h" |
| 44 | #include "disk-io.h" | 46 | #include "disk-io.h" |
| 45 | #include "transaction.h" | 47 | #include "transaction.h" |
| 46 | #include "btrfs_inode.h" | 48 | #include "btrfs_inode.h" |
| 47 | #include "ioctl.h" | ||
| 48 | #include "print-tree.h" | 49 | #include "print-tree.h" |
| 49 | #include "ordered-data.h" | 50 | #include "ordered-data.h" |
| 50 | #include "xattr.h" | 51 | #include "xattr.h" |
| @@ -54,6 +55,7 @@ | |||
| 54 | #include "locking.h" | 55 | #include "locking.h" |
| 55 | #include "free-space-cache.h" | 56 | #include "free-space-cache.h" |
| 56 | #include "inode-map.h" | 57 | #include "inode-map.h" |
| 58 | #include "backref.h" | ||
| 57 | 59 | ||
| 58 | struct btrfs_iget_args { | 60 | struct btrfs_iget_args { |
| 59 | u64 ino; | 61 | u64 ino; |
| @@ -231,8 +233,7 @@ static noinline int cow_file_range_inline(struct btrfs_trans_handle *trans, | |||
| 231 | u64 isize = i_size_read(inode); | 233 | u64 isize = i_size_read(inode); |
| 232 | u64 actual_end = min(end + 1, isize); | 234 | u64 actual_end = min(end + 1, isize); |
| 233 | u64 inline_len = actual_end - start; | 235 | u64 inline_len = actual_end - start; |
| 234 | u64 aligned_end = (end + root->sectorsize - 1) & | 236 | u64 aligned_end = ALIGN(end, root->sectorsize); |
| 235 | ~((u64)root->sectorsize - 1); | ||
| 236 | u64 data_len = inline_len; | 237 | u64 data_len = inline_len; |
| 237 | int ret; | 238 | int ret; |
| 238 | 239 | ||
| @@ -265,6 +266,7 @@ static noinline int cow_file_range_inline(struct btrfs_trans_handle *trans, | |||
| 265 | return 1; | 266 | return 1; |
| 266 | } | 267 | } |
| 267 | 268 | ||
| 269 | set_bit(BTRFS_INODE_NEEDS_FULL_SYNC, &BTRFS_I(inode)->runtime_flags); | ||
| 268 | btrfs_delalloc_release_metadata(inode, end + 1 - start); | 270 | btrfs_delalloc_release_metadata(inode, end + 1 - start); |
| 269 | btrfs_drop_extent_cache(inode, start, aligned_end - 1, 0); | 271 | btrfs_drop_extent_cache(inode, start, aligned_end - 1, 0); |
| 270 | return 0; | 272 | return 0; |
| @@ -389,7 +391,7 @@ again: | |||
| 389 | * a compressed extent to 128k. | 391 | * a compressed extent to 128k. |
| 390 | */ | 392 | */ |
| 391 | total_compressed = min(total_compressed, max_uncompressed); | 393 | total_compressed = min(total_compressed, max_uncompressed); |
| 392 | num_bytes = (end - start + blocksize) & ~(blocksize - 1); | 394 | num_bytes = ALIGN(end - start + 1, blocksize); |
| 393 | num_bytes = max(blocksize, num_bytes); | 395 | num_bytes = max(blocksize, num_bytes); |
| 394 | total_in = 0; | 396 | total_in = 0; |
| 395 | ret = 0; | 397 | ret = 0; |
| @@ -488,15 +490,13 @@ cont: | |||
| 488 | * up to a block size boundary so the allocator does sane | 490 | * up to a block size boundary so the allocator does sane |
| 489 | * things | 491 | * things |
| 490 | */ | 492 | */ |
| 491 | total_compressed = (total_compressed + blocksize - 1) & | 493 | total_compressed = ALIGN(total_compressed, blocksize); |
| 492 | ~(blocksize - 1); | ||
| 493 | 494 | ||
| 494 | /* | 495 | /* |
| 495 | * one last check to make sure the compression is really a | 496 | * one last check to make sure the compression is really a |
| 496 | * win, compare the page count read with the blocks on disk | 497 | * win, compare the page count read with the blocks on disk |
| 497 | */ | 498 | */ |
| 498 | total_in = (total_in + PAGE_CACHE_SIZE - 1) & | 499 | total_in = ALIGN(total_in, PAGE_CACHE_SIZE); |
| 499 | ~(PAGE_CACHE_SIZE - 1); | ||
| 500 | if (total_compressed >= total_in) { | 500 | if (total_compressed >= total_in) { |
| 501 | will_compress = 0; | 501 | will_compress = 0; |
| 502 | } else { | 502 | } else { |
| @@ -608,7 +608,7 @@ static noinline int submit_compressed_extents(struct inode *inode, | |||
| 608 | if (list_empty(&async_cow->extents)) | 608 | if (list_empty(&async_cow->extents)) |
| 609 | return 0; | 609 | return 0; |
| 610 | 610 | ||
| 611 | 611 | again: | |
| 612 | while (!list_empty(&async_cow->extents)) { | 612 | while (!list_empty(&async_cow->extents)) { |
| 613 | async_extent = list_entry(async_cow->extents.next, | 613 | async_extent = list_entry(async_cow->extents.next, |
| 614 | struct async_extent, list); | 614 | struct async_extent, list); |
| @@ -648,6 +648,8 @@ retry: | |||
| 648 | async_extent->ram_size - 1, | 648 | async_extent->ram_size - 1, |
| 649 | btrfs_get_extent, | 649 | btrfs_get_extent, |
| 650 | WB_SYNC_ALL); | 650 | WB_SYNC_ALL); |
| 651 | else if (ret) | ||
| 652 | unlock_page(async_cow->locked_page); | ||
| 651 | kfree(async_extent); | 653 | kfree(async_extent); |
| 652 | cond_resched(); | 654 | cond_resched(); |
| 653 | continue; | 655 | continue; |
| @@ -672,6 +674,7 @@ retry: | |||
| 672 | 674 | ||
| 673 | if (ret) { | 675 | if (ret) { |
| 674 | int i; | 676 | int i; |
| 677 | |||
| 675 | for (i = 0; i < async_extent->nr_pages; i++) { | 678 | for (i = 0; i < async_extent->nr_pages; i++) { |
| 676 | WARN_ON(async_extent->pages[i]->mapping); | 679 | WARN_ON(async_extent->pages[i]->mapping); |
| 677 | page_cache_release(async_extent->pages[i]); | 680 | page_cache_release(async_extent->pages[i]); |
| @@ -679,12 +682,10 @@ retry: | |||
| 679 | kfree(async_extent->pages); | 682 | kfree(async_extent->pages); |
| 680 | async_extent->nr_pages = 0; | 683 | async_extent->nr_pages = 0; |
| 681 | async_extent->pages = NULL; | 684 | async_extent->pages = NULL; |
| 682 | unlock_extent(io_tree, async_extent->start, | 685 | |
| 683 | async_extent->start + | ||
| 684 | async_extent->ram_size - 1); | ||
| 685 | if (ret == -ENOSPC) | 686 | if (ret == -ENOSPC) |
| 686 | goto retry; | 687 | goto retry; |
| 687 | goto out_free; /* JDM: Requeue? */ | 688 | goto out_free; |
| 688 | } | 689 | } |
| 689 | 690 | ||
| 690 | /* | 691 | /* |
| @@ -696,10 +697,13 @@ retry: | |||
| 696 | async_extent->ram_size - 1, 0); | 697 | async_extent->ram_size - 1, 0); |
| 697 | 698 | ||
| 698 | em = alloc_extent_map(); | 699 | em = alloc_extent_map(); |
| 699 | BUG_ON(!em); /* -ENOMEM */ | 700 | if (!em) |
| 701 | goto out_free_reserve; | ||
| 700 | em->start = async_extent->start; | 702 | em->start = async_extent->start; |
| 701 | em->len = async_extent->ram_size; | 703 | em->len = async_extent->ram_size; |
| 702 | em->orig_start = em->start; | 704 | em->orig_start = em->start; |
| 705 | em->mod_start = em->start; | ||
| 706 | em->mod_len = em->len; | ||
| 703 | 707 | ||
| 704 | em->block_start = ins.objectid; | 708 | em->block_start = ins.objectid; |
| 705 | em->block_len = ins.offset; | 709 | em->block_len = ins.offset; |
| @@ -726,6 +730,9 @@ retry: | |||
| 726 | async_extent->ram_size - 1, 0); | 730 | async_extent->ram_size - 1, 0); |
| 727 | } | 731 | } |
| 728 | 732 | ||
| 733 | if (ret) | ||
| 734 | goto out_free_reserve; | ||
| 735 | |||
| 729 | ret = btrfs_add_ordered_extent_compress(inode, | 736 | ret = btrfs_add_ordered_extent_compress(inode, |
| 730 | async_extent->start, | 737 | async_extent->start, |
| 731 | ins.objectid, | 738 | ins.objectid, |
| @@ -733,7 +740,8 @@ retry: | |||
| 733 | ins.offset, | 740 | ins.offset, |
| 734 | BTRFS_ORDERED_COMPRESSED, | 741 | BTRFS_ORDERED_COMPRESSED, |
| 735 | async_extent->compress_type); | 742 | async_extent->compress_type); |
| 736 | BUG_ON(ret); /* -ENOMEM */ | 743 | if (ret) |
| 744 | goto out_free_reserve; | ||
| 737 | 745 | ||
| 738 | /* | 746 | /* |
| 739 | * clear dirty, set writeback and unlock the pages. | 747 | * clear dirty, set writeback and unlock the pages. |
| @@ -754,18 +762,30 @@ retry: | |||
| 754 | ins.objectid, | 762 | ins.objectid, |
| 755 | ins.offset, async_extent->pages, | 763 | ins.offset, async_extent->pages, |
| 756 | async_extent->nr_pages); | 764 | async_extent->nr_pages); |
| 757 | |||
| 758 | BUG_ON(ret); /* -ENOMEM */ | ||
| 759 | alloc_hint = ins.objectid + ins.offset; | 765 | alloc_hint = ins.objectid + ins.offset; |
| 760 | kfree(async_extent); | 766 | kfree(async_extent); |
| 767 | if (ret) | ||
| 768 | goto out; | ||
| 761 | cond_resched(); | 769 | cond_resched(); |
| 762 | } | 770 | } |
| 763 | ret = 0; | 771 | ret = 0; |
| 764 | out: | 772 | out: |
| 765 | return ret; | 773 | return ret; |
| 774 | out_free_reserve: | ||
| 775 | btrfs_free_reserved_extent(root, ins.objectid, ins.offset); | ||
| 766 | out_free: | 776 | out_free: |
| 777 | extent_clear_unlock_delalloc(inode, &BTRFS_I(inode)->io_tree, | ||
| 778 | async_extent->start, | ||
| 779 | async_extent->start + | ||
| 780 | async_extent->ram_size - 1, | ||
| 781 | NULL, EXTENT_CLEAR_UNLOCK_PAGE | | ||
| 782 | EXTENT_CLEAR_UNLOCK | | ||
| 783 | EXTENT_CLEAR_DELALLOC | | ||
| 784 | EXTENT_CLEAR_DIRTY | | ||
| 785 | EXTENT_SET_WRITEBACK | | ||
| 786 | EXTENT_END_WRITEBACK); | ||
| 767 | kfree(async_extent); | 787 | kfree(async_extent); |
| 768 | goto out; | 788 | goto again; |
| 769 | } | 789 | } |
| 770 | 790 | ||
| 771 | static u64 get_extent_allocation_hint(struct inode *inode, u64 start, | 791 | static u64 get_extent_allocation_hint(struct inode *inode, u64 start, |
| @@ -834,7 +854,7 @@ static noinline int __cow_file_range(struct btrfs_trans_handle *trans, | |||
| 834 | 854 | ||
| 835 | BUG_ON(btrfs_is_free_space_inode(inode)); | 855 | BUG_ON(btrfs_is_free_space_inode(inode)); |
| 836 | 856 | ||
| 837 | num_bytes = (end - start + blocksize) & ~(blocksize - 1); | 857 | num_bytes = ALIGN(end - start + 1, blocksize); |
| 838 | num_bytes = max(blocksize, num_bytes); | 858 | num_bytes = max(blocksize, num_bytes); |
| 839 | disk_num_bytes = num_bytes; | 859 | disk_num_bytes = num_bytes; |
| 840 | 860 | ||
| @@ -892,6 +912,8 @@ static noinline int __cow_file_range(struct btrfs_trans_handle *trans, | |||
| 892 | em->orig_start = em->start; | 912 | em->orig_start = em->start; |
| 893 | ram_size = ins.offset; | 913 | ram_size = ins.offset; |
| 894 | em->len = ins.offset; | 914 | em->len = ins.offset; |
| 915 | em->mod_start = em->start; | ||
| 916 | em->mod_len = em->len; | ||
| 895 | 917 | ||
| 896 | em->block_start = ins.objectid; | 918 | em->block_start = ins.objectid; |
| 897 | em->block_len = ins.offset; | 919 | em->block_len = ins.offset; |
| @@ -1338,6 +1360,8 @@ out_check: | |||
| 1338 | em->block_start = disk_bytenr; | 1360 | em->block_start = disk_bytenr; |
| 1339 | em->orig_block_len = disk_num_bytes; | 1361 | em->orig_block_len = disk_num_bytes; |
| 1340 | em->bdev = root->fs_info->fs_devices->latest_bdev; | 1362 | em->bdev = root->fs_info->fs_devices->latest_bdev; |
| 1363 | em->mod_start = em->start; | ||
| 1364 | em->mod_len = em->len; | ||
| 1341 | set_bit(EXTENT_FLAG_PINNED, &em->flags); | 1365 | set_bit(EXTENT_FLAG_PINNED, &em->flags); |
| 1342 | set_bit(EXTENT_FLAG_FILLING, &em->flags); | 1366 | set_bit(EXTENT_FLAG_FILLING, &em->flags); |
| 1343 | em->generation = -1; | 1367 | em->generation = -1; |
| @@ -1508,14 +1532,22 @@ static void btrfs_set_bit_hook(struct inode *inode, | |||
| 1508 | spin_unlock(&BTRFS_I(inode)->lock); | 1532 | spin_unlock(&BTRFS_I(inode)->lock); |
| 1509 | } | 1533 | } |
| 1510 | 1534 | ||
| 1511 | spin_lock(&root->fs_info->delalloc_lock); | 1535 | __percpu_counter_add(&root->fs_info->delalloc_bytes, len, |
| 1536 | root->fs_info->delalloc_batch); | ||
| 1537 | spin_lock(&BTRFS_I(inode)->lock); | ||
| 1512 | BTRFS_I(inode)->delalloc_bytes += len; | 1538 | BTRFS_I(inode)->delalloc_bytes += len; |
| 1513 | root->fs_info->delalloc_bytes += len; | 1539 | if (do_list && !test_bit(BTRFS_INODE_IN_DELALLOC_LIST, |
| 1514 | if (do_list && list_empty(&BTRFS_I(inode)->delalloc_inodes)) { | 1540 | &BTRFS_I(inode)->runtime_flags)) { |
| 1515 | list_add_tail(&BTRFS_I(inode)->delalloc_inodes, | 1541 | spin_lock(&root->fs_info->delalloc_lock); |
| 1516 | &root->fs_info->delalloc_inodes); | 1542 | if (list_empty(&BTRFS_I(inode)->delalloc_inodes)) { |
| 1543 | list_add_tail(&BTRFS_I(inode)->delalloc_inodes, | ||
| 1544 | &root->fs_info->delalloc_inodes); | ||
| 1545 | set_bit(BTRFS_INODE_IN_DELALLOC_LIST, | ||
| 1546 | &BTRFS_I(inode)->runtime_flags); | ||
| 1547 | } | ||
| 1548 | spin_unlock(&root->fs_info->delalloc_lock); | ||
| 1517 | } | 1549 | } |
| 1518 | spin_unlock(&root->fs_info->delalloc_lock); | 1550 | spin_unlock(&BTRFS_I(inode)->lock); |
| 1519 | } | 1551 | } |
| 1520 | } | 1552 | } |
| 1521 | 1553 | ||
| @@ -1550,15 +1582,22 @@ static void btrfs_clear_bit_hook(struct inode *inode, | |||
| 1550 | && do_list) | 1582 | && do_list) |
| 1551 | btrfs_free_reserved_data_space(inode, len); | 1583 | btrfs_free_reserved_data_space(inode, len); |
| 1552 | 1584 | ||
| 1553 | spin_lock(&root->fs_info->delalloc_lock); | 1585 | __percpu_counter_add(&root->fs_info->delalloc_bytes, -len, |
| 1554 | root->fs_info->delalloc_bytes -= len; | 1586 | root->fs_info->delalloc_batch); |
| 1587 | spin_lock(&BTRFS_I(inode)->lock); | ||
| 1555 | BTRFS_I(inode)->delalloc_bytes -= len; | 1588 | BTRFS_I(inode)->delalloc_bytes -= len; |
| 1556 | |||
| 1557 | if (do_list && BTRFS_I(inode)->delalloc_bytes == 0 && | 1589 | if (do_list && BTRFS_I(inode)->delalloc_bytes == 0 && |
| 1558 | !list_empty(&BTRFS_I(inode)->delalloc_inodes)) { | 1590 | test_bit(BTRFS_INODE_IN_DELALLOC_LIST, |
| 1559 | list_del_init(&BTRFS_I(inode)->delalloc_inodes); | 1591 | &BTRFS_I(inode)->runtime_flags)) { |
| 1592 | spin_lock(&root->fs_info->delalloc_lock); | ||
| 1593 | if (!list_empty(&BTRFS_I(inode)->delalloc_inodes)) { | ||
| 1594 | list_del_init(&BTRFS_I(inode)->delalloc_inodes); | ||
| 1595 | clear_bit(BTRFS_INODE_IN_DELALLOC_LIST, | ||
| 1596 | &BTRFS_I(inode)->runtime_flags); | ||
| 1597 | } | ||
| 1598 | spin_unlock(&root->fs_info->delalloc_lock); | ||
| 1560 | } | 1599 | } |
| 1561 | spin_unlock(&root->fs_info->delalloc_lock); | 1600 | spin_unlock(&BTRFS_I(inode)->lock); |
| 1562 | } | 1601 | } |
| 1563 | } | 1602 | } |
| 1564 | 1603 | ||
| @@ -1566,7 +1605,7 @@ static void btrfs_clear_bit_hook(struct inode *inode, | |||
| 1566 | * extent_io.c merge_bio_hook, this must check the chunk tree to make sure | 1605 | * extent_io.c merge_bio_hook, this must check the chunk tree to make sure |
| 1567 | * we don't create bios that span stripes or chunks | 1606 | * we don't create bios that span stripes or chunks |
| 1568 | */ | 1607 | */ |
| 1569 | int btrfs_merge_bio_hook(struct page *page, unsigned long offset, | 1608 | int btrfs_merge_bio_hook(int rw, struct page *page, unsigned long offset, |
| 1570 | size_t size, struct bio *bio, | 1609 | size_t size, struct bio *bio, |
| 1571 | unsigned long bio_flags) | 1610 | unsigned long bio_flags) |
| 1572 | { | 1611 | { |
| @@ -1581,7 +1620,7 @@ int btrfs_merge_bio_hook(struct page *page, unsigned long offset, | |||
| 1581 | 1620 | ||
| 1582 | length = bio->bi_size; | 1621 | length = bio->bi_size; |
| 1583 | map_length = length; | 1622 | map_length = length; |
| 1584 | ret = btrfs_map_block(root->fs_info, READ, logical, | 1623 | ret = btrfs_map_block(root->fs_info, rw, logical, |
| 1585 | &map_length, NULL, 0); | 1624 | &map_length, NULL, 0); |
| 1586 | /* Will always return 0 with map_multi == NULL */ | 1625 | /* Will always return 0 with map_multi == NULL */ |
| 1587 | BUG_ON(ret < 0); | 1626 | BUG_ON(ret < 0); |
| @@ -1892,6 +1931,640 @@ out: | |||
| 1892 | return ret; | 1931 | return ret; |
| 1893 | } | 1932 | } |
| 1894 | 1933 | ||
| 1934 | /* snapshot-aware defrag */ | ||
| 1935 | struct sa_defrag_extent_backref { | ||
| 1936 | struct rb_node node; | ||
| 1937 | struct old_sa_defrag_extent *old; | ||
| 1938 | u64 root_id; | ||
| 1939 | u64 inum; | ||
| 1940 | u64 file_pos; | ||
| 1941 | u64 extent_offset; | ||
| 1942 | u64 num_bytes; | ||
| 1943 | u64 generation; | ||
| 1944 | }; | ||
| 1945 | |||
| 1946 | struct old_sa_defrag_extent { | ||
| 1947 | struct list_head list; | ||
| 1948 | struct new_sa_defrag_extent *new; | ||
| 1949 | |||
| 1950 | u64 extent_offset; | ||
| 1951 | u64 bytenr; | ||
| 1952 | u64 offset; | ||
| 1953 | u64 len; | ||
| 1954 | int count; | ||
| 1955 | }; | ||
| 1956 | |||
| 1957 | struct new_sa_defrag_extent { | ||
| 1958 | struct rb_root root; | ||
| 1959 | struct list_head head; | ||
| 1960 | struct btrfs_path *path; | ||
| 1961 | struct inode *inode; | ||
| 1962 | u64 file_pos; | ||
| 1963 | u64 len; | ||
| 1964 | u64 bytenr; | ||
| 1965 | u64 disk_len; | ||
| 1966 | u8 compress_type; | ||
| 1967 | }; | ||
| 1968 | |||
| 1969 | static int backref_comp(struct sa_defrag_extent_backref *b1, | ||
| 1970 | struct sa_defrag_extent_backref *b2) | ||
| 1971 | { | ||
| 1972 | if (b1->root_id < b2->root_id) | ||
| 1973 | return -1; | ||
| 1974 | else if (b1->root_id > b2->root_id) | ||
| 1975 | return 1; | ||
| 1976 | |||
| 1977 | if (b1->inum < b2->inum) | ||
| 1978 | return -1; | ||
| 1979 | else if (b1->inum > b2->inum) | ||
| 1980 | return 1; | ||
| 1981 | |||
| 1982 | if (b1->file_pos < b2->file_pos) | ||
| 1983 | return -1; | ||
| 1984 | else if (b1->file_pos > b2->file_pos) | ||
| 1985 | return 1; | ||
| 1986 | |||
| 1987 | /* | ||
| 1988 | * [------------------------------] ===> (a range of space) | ||
| 1989 | * |<--->| |<---->| =============> (fs/file tree A) | ||
| 1990 | * |<---------------------------->| ===> (fs/file tree B) | ||
| 1991 | * | ||
| 1992 | * A range of space can refer to two file extents in one tree while | ||
| 1993 | * refer to only one file extent in another tree. | ||
| 1994 | * | ||
| 1995 | * So we may process a disk offset more than one time(two extents in A) | ||
| 1996 | * and locate at the same extent(one extent in B), then insert two same | ||
| 1997 | * backrefs(both refer to the extent in B). | ||
| 1998 | */ | ||
| 1999 | return 0; | ||
| 2000 | } | ||
| 2001 | |||
| 2002 | static void backref_insert(struct rb_root *root, | ||
| 2003 | struct sa_defrag_extent_backref *backref) | ||
| 2004 | { | ||
| 2005 | struct rb_node **p = &root->rb_node; | ||
| 2006 | struct rb_node *parent = NULL; | ||
| 2007 | struct sa_defrag_extent_backref *entry; | ||
| 2008 | int ret; | ||
| 2009 | |||
| 2010 | while (*p) { | ||
| 2011 | parent = *p; | ||
| 2012 | entry = rb_entry(parent, struct sa_defrag_extent_backref, node); | ||
| 2013 | |||
| 2014 | ret = backref_comp(backref, entry); | ||
| 2015 | if (ret < 0) | ||
| 2016 | p = &(*p)->rb_left; | ||
| 2017 | else | ||
| 2018 | p = &(*p)->rb_right; | ||
| 2019 | } | ||
| 2020 | |||
| 2021 | rb_link_node(&backref->node, parent, p); | ||
| 2022 | rb_insert_color(&backref->node, root); | ||
| 2023 | } | ||
| 2024 | |||
| 2025 | /* | ||
| 2026 | * Note the backref might has changed, and in this case we just return 0. | ||
| 2027 | */ | ||
| 2028 | static noinline int record_one_backref(u64 inum, u64 offset, u64 root_id, | ||
| 2029 | void *ctx) | ||
| 2030 | { | ||
| 2031 | struct btrfs_file_extent_item *extent; | ||
| 2032 | struct btrfs_fs_info *fs_info; | ||
| 2033 | struct old_sa_defrag_extent *old = ctx; | ||
| 2034 | struct new_sa_defrag_extent *new = old->new; | ||
| 2035 | struct btrfs_path *path = new->path; | ||
| 2036 | struct btrfs_key key; | ||
| 2037 | struct btrfs_root *root; | ||
| 2038 | struct sa_defrag_extent_backref *backref; | ||
| 2039 | struct extent_buffer *leaf; | ||
| 2040 | struct inode *inode = new->inode; | ||
| 2041 | int slot; | ||
| 2042 | int ret; | ||
| 2043 | u64 extent_offset; | ||
| 2044 | u64 num_bytes; | ||
| 2045 | |||
| 2046 | if (BTRFS_I(inode)->root->root_key.objectid == root_id && | ||
| 2047 | inum == btrfs_ino(inode)) | ||
| 2048 | return 0; | ||
| 2049 | |||
| 2050 | key.objectid = root_id; | ||
| 2051 | key.type = BTRFS_ROOT_ITEM_KEY; | ||
| 2052 | key.offset = (u64)-1; | ||
| 2053 | |||
| 2054 | fs_info = BTRFS_I(inode)->root->fs_info; | ||
| 2055 | root = btrfs_read_fs_root_no_name(fs_info, &key); | ||
| 2056 | if (IS_ERR(root)) { | ||
| 2057 | if (PTR_ERR(root) == -ENOENT) | ||
| 2058 | return 0; | ||
| 2059 | WARN_ON(1); | ||
| 2060 | pr_debug("inum=%llu, offset=%llu, root_id=%llu\n", | ||
| 2061 | inum, offset, root_id); | ||
| 2062 | return PTR_ERR(root); | ||
| 2063 | } | ||
| 2064 | |||
| 2065 | key.objectid = inum; | ||
| 2066 | key.type = BTRFS_EXTENT_DATA_KEY; | ||
| 2067 | if (offset > (u64)-1 << 32) | ||
| 2068 | key.offset = 0; | ||
| 2069 | else | ||
| 2070 | key.offset = offset; | ||
| 2071 | |||
| 2072 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); | ||
| 2073 | if (ret < 0) { | ||
| 2074 | WARN_ON(1); | ||
| 2075 | return ret; | ||
| 2076 | } | ||
| 2077 | |||
| 2078 | while (1) { | ||
| 2079 | cond_resched(); | ||
| 2080 | |||
| 2081 | leaf = path->nodes[0]; | ||
| 2082 | slot = path->slots[0]; | ||
| 2083 | |||
| 2084 | if (slot >= btrfs_header_nritems(leaf)) { | ||
| 2085 | ret = btrfs_next_leaf(root, path); | ||
| 2086 | if (ret < 0) { | ||
| 2087 | goto out; | ||
| 2088 | } else if (ret > 0) { | ||
| 2089 | ret = 0; | ||
| 2090 | goto out; | ||
| 2091 | } | ||
| 2092 | continue; | ||
| 2093 | } | ||
| 2094 | |||
| 2095 | path->slots[0]++; | ||
| 2096 | |||
| 2097 | btrfs_item_key_to_cpu(leaf, &key, slot); | ||
| 2098 | |||
| 2099 | if (key.objectid > inum) | ||
| 2100 | goto out; | ||
| 2101 | |||
| 2102 | if (key.objectid < inum || key.type != BTRFS_EXTENT_DATA_KEY) | ||
| 2103 | continue; | ||
| 2104 | |||
| 2105 | extent = btrfs_item_ptr(leaf, slot, | ||
| 2106 | struct btrfs_file_extent_item); | ||
| 2107 | |||
| 2108 | if (btrfs_file_extent_disk_bytenr(leaf, extent) != old->bytenr) | ||
| 2109 | continue; | ||
| 2110 | |||
| 2111 | extent_offset = btrfs_file_extent_offset(leaf, extent); | ||
| 2112 | if (key.offset - extent_offset != offset) | ||
| 2113 | continue; | ||
| 2114 | |||
| 2115 | num_bytes = btrfs_file_extent_num_bytes(leaf, extent); | ||
| 2116 | if (extent_offset >= old->extent_offset + old->offset + | ||
| 2117 | old->len || extent_offset + num_bytes <= | ||
| 2118 | old->extent_offset + old->offset) | ||
| 2119 | continue; | ||
| 2120 | |||
| 2121 | break; | ||
| 2122 | } | ||
| 2123 | |||
| 2124 | backref = kmalloc(sizeof(*backref), GFP_NOFS); | ||
| 2125 | if (!backref) { | ||
| 2126 | ret = -ENOENT; | ||
| 2127 | goto out; | ||
| 2128 | } | ||
| 2129 | |||
| 2130 | backref->root_id = root_id; | ||
| 2131 | backref->inum = inum; | ||
| 2132 | backref->file_pos = offset + extent_offset; | ||
| 2133 | backref->num_bytes = num_bytes; | ||
| 2134 | backref->extent_offset = extent_offset; | ||
| 2135 | backref->generation = btrfs_file_extent_generation(leaf, extent); | ||
| 2136 | backref->old = old; | ||
| 2137 | backref_insert(&new->root, backref); | ||
| 2138 | old->count++; | ||
| 2139 | out: | ||
| 2140 | btrfs_release_path(path); | ||
| 2141 | WARN_ON(ret); | ||
| 2142 | return ret; | ||
| 2143 | } | ||
| 2144 | |||
| 2145 | static noinline bool record_extent_backrefs(struct btrfs_path *path, | ||
| 2146 | struct new_sa_defrag_extent *new) | ||
| 2147 | { | ||
| 2148 | struct btrfs_fs_info *fs_info = BTRFS_I(new->inode)->root->fs_info; | ||
| 2149 | struct old_sa_defrag_extent *old, *tmp; | ||
| 2150 | int ret; | ||
| 2151 | |||
| 2152 | new->path = path; | ||
| 2153 | |||
| 2154 | list_for_each_entry_safe(old, tmp, &new->head, list) { | ||
| 2155 | ret = iterate_inodes_from_logical(old->bytenr, fs_info, | ||
| 2156 | path, record_one_backref, | ||
| 2157 | old); | ||
| 2158 | BUG_ON(ret < 0 && ret != -ENOENT); | ||
| 2159 | |||
| 2160 | /* no backref to be processed for this extent */ | ||
| 2161 | if (!old->count) { | ||
| 2162 | list_del(&old->list); | ||
| 2163 | kfree(old); | ||
| 2164 | } | ||
| 2165 | } | ||
| 2166 | |||
| 2167 | if (list_empty(&new->head)) | ||
| 2168 | return false; | ||
| 2169 | |||
| 2170 | return true; | ||
| 2171 | } | ||
| 2172 | |||
| 2173 | static int relink_is_mergable(struct extent_buffer *leaf, | ||
| 2174 | struct btrfs_file_extent_item *fi, | ||
| 2175 | u64 disk_bytenr) | ||
| 2176 | { | ||
| 2177 | if (btrfs_file_extent_disk_bytenr(leaf, fi) != disk_bytenr) | ||
| 2178 | return 0; | ||
| 2179 | |||
| 2180 | if (btrfs_file_extent_type(leaf, fi) != BTRFS_FILE_EXTENT_REG) | ||
| 2181 | return 0; | ||
| 2182 | |||
| 2183 | if (btrfs_file_extent_compression(leaf, fi) || | ||
| 2184 | btrfs_file_extent_encryption(leaf, fi) || | ||
| 2185 | btrfs_file_extent_other_encoding(leaf, fi)) | ||
| 2186 | return 0; | ||
| 2187 | |||
| 2188 | return 1; | ||
| 2189 | } | ||
| 2190 | |||
| 2191 | /* | ||
| 2192 | * Note the backref might has changed, and in this case we just return 0. | ||
| 2193 | */ | ||
| 2194 | static noinline int relink_extent_backref(struct btrfs_path *path, | ||
| 2195 | struct sa_defrag_extent_backref *prev, | ||
| 2196 | struct sa_defrag_extent_backref *backref) | ||
| 2197 | { | ||
| 2198 | struct btrfs_file_extent_item *extent; | ||
| 2199 | struct btrfs_file_extent_item *item; | ||
| 2200 | struct btrfs_ordered_extent *ordered; | ||
| 2201 | struct btrfs_trans_handle *trans; | ||
| 2202 | struct btrfs_fs_info *fs_info; | ||
| 2203 | struct btrfs_root *root; | ||
| 2204 | struct btrfs_key key; | ||
| 2205 | struct extent_buffer *leaf; | ||
| 2206 | struct old_sa_defrag_extent *old = backref->old; | ||
| 2207 | struct new_sa_defrag_extent *new = old->new; | ||
| 2208 | struct inode *src_inode = new->inode; | ||
| 2209 | struct inode *inode; | ||
| 2210 | struct extent_state *cached = NULL; | ||
| 2211 | int ret = 0; | ||
| 2212 | u64 start; | ||
| 2213 | u64 len; | ||
| 2214 | u64 lock_start; | ||
| 2215 | u64 lock_end; | ||
| 2216 | bool merge = false; | ||
| 2217 | int index; | ||
| 2218 | |||
| 2219 | if (prev && prev->root_id == backref->root_id && | ||
| 2220 | prev->inum == backref->inum && | ||
| 2221 | prev->file_pos + prev->num_bytes == backref->file_pos) | ||
| 2222 | merge = true; | ||
| 2223 | |||
| 2224 | /* step 1: get root */ | ||
| 2225 | key.objectid = backref->root_id; | ||
| 2226 | key.type = BTRFS_ROOT_ITEM_KEY; | ||
| 2227 | key.offset = (u64)-1; | ||
| 2228 | |||
| 2229 | fs_info = BTRFS_I(src_inode)->root->fs_info; | ||
| 2230 | index = srcu_read_lock(&fs_info->subvol_srcu); | ||
| 2231 | |||
| 2232 | root = btrfs_read_fs_root_no_name(fs_info, &key); | ||
| 2233 | if (IS_ERR(root)) { | ||
| 2234 | srcu_read_unlock(&fs_info->subvol_srcu, index); | ||
| 2235 | if (PTR_ERR(root) == -ENOENT) | ||
| 2236 | return 0; | ||
| 2237 | return PTR_ERR(root); | ||
| 2238 | } | ||
| 2239 | if (btrfs_root_refs(&root->root_item) == 0) { | ||
| 2240 | srcu_read_unlock(&fs_info->subvol_srcu, index); | ||
| 2241 | /* parse ENOENT to 0 */ | ||
| 2242 | return 0; | ||
| 2243 | } | ||
| 2244 | |||
| 2245 | /* step 2: get inode */ | ||
| 2246 | key.objectid = backref->inum; | ||
| 2247 | key.type = BTRFS_INODE_ITEM_KEY; | ||
| 2248 | key.offset = 0; | ||
| 2249 | |||
| 2250 | inode = btrfs_iget(fs_info->sb, &key, root, NULL); | ||
| 2251 | if (IS_ERR(inode)) { | ||
| 2252 | srcu_read_unlock(&fs_info->subvol_srcu, index); | ||
| 2253 | return 0; | ||
| 2254 | } | ||
| 2255 | |||
| 2256 | srcu_read_unlock(&fs_info->subvol_srcu, index); | ||
| 2257 | |||
| 2258 | /* step 3: relink backref */ | ||
| 2259 | lock_start = backref->file_pos; | ||
| 2260 | lock_end = backref->file_pos + backref->num_bytes - 1; | ||
| 2261 | lock_extent_bits(&BTRFS_I(inode)->io_tree, lock_start, lock_end, | ||
| 2262 | 0, &cached); | ||
| 2263 | |||
| 2264 | ordered = btrfs_lookup_first_ordered_extent(inode, lock_end); | ||
| 2265 | if (ordered) { | ||
| 2266 | btrfs_put_ordered_extent(ordered); | ||
| 2267 | goto out_unlock; | ||
| 2268 | } | ||
| 2269 | |||
| 2270 | trans = btrfs_join_transaction(root); | ||
| 2271 | if (IS_ERR(trans)) { | ||
| 2272 | ret = PTR_ERR(trans); | ||
| 2273 | goto out_unlock; | ||
| 2274 | } | ||
| 2275 | |||
| 2276 | key.objectid = backref->inum; | ||
| 2277 | key.type = BTRFS_EXTENT_DATA_KEY; | ||
| 2278 | key.offset = backref->file_pos; | ||
| 2279 | |||
| 2280 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); | ||
| 2281 | if (ret < 0) { | ||
| 2282 | goto out_free_path; | ||
| 2283 | } else if (ret > 0) { | ||
| 2284 | ret = 0; | ||
| 2285 | goto out_free_path; | ||
| 2286 | } | ||
| 2287 | |||
| 2288 | extent = btrfs_item_ptr(path->nodes[0], path->slots[0], | ||
| 2289 | struct btrfs_file_extent_item); | ||
| 2290 | |||
| 2291 | if (btrfs_file_extent_generation(path->nodes[0], extent) != | ||
| 2292 | backref->generation) | ||
| 2293 | goto out_free_path; | ||
| 2294 | |||
| 2295 | btrfs_release_path(path); | ||
| 2296 | |||
| 2297 | start = backref->file_pos; | ||
| 2298 | if (backref->extent_offset < old->extent_offset + old->offset) | ||
| 2299 | start += old->extent_offset + old->offset - | ||
| 2300 | backref->extent_offset; | ||
| 2301 | |||
| 2302 | len = min(backref->extent_offset + backref->num_bytes, | ||
| 2303 | old->extent_offset + old->offset + old->len); | ||
| 2304 | len -= max(backref->extent_offset, old->extent_offset + old->offset); | ||
| 2305 | |||
| 2306 | ret = btrfs_drop_extents(trans, root, inode, start, | ||
| 2307 | start + len, 1); | ||
| 2308 | if (ret) | ||
| 2309 | goto out_free_path; | ||
| 2310 | again: | ||
| 2311 | key.objectid = btrfs_ino(inode); | ||
| 2312 | key.type = BTRFS_EXTENT_DATA_KEY; | ||
| 2313 | key.offset = start; | ||
| 2314 | |||
| 2315 | if (merge) { | ||
| 2316 | struct btrfs_file_extent_item *fi; | ||
| 2317 | u64 extent_len; | ||
| 2318 | struct btrfs_key found_key; | ||
| 2319 | |||
| 2320 | ret = btrfs_search_slot(trans, root, &key, path, 1, 1); | ||
| 2321 | if (ret < 0) | ||
| 2322 | goto out_free_path; | ||
| 2323 | |||
| 2324 | path->slots[0]--; | ||
| 2325 | leaf = path->nodes[0]; | ||
| 2326 | btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]); | ||
| 2327 | |||
| 2328 | fi = btrfs_item_ptr(leaf, path->slots[0], | ||
| 2329 | struct btrfs_file_extent_item); | ||
| 2330 | extent_len = btrfs_file_extent_num_bytes(leaf, fi); | ||
| 2331 | |||
| 2332 | if (relink_is_mergable(leaf, fi, new->bytenr) && | ||
| 2333 | extent_len + found_key.offset == start) { | ||
| 2334 | btrfs_set_file_extent_num_bytes(leaf, fi, | ||
| 2335 | extent_len + len); | ||
| 2336 | btrfs_mark_buffer_dirty(leaf); | ||
| 2337 | inode_add_bytes(inode, len); | ||
| 2338 | |||
| 2339 | ret = 1; | ||
| 2340 | goto out_free_path; | ||
| 2341 | } else { | ||
| 2342 | merge = false; | ||
| 2343 | btrfs_release_path(path); | ||
| 2344 | goto again; | ||
| 2345 | } | ||
| 2346 | } | ||
| 2347 | |||
| 2348 | ret = btrfs_insert_empty_item(trans, root, path, &key, | ||
| 2349 | sizeof(*extent)); | ||
| 2350 | if (ret) { | ||
| 2351 | btrfs_abort_transaction(trans, root, ret); | ||
| 2352 | goto out_free_path; | ||
| 2353 | } | ||
| 2354 | |||
| 2355 | leaf = path->nodes[0]; | ||
| 2356 | item = btrfs_item_ptr(leaf, path->slots[0], | ||
| 2357 | struct btrfs_file_extent_item); | ||
| 2358 | btrfs_set_file_extent_disk_bytenr(leaf, item, new->bytenr); | ||
| 2359 | btrfs_set_file_extent_disk_num_bytes(leaf, item, new->disk_len); | ||
| 2360 | btrfs_set_file_extent_offset(leaf, item, start - new->file_pos); | ||
| 2361 | btrfs_set_file_extent_num_bytes(leaf, item, len); | ||
| 2362 | btrfs_set_file_extent_ram_bytes(leaf, item, new->len); | ||
| 2363 | btrfs_set_file_extent_generation(leaf, item, trans->transid); | ||
| 2364 | btrfs_set_file_extent_type(leaf, item, BTRFS_FILE_EXTENT_REG); | ||
| 2365 | btrfs_set_file_extent_compression(leaf, item, new->compress_type); | ||
| 2366 | btrfs_set_file_extent_encryption(leaf, item, 0); | ||
| 2367 | btrfs_set_file_extent_other_encoding(leaf, item, 0); | ||
| 2368 | |||
| 2369 | btrfs_mark_buffer_dirty(leaf); | ||
| 2370 | inode_add_bytes(inode, len); | ||
| 2371 | |||
| 2372 | ret = btrfs_inc_extent_ref(trans, root, new->bytenr, | ||
| 2373 | new->disk_len, 0, | ||
| 2374 | backref->root_id, backref->inum, | ||
| 2375 | new->file_pos, 0); /* start - extent_offset */ | ||
| 2376 | if (ret) { | ||
| 2377 | btrfs_abort_transaction(trans, root, ret); | ||
| 2378 | goto out_free_path; | ||
| 2379 | } | ||
| 2380 | |||
| 2381 | ret = 1; | ||
| 2382 | out_free_path: | ||
| 2383 | btrfs_release_path(path); | ||
| 2384 | btrfs_end_transaction(trans, root); | ||
| 2385 | out_unlock: | ||
| 2386 | unlock_extent_cached(&BTRFS_I(inode)->io_tree, lock_start, lock_end, | ||
| 2387 | &cached, GFP_NOFS); | ||
| 2388 | iput(inode); | ||
| 2389 | return ret; | ||
| 2390 | } | ||
| 2391 | |||
| 2392 | static void relink_file_extents(struct new_sa_defrag_extent *new) | ||
| 2393 | { | ||
| 2394 | struct btrfs_path *path; | ||
| 2395 | struct old_sa_defrag_extent *old, *tmp; | ||
| 2396 | struct sa_defrag_extent_backref *backref; | ||
| 2397 | struct sa_defrag_extent_backref *prev = NULL; | ||
| 2398 | struct inode *inode; | ||
| 2399 | struct btrfs_root *root; | ||
| 2400 | struct rb_node *node; | ||
| 2401 | int ret; | ||
| 2402 | |||
| 2403 | inode = new->inode; | ||
| 2404 | root = BTRFS_I(inode)->root; | ||
| 2405 | |||
| 2406 | path = btrfs_alloc_path(); | ||
| 2407 | if (!path) | ||
| 2408 | return; | ||
| 2409 | |||
| 2410 | if (!record_extent_backrefs(path, new)) { | ||
| 2411 | btrfs_free_path(path); | ||
| 2412 | goto out; | ||
| 2413 | } | ||
| 2414 | btrfs_release_path(path); | ||
| 2415 | |||
| 2416 | while (1) { | ||
| 2417 | node = rb_first(&new->root); | ||
| 2418 | if (!node) | ||
| 2419 | break; | ||
| 2420 | rb_erase(node, &new->root); | ||
| 2421 | |||
| 2422 | backref = rb_entry(node, struct sa_defrag_extent_backref, node); | ||
| 2423 | |||
| 2424 | ret = relink_extent_backref(path, prev, backref); | ||
| 2425 | WARN_ON(ret < 0); | ||
| 2426 | |||
| 2427 | kfree(prev); | ||
| 2428 | |||
| 2429 | if (ret == 1) | ||
| 2430 | prev = backref; | ||
| 2431 | else | ||
| 2432 | prev = NULL; | ||
| 2433 | cond_resched(); | ||
| 2434 | } | ||
| 2435 | kfree(prev); | ||
| 2436 | |||
| 2437 | btrfs_free_path(path); | ||
| 2438 | |||
| 2439 | list_for_each_entry_safe(old, tmp, &new->head, list) { | ||
| 2440 | list_del(&old->list); | ||
| 2441 | kfree(old); | ||
| 2442 | } | ||
| 2443 | out: | ||
| 2444 | atomic_dec(&root->fs_info->defrag_running); | ||
| 2445 | wake_up(&root->fs_info->transaction_wait); | ||
| 2446 | |||
| 2447 | kfree(new); | ||
| 2448 | } | ||
| 2449 | |||
| 2450 | static struct new_sa_defrag_extent * | ||
| 2451 | record_old_file_extents(struct inode *inode, | ||
| 2452 | struct btrfs_ordered_extent *ordered) | ||
| 2453 | { | ||
| 2454 | struct btrfs_root *root = BTRFS_I(inode)->root; | ||
| 2455 | struct btrfs_path *path; | ||
| 2456 | struct btrfs_key key; | ||
| 2457 | struct old_sa_defrag_extent *old, *tmp; | ||
| 2458 | struct new_sa_defrag_extent *new; | ||
| 2459 | int ret; | ||
| 2460 | |||
| 2461 | new = kmalloc(sizeof(*new), GFP_NOFS); | ||
| 2462 | if (!new) | ||
| 2463 | return NULL; | ||
| 2464 | |||
| 2465 | new->inode = inode; | ||
| 2466 | new->file_pos = ordered->file_offset; | ||
| 2467 | new->len = ordered->len; | ||
| 2468 | new->bytenr = ordered->start; | ||
| 2469 | new->disk_len = ordered->disk_len; | ||
| 2470 | new->compress_type = ordered->compress_type; | ||
| 2471 | new->root = RB_ROOT; | ||
| 2472 | INIT_LIST_HEAD(&new->head); | ||
| 2473 | |||
| 2474 | path = btrfs_alloc_path(); | ||
| 2475 | if (!path) | ||
| 2476 | goto out_kfree; | ||
| 2477 | |||
| 2478 | key.objectid = btrfs_ino(inode); | ||
| 2479 | key.type = BTRFS_EXTENT_DATA_KEY; | ||
| 2480 | key.offset = new->file_pos; | ||
| 2481 | |||
| 2482 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); | ||
| 2483 | if (ret < 0) | ||
| 2484 | goto out_free_path; | ||
| 2485 | if (ret > 0 && path->slots[0] > 0) | ||
| 2486 | path->slots[0]--; | ||
| 2487 | |||
| 2488 | /* find out all the old extents for the file range */ | ||
| 2489 | while (1) { | ||
| 2490 | struct btrfs_file_extent_item *extent; | ||
| 2491 | struct extent_buffer *l; | ||
| 2492 | int slot; | ||
| 2493 | u64 num_bytes; | ||
| 2494 | u64 offset; | ||
| 2495 | u64 end; | ||
| 2496 | u64 disk_bytenr; | ||
| 2497 | u64 extent_offset; | ||
| 2498 | |||
| 2499 | l = path->nodes[0]; | ||
| 2500 | slot = path->slots[0]; | ||
| 2501 | |||
| 2502 | if (slot >= btrfs_header_nritems(l)) { | ||
| 2503 | ret = btrfs_next_leaf(root, path); | ||
| 2504 | if (ret < 0) | ||
| 2505 | goto out_free_list; | ||
| 2506 | else if (ret > 0) | ||
| 2507 | break; | ||
| 2508 | continue; | ||
| 2509 | } | ||
| 2510 | |||
| 2511 | btrfs_item_key_to_cpu(l, &key, slot); | ||
| 2512 | |||
| 2513 | if (key.objectid != btrfs_ino(inode)) | ||
| 2514 | break; | ||
| 2515 | if (key.type != BTRFS_EXTENT_DATA_KEY) | ||
| 2516 | break; | ||
| 2517 | if (key.offset >= new->file_pos + new->len) | ||
| 2518 | break; | ||
| 2519 | |||
| 2520 | extent = btrfs_item_ptr(l, slot, struct btrfs_file_extent_item); | ||
| 2521 | |||
| 2522 | num_bytes = btrfs_file_extent_num_bytes(l, extent); | ||
| 2523 | if (key.offset + num_bytes < new->file_pos) | ||
| 2524 | goto next; | ||
| 2525 | |||
| 2526 | disk_bytenr = btrfs_file_extent_disk_bytenr(l, extent); | ||
| 2527 | if (!disk_bytenr) | ||
| 2528 | goto next; | ||
| 2529 | |||
| 2530 | extent_offset = btrfs_file_extent_offset(l, extent); | ||
| 2531 | |||
| 2532 | old = kmalloc(sizeof(*old), GFP_NOFS); | ||
| 2533 | if (!old) | ||
| 2534 | goto out_free_list; | ||
| 2535 | |||
| 2536 | offset = max(new->file_pos, key.offset); | ||
| 2537 | end = min(new->file_pos + new->len, key.offset + num_bytes); | ||
| 2538 | |||
| 2539 | old->bytenr = disk_bytenr; | ||
| 2540 | old->extent_offset = extent_offset; | ||
| 2541 | old->offset = offset - key.offset; | ||
| 2542 | old->len = end - offset; | ||
| 2543 | old->new = new; | ||
| 2544 | old->count = 0; | ||
| 2545 | list_add_tail(&old->list, &new->head); | ||
| 2546 | next: | ||
| 2547 | path->slots[0]++; | ||
| 2548 | cond_resched(); | ||
| 2549 | } | ||
| 2550 | |||
| 2551 | btrfs_free_path(path); | ||
| 2552 | atomic_inc(&root->fs_info->defrag_running); | ||
| 2553 | |||
| 2554 | return new; | ||
| 2555 | |||
| 2556 | out_free_list: | ||
| 2557 | list_for_each_entry_safe(old, tmp, &new->head, list) { | ||
| 2558 | list_del(&old->list); | ||
| 2559 | kfree(old); | ||
| 2560 | } | ||
| 2561 | out_free_path: | ||
| 2562 | btrfs_free_path(path); | ||
| 2563 | out_kfree: | ||
| 2564 | kfree(new); | ||
| 2565 | return NULL; | ||
| 2566 | } | ||
| 2567 | |||
| 1895 | /* | 2568 | /* |
| 1896 | * helper function for btrfs_finish_ordered_io, this | 2569 | * helper function for btrfs_finish_ordered_io, this |
| 1897 | * just reads in some of the csum leaves to prime them into ram | 2570 | * just reads in some of the csum leaves to prime them into ram |
| @@ -1909,6 +2582,7 @@ static int btrfs_finish_ordered_io(struct btrfs_ordered_extent *ordered_extent) | |||
| 1909 | struct btrfs_trans_handle *trans = NULL; | 2582 | struct btrfs_trans_handle *trans = NULL; |
| 1910 | struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; | 2583 | struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; |
| 1911 | struct extent_state *cached_state = NULL; | 2584 | struct extent_state *cached_state = NULL; |
| 2585 | struct new_sa_defrag_extent *new = NULL; | ||
| 1912 | int compress_type = 0; | 2586 | int compress_type = 0; |
| 1913 | int ret; | 2587 | int ret; |
| 1914 | bool nolock; | 2588 | bool nolock; |
| @@ -1943,6 +2617,20 @@ static int btrfs_finish_ordered_io(struct btrfs_ordered_extent *ordered_extent) | |||
| 1943 | ordered_extent->file_offset + ordered_extent->len - 1, | 2617 | ordered_extent->file_offset + ordered_extent->len - 1, |
| 1944 | 0, &cached_state); | 2618 | 0, &cached_state); |
| 1945 | 2619 | ||
| 2620 | ret = test_range_bit(io_tree, ordered_extent->file_offset, | ||
| 2621 | ordered_extent->file_offset + ordered_extent->len - 1, | ||
| 2622 | EXTENT_DEFRAG, 1, cached_state); | ||
| 2623 | if (ret) { | ||
| 2624 | u64 last_snapshot = btrfs_root_last_snapshot(&root->root_item); | ||
| 2625 | if (last_snapshot >= BTRFS_I(inode)->generation) | ||
| 2626 | /* the inode is shared */ | ||
| 2627 | new = record_old_file_extents(inode, ordered_extent); | ||
| 2628 | |||
| 2629 | clear_extent_bit(io_tree, ordered_extent->file_offset, | ||
| 2630 | ordered_extent->file_offset + ordered_extent->len - 1, | ||
| 2631 | EXTENT_DEFRAG, 0, 0, &cached_state, GFP_NOFS); | ||
| 2632 | } | ||
| 2633 | |||
| 1946 | if (nolock) | 2634 | if (nolock) |
| 1947 | trans = btrfs_join_transaction_nolock(root); | 2635 | trans = btrfs_join_transaction_nolock(root); |
| 1948 | else | 2636 | else |
| @@ -2001,17 +2689,33 @@ out: | |||
| 2001 | if (trans) | 2689 | if (trans) |
| 2002 | btrfs_end_transaction(trans, root); | 2690 | btrfs_end_transaction(trans, root); |
| 2003 | 2691 | ||
| 2004 | if (ret) | 2692 | if (ret) { |
| 2005 | clear_extent_uptodate(io_tree, ordered_extent->file_offset, | 2693 | clear_extent_uptodate(io_tree, ordered_extent->file_offset, |
| 2006 | ordered_extent->file_offset + | 2694 | ordered_extent->file_offset + |
| 2007 | ordered_extent->len - 1, NULL, GFP_NOFS); | 2695 | ordered_extent->len - 1, NULL, GFP_NOFS); |
| 2008 | 2696 | ||
| 2697 | /* | ||
| 2698 | * If the ordered extent had an IOERR or something else went | ||
| 2699 | * wrong we need to return the space for this ordered extent | ||
| 2700 | * back to the allocator. | ||
| 2701 | */ | ||
| 2702 | if (!test_bit(BTRFS_ORDERED_NOCOW, &ordered_extent->flags) && | ||
| 2703 | !test_bit(BTRFS_ORDERED_PREALLOC, &ordered_extent->flags)) | ||
| 2704 | btrfs_free_reserved_extent(root, ordered_extent->start, | ||
| 2705 | ordered_extent->disk_len); | ||
| 2706 | } | ||
| 2707 | |||
| 2708 | |||
| 2009 | /* | 2709 | /* |
| 2010 | * This needs to be done to make sure anybody waiting knows we are done | 2710 | * This needs to be done to make sure anybody waiting knows we are done |
| 2011 | * updating everything for this ordered extent. | 2711 | * updating everything for this ordered extent. |
| 2012 | */ | 2712 | */ |
| 2013 | btrfs_remove_ordered_extent(inode, ordered_extent); | 2713 | btrfs_remove_ordered_extent(inode, ordered_extent); |
| 2014 | 2714 | ||
| 2715 | /* for snapshot-aware defrag */ | ||
| 2716 | if (new) | ||
| 2717 | relink_file_extents(new); | ||
| 2718 | |||
| 2015 | /* once for us */ | 2719 | /* once for us */ |
| 2016 | btrfs_put_ordered_extent(ordered_extent); | 2720 | btrfs_put_ordered_extent(ordered_extent); |
| 2017 | /* once for the tree */ | 2721 | /* once for the tree */ |
| @@ -2062,7 +2766,7 @@ static int btrfs_writepage_end_io_hook(struct page *page, u64 start, u64 end, | |||
| 2062 | static int btrfs_readpage_end_io_hook(struct page *page, u64 start, u64 end, | 2766 | static int btrfs_readpage_end_io_hook(struct page *page, u64 start, u64 end, |
| 2063 | struct extent_state *state, int mirror) | 2767 | struct extent_state *state, int mirror) |
| 2064 | { | 2768 | { |
| 2065 | size_t offset = start - ((u64)page->index << PAGE_CACHE_SHIFT); | 2769 | size_t offset = start - page_offset(page); |
| 2066 | struct inode *inode = page->mapping->host; | 2770 | struct inode *inode = page->mapping->host; |
| 2067 | struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; | 2771 | struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; |
| 2068 | char *kaddr; | 2772 | char *kaddr; |
| @@ -2167,11 +2871,6 @@ void btrfs_run_delayed_iputs(struct btrfs_root *root) | |||
| 2167 | } | 2871 | } |
| 2168 | } | 2872 | } |
| 2169 | 2873 | ||
| 2170 | enum btrfs_orphan_cleanup_state { | ||
| 2171 | ORPHAN_CLEANUP_STARTED = 1, | ||
| 2172 | ORPHAN_CLEANUP_DONE = 2, | ||
| 2173 | }; | ||
| 2174 | |||
| 2175 | /* | 2874 | /* |
| 2176 | * This is called in transaction commit time. If there are no orphan | 2875 | * This is called in transaction commit time. If there are no orphan |
| 2177 | * files in the subvolume, it removes orphan item and frees block_rsv | 2876 | * files in the subvolume, it removes orphan item and frees block_rsv |
| @@ -2469,6 +3168,7 @@ int btrfs_orphan_cleanup(struct btrfs_root *root) | |||
| 2469 | */ | 3168 | */ |
| 2470 | set_bit(BTRFS_INODE_HAS_ORPHAN_ITEM, | 3169 | set_bit(BTRFS_INODE_HAS_ORPHAN_ITEM, |
| 2471 | &BTRFS_I(inode)->runtime_flags); | 3170 | &BTRFS_I(inode)->runtime_flags); |
| 3171 | atomic_inc(&root->orphan_inodes); | ||
| 2472 | 3172 | ||
| 2473 | /* if we have links, this was a truncate, lets do that */ | 3173 | /* if we have links, this was a truncate, lets do that */ |
| 2474 | if (inode->i_nlink) { | 3174 | if (inode->i_nlink) { |
| @@ -2491,6 +3191,8 @@ int btrfs_orphan_cleanup(struct btrfs_root *root) | |||
| 2491 | goto out; | 3191 | goto out; |
| 2492 | 3192 | ||
| 2493 | ret = btrfs_truncate(inode); | 3193 | ret = btrfs_truncate(inode); |
| 3194 | if (ret) | ||
| 3195 | btrfs_orphan_del(NULL, inode); | ||
| 2494 | } else { | 3196 | } else { |
| 2495 | nr_unlink++; | 3197 | nr_unlink++; |
| 2496 | } | 3198 | } |
| @@ -2709,34 +3411,41 @@ static void fill_inode_item(struct btrfs_trans_handle *trans, | |||
| 2709 | struct btrfs_inode_item *item, | 3411 | struct btrfs_inode_item *item, |
| 2710 | struct inode *inode) | 3412 | struct inode *inode) |
| 2711 | { | 3413 | { |
| 2712 | btrfs_set_inode_uid(leaf, item, i_uid_read(inode)); | 3414 | struct btrfs_map_token token; |
| 2713 | btrfs_set_inode_gid(leaf, item, i_gid_read(inode)); | 3415 | |
| 2714 | btrfs_set_inode_size(leaf, item, BTRFS_I(inode)->disk_i_size); | 3416 | btrfs_init_map_token(&token); |
| 2715 | btrfs_set_inode_mode(leaf, item, inode->i_mode); | 3417 | |
| 2716 | btrfs_set_inode_nlink(leaf, item, inode->i_nlink); | 3418 | btrfs_set_token_inode_uid(leaf, item, i_uid_read(inode), &token); |
| 3419 | btrfs_set_token_inode_gid(leaf, item, i_gid_read(inode), &token); | ||
| 3420 | btrfs_set_token_inode_size(leaf, item, BTRFS_I(inode)->disk_i_size, | ||
| 3421 | &token); | ||
| 3422 | btrfs_set_token_inode_mode(leaf, item, inode->i_mode, &token); | ||
| 3423 | btrfs_set_token_inode_nlink(leaf, item, inode->i_nlink, &token); | ||
| 2717 | 3424 | ||
| 2718 | btrfs_set_timespec_sec(leaf, btrfs_inode_atime(item), | 3425 | btrfs_set_token_timespec_sec(leaf, btrfs_inode_atime(item), |
| 2719 | inode->i_atime.tv_sec); | 3426 | inode->i_atime.tv_sec, &token); |
| 2720 | btrfs_set_timespec_nsec(leaf, btrfs_inode_atime(item), | 3427 | btrfs_set_token_timespec_nsec(leaf, btrfs_inode_atime(item), |
| 2721 | inode->i_atime.tv_nsec); | 3428 | inode->i_atime.tv_nsec, &token); |
| 2722 | 3429 | ||
| 2723 | btrfs_set_timespec_sec(leaf, btrfs_inode_mtime(item), | 3430 | btrfs_set_token_timespec_sec(leaf, btrfs_inode_mtime(item), |
| 2724 | inode->i_mtime.tv_sec); | 3431 | inode->i_mtime.tv_sec, &token); |
| 2725 | btrfs_set_timespec_nsec(leaf, btrfs_inode_mtime(item), | 3432 | btrfs_set_token_timespec_nsec(leaf, btrfs_inode_mtime(item), |
| 2726 | inode->i_mtime.tv_nsec); | 3433 | inode->i_mtime.tv_nsec, &token); |
| 2727 | 3434 | ||
| 2728 | btrfs_set_timespec_sec(leaf, btrfs_inode_ctime(item), | 3435 | btrfs_set_token_timespec_sec(leaf, btrfs_inode_ctime(item), |
| 2729 | inode->i_ctime.tv_sec); | 3436 | inode->i_ctime.tv_sec, &token); |
| 2730 | btrfs_set_timespec_nsec(leaf, btrfs_inode_ctime(item), | 3437 | btrfs_set_token_timespec_nsec(leaf, btrfs_inode_ctime(item), |
| 2731 | inode->i_ctime.tv_nsec); | 3438 | inode->i_ctime.tv_nsec, &token); |
| 2732 | 3439 | ||
| 2733 | btrfs_set_inode_nbytes(leaf, item, inode_get_bytes(inode)); | 3440 | btrfs_set_token_inode_nbytes(leaf, item, inode_get_bytes(inode), |
| 2734 | btrfs_set_inode_generation(leaf, item, BTRFS_I(inode)->generation); | 3441 | &token); |
| 2735 | btrfs_set_inode_sequence(leaf, item, inode->i_version); | 3442 | btrfs_set_token_inode_generation(leaf, item, BTRFS_I(inode)->generation, |
| 2736 | btrfs_set_inode_transid(leaf, item, trans->transid); | 3443 | &token); |
| 2737 | btrfs_set_inode_rdev(leaf, item, inode->i_rdev); | 3444 | btrfs_set_token_inode_sequence(leaf, item, inode->i_version, &token); |
| 2738 | btrfs_set_inode_flags(leaf, item, BTRFS_I(inode)->flags); | 3445 | btrfs_set_token_inode_transid(leaf, item, trans->transid, &token); |
| 2739 | btrfs_set_inode_block_group(leaf, item, 0); | 3446 | btrfs_set_token_inode_rdev(leaf, item, inode->i_rdev, &token); |
| 3447 | btrfs_set_token_inode_flags(leaf, item, BTRFS_I(inode)->flags, &token); | ||
| 3448 | btrfs_set_token_inode_block_group(leaf, item, 0, &token); | ||
| 2740 | } | 3449 | } |
| 2741 | 3450 | ||
| 2742 | /* | 3451 | /* |
| @@ -3304,7 +4013,6 @@ int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans, | |||
| 3304 | u64 extent_num_bytes = 0; | 4013 | u64 extent_num_bytes = 0; |
| 3305 | u64 extent_offset = 0; | 4014 | u64 extent_offset = 0; |
| 3306 | u64 item_end = 0; | 4015 | u64 item_end = 0; |
| 3307 | u64 mask = root->sectorsize - 1; | ||
| 3308 | u32 found_type = (u8)-1; | 4016 | u32 found_type = (u8)-1; |
| 3309 | int found_extent; | 4017 | int found_extent; |
| 3310 | int del_item; | 4018 | int del_item; |
| @@ -3328,7 +4036,8 @@ int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans, | |||
| 3328 | * extent just the way it is. | 4036 | * extent just the way it is. |
| 3329 | */ | 4037 | */ |
| 3330 | if (root->ref_cows || root == root->fs_info->tree_root) | 4038 | if (root->ref_cows || root == root->fs_info->tree_root) |
| 3331 | btrfs_drop_extent_cache(inode, (new_size + mask) & (~mask), (u64)-1, 0); | 4039 | btrfs_drop_extent_cache(inode, ALIGN(new_size, |
| 4040 | root->sectorsize), (u64)-1, 0); | ||
| 3332 | 4041 | ||
| 3333 | /* | 4042 | /* |
| 3334 | * This function is also used to drop the items in the log tree before | 4043 | * This function is also used to drop the items in the log tree before |
| @@ -3407,10 +4116,9 @@ search_again: | |||
| 3407 | if (!del_item) { | 4116 | if (!del_item) { |
| 3408 | u64 orig_num_bytes = | 4117 | u64 orig_num_bytes = |
| 3409 | btrfs_file_extent_num_bytes(leaf, fi); | 4118 | btrfs_file_extent_num_bytes(leaf, fi); |
| 3410 | extent_num_bytes = new_size - | 4119 | extent_num_bytes = ALIGN(new_size - |
| 3411 | found_key.offset + root->sectorsize - 1; | 4120 | found_key.offset, |
| 3412 | extent_num_bytes = extent_num_bytes & | 4121 | root->sectorsize); |
| 3413 | ~((u64)root->sectorsize - 1); | ||
| 3414 | btrfs_set_file_extent_num_bytes(leaf, fi, | 4122 | btrfs_set_file_extent_num_bytes(leaf, fi, |
| 3415 | extent_num_bytes); | 4123 | extent_num_bytes); |
| 3416 | num_dec = (orig_num_bytes - | 4124 | num_dec = (orig_num_bytes - |
| @@ -3646,9 +4354,8 @@ int btrfs_cont_expand(struct inode *inode, loff_t oldsize, loff_t size) | |||
| 3646 | struct extent_map *em = NULL; | 4354 | struct extent_map *em = NULL; |
| 3647 | struct extent_state *cached_state = NULL; | 4355 | struct extent_state *cached_state = NULL; |
| 3648 | struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree; | 4356 | struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree; |
| 3649 | u64 mask = root->sectorsize - 1; | 4357 | u64 hole_start = ALIGN(oldsize, root->sectorsize); |
| 3650 | u64 hole_start = (oldsize + mask) & ~mask; | 4358 | u64 block_end = ALIGN(size, root->sectorsize); |
| 3651 | u64 block_end = (size + mask) & ~mask; | ||
| 3652 | u64 last_byte; | 4359 | u64 last_byte; |
| 3653 | u64 cur_offset; | 4360 | u64 cur_offset; |
| 3654 | u64 hole_size; | 4361 | u64 hole_size; |
| @@ -3681,7 +4388,7 @@ int btrfs_cont_expand(struct inode *inode, loff_t oldsize, loff_t size) | |||
| 3681 | break; | 4388 | break; |
| 3682 | } | 4389 | } |
| 3683 | last_byte = min(extent_map_end(em), block_end); | 4390 | last_byte = min(extent_map_end(em), block_end); |
| 3684 | last_byte = (last_byte + mask) & ~mask; | 4391 | last_byte = ALIGN(last_byte , root->sectorsize); |
| 3685 | if (!test_bit(EXTENT_FLAG_PREALLOC, &em->flags)) { | 4392 | if (!test_bit(EXTENT_FLAG_PREALLOC, &em->flags)) { |
| 3686 | struct extent_map *hole_em; | 4393 | struct extent_map *hole_em; |
| 3687 | hole_size = last_byte - cur_offset; | 4394 | hole_size = last_byte - cur_offset; |
| @@ -3832,6 +4539,12 @@ static int btrfs_setsize(struct inode *inode, struct iattr *attr) | |||
| 3832 | 4539 | ||
| 3833 | /* we don't support swapfiles, so vmtruncate shouldn't fail */ | 4540 | /* we don't support swapfiles, so vmtruncate shouldn't fail */ |
| 3834 | truncate_setsize(inode, newsize); | 4541 | truncate_setsize(inode, newsize); |
| 4542 | |||
| 4543 | /* Disable nonlocked read DIO to avoid the end less truncate */ | ||
| 4544 | btrfs_inode_block_unlocked_dio(inode); | ||
| 4545 | inode_dio_wait(inode); | ||
| 4546 | btrfs_inode_resume_unlocked_dio(inode); | ||
| 4547 | |||
| 3835 | ret = btrfs_truncate(inode); | 4548 | ret = btrfs_truncate(inode); |
| 3836 | if (ret && inode->i_nlink) | 4549 | if (ret && inode->i_nlink) |
| 3837 | btrfs_orphan_del(NULL, inode); | 4550 | btrfs_orphan_del(NULL, inode); |
| @@ -3904,6 +4617,12 @@ void btrfs_evict_inode(struct inode *inode) | |||
| 3904 | goto no_delete; | 4617 | goto no_delete; |
| 3905 | } | 4618 | } |
| 3906 | 4619 | ||
| 4620 | ret = btrfs_commit_inode_delayed_inode(inode); | ||
| 4621 | if (ret) { | ||
| 4622 | btrfs_orphan_del(NULL, inode); | ||
| 4623 | goto no_delete; | ||
| 4624 | } | ||
| 4625 | |||
| 3907 | rsv = btrfs_alloc_block_rsv(root, BTRFS_BLOCK_RSV_TEMP); | 4626 | rsv = btrfs_alloc_block_rsv(root, BTRFS_BLOCK_RSV_TEMP); |
| 3908 | if (!rsv) { | 4627 | if (!rsv) { |
| 3909 | btrfs_orphan_del(NULL, inode); | 4628 | btrfs_orphan_del(NULL, inode); |
| @@ -3941,7 +4660,7 @@ void btrfs_evict_inode(struct inode *inode) | |||
| 3941 | goto no_delete; | 4660 | goto no_delete; |
| 3942 | } | 4661 | } |
| 3943 | 4662 | ||
| 3944 | trans = btrfs_start_transaction_lflush(root, 1); | 4663 | trans = btrfs_join_transaction(root); |
| 3945 | if (IS_ERR(trans)) { | 4664 | if (IS_ERR(trans)) { |
| 3946 | btrfs_orphan_del(NULL, inode); | 4665 | btrfs_orphan_del(NULL, inode); |
| 3947 | btrfs_free_block_rsv(root, rsv); | 4666 | btrfs_free_block_rsv(root, rsv); |
| @@ -3955,9 +4674,6 @@ void btrfs_evict_inode(struct inode *inode) | |||
| 3955 | break; | 4674 | break; |
| 3956 | 4675 | ||
| 3957 | trans->block_rsv = &root->fs_info->trans_block_rsv; | 4676 | trans->block_rsv = &root->fs_info->trans_block_rsv; |
| 3958 | ret = btrfs_update_inode(trans, root, inode); | ||
| 3959 | BUG_ON(ret); | ||
| 3960 | |||
| 3961 | btrfs_end_transaction(trans, root); | 4677 | btrfs_end_transaction(trans, root); |
| 3962 | trans = NULL; | 4678 | trans = NULL; |
| 3963 | btrfs_btree_balance_dirty(root); | 4679 | btrfs_btree_balance_dirty(root); |
| @@ -4854,7 +5570,8 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans, | |||
| 4854 | if (btrfs_test_opt(root, NODATASUM)) | 5570 | if (btrfs_test_opt(root, NODATASUM)) |
| 4855 | BTRFS_I(inode)->flags |= BTRFS_INODE_NODATASUM; | 5571 | BTRFS_I(inode)->flags |= BTRFS_INODE_NODATASUM; |
| 4856 | if (btrfs_test_opt(root, NODATACOW)) | 5572 | if (btrfs_test_opt(root, NODATACOW)) |
| 4857 | BTRFS_I(inode)->flags |= BTRFS_INODE_NODATACOW; | 5573 | BTRFS_I(inode)->flags |= BTRFS_INODE_NODATACOW | |
| 5574 | BTRFS_INODE_NODATASUM; | ||
| 4858 | } | 5575 | } |
| 4859 | 5576 | ||
| 4860 | insert_inode_hash(inode); | 5577 | insert_inode_hash(inode); |
| @@ -5006,12 +5723,6 @@ static int btrfs_mknod(struct inode *dir, struct dentry *dentry, | |||
| 5006 | goto out_unlock; | 5723 | goto out_unlock; |
| 5007 | } | 5724 | } |
| 5008 | 5725 | ||
| 5009 | err = btrfs_update_inode(trans, root, inode); | ||
| 5010 | if (err) { | ||
| 5011 | drop_inode = 1; | ||
| 5012 | goto out_unlock; | ||
| 5013 | } | ||
| 5014 | |||
| 5015 | /* | 5726 | /* |
| 5016 | * If the active LSM wants to access the inode during | 5727 | * If the active LSM wants to access the inode during |
| 5017 | * d_instantiate it needs these. Smack checks to see | 5728 | * d_instantiate it needs these. Smack checks to see |
| @@ -5396,8 +6107,7 @@ again: | |||
| 5396 | } else if (found_type == BTRFS_FILE_EXTENT_INLINE) { | 6107 | } else if (found_type == BTRFS_FILE_EXTENT_INLINE) { |
| 5397 | size_t size; | 6108 | size_t size; |
| 5398 | size = btrfs_file_extent_inline_len(leaf, item); | 6109 | size = btrfs_file_extent_inline_len(leaf, item); |
| 5399 | extent_end = (extent_start + size + root->sectorsize - 1) & | 6110 | extent_end = ALIGN(extent_start + size, root->sectorsize); |
| 5400 | ~((u64)root->sectorsize - 1); | ||
| 5401 | } | 6111 | } |
| 5402 | 6112 | ||
| 5403 | if (start >= extent_end) { | 6113 | if (start >= extent_end) { |
| @@ -5469,8 +6179,7 @@ again: | |||
| 5469 | copy_size = min_t(u64, PAGE_CACHE_SIZE - pg_offset, | 6179 | copy_size = min_t(u64, PAGE_CACHE_SIZE - pg_offset, |
| 5470 | size - extent_offset); | 6180 | size - extent_offset); |
| 5471 | em->start = extent_start + extent_offset; | 6181 | em->start = extent_start + extent_offset; |
| 5472 | em->len = (copy_size + root->sectorsize - 1) & | 6182 | em->len = ALIGN(copy_size, root->sectorsize); |
| 5473 | ~((u64)root->sectorsize - 1); | ||
| 5474 | em->orig_block_len = em->len; | 6183 | em->orig_block_len = em->len; |
| 5475 | em->orig_start = em->start; | 6184 | em->orig_start = em->start; |
| 5476 | if (compress_type) { | 6185 | if (compress_type) { |
| @@ -5949,6 +6658,8 @@ static struct extent_map *create_pinned_em(struct inode *inode, u64 start, | |||
| 5949 | 6658 | ||
| 5950 | em->start = start; | 6659 | em->start = start; |
| 5951 | em->orig_start = orig_start; | 6660 | em->orig_start = orig_start; |
| 6661 | em->mod_start = start; | ||
| 6662 | em->mod_len = len; | ||
| 5952 | em->len = len; | 6663 | em->len = len; |
| 5953 | em->block_len = block_len; | 6664 | em->block_len = block_len; |
| 5954 | em->block_start = block_start; | 6665 | em->block_start = block_start; |
| @@ -5990,16 +6701,12 @@ static int btrfs_get_blocks_direct(struct inode *inode, sector_t iblock, | |||
| 5990 | u64 len = bh_result->b_size; | 6701 | u64 len = bh_result->b_size; |
| 5991 | struct btrfs_trans_handle *trans; | 6702 | struct btrfs_trans_handle *trans; |
| 5992 | int unlock_bits = EXTENT_LOCKED; | 6703 | int unlock_bits = EXTENT_LOCKED; |
| 5993 | int ret; | 6704 | int ret = 0; |
| 5994 | 6705 | ||
| 5995 | if (create) { | 6706 | if (create) |
| 5996 | ret = btrfs_delalloc_reserve_space(inode, len); | ||
| 5997 | if (ret) | ||
| 5998 | return ret; | ||
| 5999 | unlock_bits |= EXTENT_DELALLOC | EXTENT_DIRTY; | 6707 | unlock_bits |= EXTENT_DELALLOC | EXTENT_DIRTY; |
| 6000 | } else { | 6708 | else |
| 6001 | len = min_t(u64, len, root->sectorsize); | 6709 | len = min_t(u64, len, root->sectorsize); |
| 6002 | } | ||
| 6003 | 6710 | ||
| 6004 | lockstart = start; | 6711 | lockstart = start; |
| 6005 | lockend = start + len - 1; | 6712 | lockend = start + len - 1; |
| @@ -6011,14 +6718,6 @@ static int btrfs_get_blocks_direct(struct inode *inode, sector_t iblock, | |||
| 6011 | if (lock_extent_direct(inode, lockstart, lockend, &cached_state, create)) | 6718 | if (lock_extent_direct(inode, lockstart, lockend, &cached_state, create)) |
| 6012 | return -ENOTBLK; | 6719 | return -ENOTBLK; |
| 6013 | 6720 | ||
| 6014 | if (create) { | ||
| 6015 | ret = set_extent_bit(&BTRFS_I(inode)->io_tree, lockstart, | ||
| 6016 | lockend, EXTENT_DELALLOC, NULL, | ||
| 6017 | &cached_state, GFP_NOFS); | ||
| 6018 | if (ret) | ||
| 6019 | goto unlock_err; | ||
| 6020 | } | ||
| 6021 | |||
| 6022 | em = btrfs_get_extent(inode, NULL, 0, start, len, 0); | 6721 | em = btrfs_get_extent(inode, NULL, 0, start, len, 0); |
| 6023 | if (IS_ERR(em)) { | 6722 | if (IS_ERR(em)) { |
| 6024 | ret = PTR_ERR(em); | 6723 | ret = PTR_ERR(em); |
| @@ -6050,7 +6749,6 @@ static int btrfs_get_blocks_direct(struct inode *inode, sector_t iblock, | |||
| 6050 | if (!create && (em->block_start == EXTENT_MAP_HOLE || | 6749 | if (!create && (em->block_start == EXTENT_MAP_HOLE || |
| 6051 | test_bit(EXTENT_FLAG_PREALLOC, &em->flags))) { | 6750 | test_bit(EXTENT_FLAG_PREALLOC, &em->flags))) { |
| 6052 | free_extent_map(em); | 6751 | free_extent_map(em); |
| 6053 | ret = 0; | ||
| 6054 | goto unlock_err; | 6752 | goto unlock_err; |
| 6055 | } | 6753 | } |
| 6056 | 6754 | ||
| @@ -6148,6 +6846,15 @@ unlock: | |||
| 6148 | */ | 6846 | */ |
| 6149 | if (start + len > i_size_read(inode)) | 6847 | if (start + len > i_size_read(inode)) |
| 6150 | i_size_write(inode, start + len); | 6848 | i_size_write(inode, start + len); |
| 6849 | |||
| 6850 | spin_lock(&BTRFS_I(inode)->lock); | ||
| 6851 | BTRFS_I(inode)->outstanding_extents++; | ||
| 6852 | spin_unlock(&BTRFS_I(inode)->lock); | ||
| 6853 | |||
| 6854 | ret = set_extent_bit(&BTRFS_I(inode)->io_tree, lockstart, | ||
| 6855 | lockstart + len - 1, EXTENT_DELALLOC, NULL, | ||
| 6856 | &cached_state, GFP_NOFS); | ||
| 6857 | BUG_ON(ret); | ||
| 6151 | } | 6858 | } |
| 6152 | 6859 | ||
| 6153 | /* | 6860 | /* |
| @@ -6156,24 +6863,9 @@ unlock: | |||
| 6156 | * aren't using if there is any left over space. | 6863 | * aren't using if there is any left over space. |
| 6157 | */ | 6864 | */ |
| 6158 | if (lockstart < lockend) { | 6865 | if (lockstart < lockend) { |
| 6159 | if (create && len < lockend - lockstart) { | 6866 | clear_extent_bit(&BTRFS_I(inode)->io_tree, lockstart, |
| 6160 | clear_extent_bit(&BTRFS_I(inode)->io_tree, lockstart, | 6867 | lockend, unlock_bits, 1, 0, |
| 6161 | lockstart + len - 1, | 6868 | &cached_state, GFP_NOFS); |
| 6162 | unlock_bits | EXTENT_DEFRAG, 1, 0, | ||
| 6163 | &cached_state, GFP_NOFS); | ||
| 6164 | /* | ||
| 6165 | * Beside unlock, we also need to cleanup reserved space | ||
| 6166 | * for the left range by attaching EXTENT_DO_ACCOUNTING. | ||
| 6167 | */ | ||
| 6168 | clear_extent_bit(&BTRFS_I(inode)->io_tree, | ||
| 6169 | lockstart + len, lockend, | ||
| 6170 | unlock_bits | EXTENT_DO_ACCOUNTING | | ||
| 6171 | EXTENT_DEFRAG, 1, 0, NULL, GFP_NOFS); | ||
| 6172 | } else { | ||
| 6173 | clear_extent_bit(&BTRFS_I(inode)->io_tree, lockstart, | ||
| 6174 | lockend, unlock_bits, 1, 0, | ||
| 6175 | &cached_state, GFP_NOFS); | ||
| 6176 | } | ||
| 6177 | } else { | 6869 | } else { |
| 6178 | free_extent_state(cached_state); | 6870 | free_extent_state(cached_state); |
| 6179 | } | 6871 | } |
| @@ -6183,9 +6875,6 @@ unlock: | |||
| 6183 | return 0; | 6875 | return 0; |
| 6184 | 6876 | ||
| 6185 | unlock_err: | 6877 | unlock_err: |
| 6186 | if (create) | ||
| 6187 | unlock_bits |= EXTENT_DO_ACCOUNTING; | ||
| 6188 | |||
| 6189 | clear_extent_bit(&BTRFS_I(inode)->io_tree, lockstart, lockend, | 6878 | clear_extent_bit(&BTRFS_I(inode)->io_tree, lockstart, lockend, |
| 6190 | unlock_bits, 1, 0, &cached_state, GFP_NOFS); | 6879 | unlock_bits, 1, 0, &cached_state, GFP_NOFS); |
| 6191 | return ret; | 6880 | return ret; |
| @@ -6426,19 +7115,24 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, | |||
| 6426 | int async_submit = 0; | 7115 | int async_submit = 0; |
| 6427 | 7116 | ||
| 6428 | map_length = orig_bio->bi_size; | 7117 | map_length = orig_bio->bi_size; |
| 6429 | ret = btrfs_map_block(root->fs_info, READ, start_sector << 9, | 7118 | ret = btrfs_map_block(root->fs_info, rw, start_sector << 9, |
| 6430 | &map_length, NULL, 0); | 7119 | &map_length, NULL, 0); |
| 6431 | if (ret) { | 7120 | if (ret) { |
| 6432 | bio_put(orig_bio); | 7121 | bio_put(orig_bio); |
| 6433 | return -EIO; | 7122 | return -EIO; |
| 6434 | } | 7123 | } |
| 6435 | |||
| 6436 | if (map_length >= orig_bio->bi_size) { | 7124 | if (map_length >= orig_bio->bi_size) { |
| 6437 | bio = orig_bio; | 7125 | bio = orig_bio; |
| 6438 | goto submit; | 7126 | goto submit; |
| 6439 | } | 7127 | } |
| 6440 | 7128 | ||
| 6441 | async_submit = 1; | 7129 | /* async crcs make it difficult to collect full stripe writes. */ |
| 7130 | if (btrfs_get_alloc_profile(root, 1) & | ||
| 7131 | (BTRFS_BLOCK_GROUP_RAID5 | BTRFS_BLOCK_GROUP_RAID6)) | ||
| 7132 | async_submit = 0; | ||
| 7133 | else | ||
| 7134 | async_submit = 1; | ||
| 7135 | |||
| 6442 | bio = btrfs_dio_bio_alloc(orig_bio->bi_bdev, start_sector, GFP_NOFS); | 7136 | bio = btrfs_dio_bio_alloc(orig_bio->bi_bdev, start_sector, GFP_NOFS); |
| 6443 | if (!bio) | 7137 | if (!bio) |
| 6444 | return -ENOMEM; | 7138 | return -ENOMEM; |
| @@ -6480,7 +7174,7 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, | |||
| 6480 | bio->bi_end_io = btrfs_end_dio_bio; | 7174 | bio->bi_end_io = btrfs_end_dio_bio; |
| 6481 | 7175 | ||
| 6482 | map_length = orig_bio->bi_size; | 7176 | map_length = orig_bio->bi_size; |
| 6483 | ret = btrfs_map_block(root->fs_info, READ, | 7177 | ret = btrfs_map_block(root->fs_info, rw, |
| 6484 | start_sector << 9, | 7178 | start_sector << 9, |
| 6485 | &map_length, NULL, 0); | 7179 | &map_length, NULL, 0); |
| 6486 | if (ret) { | 7180 | if (ret) { |
| @@ -6623,15 +7317,60 @@ static ssize_t btrfs_direct_IO(int rw, struct kiocb *iocb, | |||
| 6623 | { | 7317 | { |
| 6624 | struct file *file = iocb->ki_filp; | 7318 | struct file *file = iocb->ki_filp; |
| 6625 | struct inode *inode = file->f_mapping->host; | 7319 | struct inode *inode = file->f_mapping->host; |
| 7320 | size_t count = 0; | ||
| 7321 | int flags = 0; | ||
| 7322 | bool wakeup = true; | ||
| 7323 | bool relock = false; | ||
| 7324 | ssize_t ret; | ||
| 6626 | 7325 | ||
| 6627 | if (check_direct_IO(BTRFS_I(inode)->root, rw, iocb, iov, | 7326 | if (check_direct_IO(BTRFS_I(inode)->root, rw, iocb, iov, |
| 6628 | offset, nr_segs)) | 7327 | offset, nr_segs)) |
| 6629 | return 0; | 7328 | return 0; |
| 6630 | 7329 | ||
| 6631 | return __blockdev_direct_IO(rw, iocb, inode, | 7330 | atomic_inc(&inode->i_dio_count); |
| 6632 | BTRFS_I(inode)->root->fs_info->fs_devices->latest_bdev, | 7331 | smp_mb__after_atomic_inc(); |
| 6633 | iov, offset, nr_segs, btrfs_get_blocks_direct, NULL, | 7332 | |
| 6634 | btrfs_submit_direct, 0); | 7333 | if (rw & WRITE) { |
| 7334 | count = iov_length(iov, nr_segs); | ||
| 7335 | /* | ||
| 7336 | * If the write DIO is beyond the EOF, we need update | ||
| 7337 | * the isize, but it is protected by i_mutex. So we can | ||
| 7338 | * not unlock the i_mutex at this case. | ||
| 7339 | */ | ||
| 7340 | if (offset + count <= inode->i_size) { | ||
| 7341 | mutex_unlock(&inode->i_mutex); | ||
| 7342 | relock = true; | ||
| 7343 | } | ||
| 7344 | ret = btrfs_delalloc_reserve_space(inode, count); | ||
| 7345 | if (ret) | ||
| 7346 | goto out; | ||
| 7347 | } else if (unlikely(test_bit(BTRFS_INODE_READDIO_NEED_LOCK, | ||
| 7348 | &BTRFS_I(inode)->runtime_flags))) { | ||
| 7349 | inode_dio_done(inode); | ||
| 7350 | flags = DIO_LOCKING | DIO_SKIP_HOLES; | ||
| 7351 | wakeup = false; | ||
| 7352 | } | ||
| 7353 | |||
| 7354 | ret = __blockdev_direct_IO(rw, iocb, inode, | ||
| 7355 | BTRFS_I(inode)->root->fs_info->fs_devices->latest_bdev, | ||
| 7356 | iov, offset, nr_segs, btrfs_get_blocks_direct, NULL, | ||
| 7357 | btrfs_submit_direct, flags); | ||
| 7358 | if (rw & WRITE) { | ||
| 7359 | if (ret < 0 && ret != -EIOCBQUEUED) | ||
| 7360 | btrfs_delalloc_release_space(inode, count); | ||
| 7361 | else if (ret >= 0 && (size_t)ret < count) | ||
| 7362 | btrfs_delalloc_release_space(inode, | ||
| 7363 | count - (size_t)ret); | ||
| 7364 | else | ||
| 7365 | btrfs_delalloc_release_metadata(inode, 0); | ||
| 7366 | } | ||
| 7367 | out: | ||
| 7368 | if (wakeup) | ||
| 7369 | inode_dio_done(inode); | ||
| 7370 | if (relock) | ||
| 7371 | mutex_lock(&inode->i_mutex); | ||
| 7372 | |||
| 7373 | return ret; | ||
| 6635 | } | 7374 | } |
| 6636 | 7375 | ||
| 6637 | #define BTRFS_FIEMAP_FLAGS (FIEMAP_FLAG_SYNC) | 7376 | #define BTRFS_FIEMAP_FLAGS (FIEMAP_FLAG_SYNC) |
| @@ -6735,8 +7474,7 @@ static void btrfs_invalidatepage(struct page *page, unsigned long offset) | |||
| 6735 | return; | 7474 | return; |
| 6736 | } | 7475 | } |
| 6737 | lock_extent_bits(tree, page_start, page_end, 0, &cached_state); | 7476 | lock_extent_bits(tree, page_start, page_end, 0, &cached_state); |
| 6738 | ordered = btrfs_lookup_ordered_extent(inode, | 7477 | ordered = btrfs_lookup_ordered_extent(inode, page_offset(page)); |
| 6739 | page_offset(page)); | ||
| 6740 | if (ordered) { | 7478 | if (ordered) { |
| 6741 | /* | 7479 | /* |
| 6742 | * IO on this page will never be started, so we need | 7480 | * IO on this page will never be started, so we need |
| @@ -7216,8 +7954,9 @@ int btrfs_drop_inode(struct inode *inode) | |||
| 7216 | { | 7954 | { |
| 7217 | struct btrfs_root *root = BTRFS_I(inode)->root; | 7955 | struct btrfs_root *root = BTRFS_I(inode)->root; |
| 7218 | 7956 | ||
| 7957 | /* the snap/subvol tree is on deleting */ | ||
| 7219 | if (btrfs_root_refs(&root->root_item) == 0 && | 7958 | if (btrfs_root_refs(&root->root_item) == 0 && |
| 7220 | !btrfs_is_free_space_inode(inode)) | 7959 | root != root->fs_info->tree_root) |
| 7221 | return 1; | 7960 | return 1; |
| 7222 | else | 7961 | else |
| 7223 | return generic_drop_inode(inode); | 7962 | return generic_drop_inode(inode); |
| @@ -7299,40 +8038,22 @@ fail: | |||
| 7299 | static int btrfs_getattr(struct vfsmount *mnt, | 8038 | static int btrfs_getattr(struct vfsmount *mnt, |
| 7300 | struct dentry *dentry, struct kstat *stat) | 8039 | struct dentry *dentry, struct kstat *stat) |
| 7301 | { | 8040 | { |
| 8041 | u64 delalloc_bytes; | ||
| 7302 | struct inode *inode = dentry->d_inode; | 8042 | struct inode *inode = dentry->d_inode; |
| 7303 | u32 blocksize = inode->i_sb->s_blocksize; | 8043 | u32 blocksize = inode->i_sb->s_blocksize; |
| 7304 | 8044 | ||
| 7305 | generic_fillattr(inode, stat); | 8045 | generic_fillattr(inode, stat); |
| 7306 | stat->dev = BTRFS_I(inode)->root->anon_dev; | 8046 | stat->dev = BTRFS_I(inode)->root->anon_dev; |
| 7307 | stat->blksize = PAGE_CACHE_SIZE; | 8047 | stat->blksize = PAGE_CACHE_SIZE; |
| 8048 | |||
| 8049 | spin_lock(&BTRFS_I(inode)->lock); | ||
| 8050 | delalloc_bytes = BTRFS_I(inode)->delalloc_bytes; | ||
| 8051 | spin_unlock(&BTRFS_I(inode)->lock); | ||
| 7308 | stat->blocks = (ALIGN(inode_get_bytes(inode), blocksize) + | 8052 | stat->blocks = (ALIGN(inode_get_bytes(inode), blocksize) + |
| 7309 | ALIGN(BTRFS_I(inode)->delalloc_bytes, blocksize)) >> 9; | 8053 | ALIGN(delalloc_bytes, blocksize)) >> 9; |
| 7310 | return 0; | 8054 | return 0; |
| 7311 | } | 8055 | } |
| 7312 | 8056 | ||
| 7313 | /* | ||
| 7314 | * If a file is moved, it will inherit the cow and compression flags of the new | ||
| 7315 | * directory. | ||
| 7316 | */ | ||
| 7317 | static void fixup_inode_flags(struct inode *dir, struct inode *inode) | ||
| 7318 | { | ||
| 7319 | struct btrfs_inode *b_dir = BTRFS_I(dir); | ||
| 7320 | struct btrfs_inode *b_inode = BTRFS_I(inode); | ||
| 7321 | |||
| 7322 | if (b_dir->flags & BTRFS_INODE_NODATACOW) | ||
| 7323 | b_inode->flags |= BTRFS_INODE_NODATACOW; | ||
| 7324 | else | ||
| 7325 | b_inode->flags &= ~BTRFS_INODE_NODATACOW; | ||
| 7326 | |||
| 7327 | if (b_dir->flags & BTRFS_INODE_COMPRESS) { | ||
| 7328 | b_inode->flags |= BTRFS_INODE_COMPRESS; | ||
| 7329 | b_inode->flags &= ~BTRFS_INODE_NOCOMPRESS; | ||
| 7330 | } else { | ||
| 7331 | b_inode->flags &= ~(BTRFS_INODE_COMPRESS | | ||
| 7332 | BTRFS_INODE_NOCOMPRESS); | ||
| 7333 | } | ||
| 7334 | } | ||
| 7335 | |||
| 7336 | static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | 8057 | static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, |
| 7337 | struct inode *new_dir, struct dentry *new_dentry) | 8058 | struct inode *new_dir, struct dentry *new_dentry) |
| 7338 | { | 8059 | { |
| @@ -7498,8 +8219,6 @@ static int btrfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 7498 | } | 8219 | } |
| 7499 | } | 8220 | } |
| 7500 | 8221 | ||
| 7501 | fixup_inode_flags(new_dir, old_inode); | ||
| 7502 | |||
| 7503 | ret = btrfs_add_link(trans, new_dir, old_inode, | 8222 | ret = btrfs_add_link(trans, new_dir, old_inode, |
| 7504 | new_dentry->d_name.name, | 8223 | new_dentry->d_name.name, |
| 7505 | new_dentry->d_name.len, 0, index); | 8224 | new_dentry->d_name.len, 0, index); |
| @@ -7583,7 +8302,7 @@ int btrfs_start_delalloc_inodes(struct btrfs_root *root, int delay_iput) | |||
| 7583 | 8302 | ||
| 7584 | INIT_LIST_HEAD(&works); | 8303 | INIT_LIST_HEAD(&works); |
| 7585 | INIT_LIST_HEAD(&splice); | 8304 | INIT_LIST_HEAD(&splice); |
| 7586 | again: | 8305 | |
| 7587 | spin_lock(&root->fs_info->delalloc_lock); | 8306 | spin_lock(&root->fs_info->delalloc_lock); |
| 7588 | list_splice_init(&root->fs_info->delalloc_inodes, &splice); | 8307 | list_splice_init(&root->fs_info->delalloc_inodes, &splice); |
| 7589 | while (!list_empty(&splice)) { | 8308 | while (!list_empty(&splice)) { |
| @@ -7593,8 +8312,11 @@ again: | |||
| 7593 | list_del_init(&binode->delalloc_inodes); | 8312 | list_del_init(&binode->delalloc_inodes); |
| 7594 | 8313 | ||
| 7595 | inode = igrab(&binode->vfs_inode); | 8314 | inode = igrab(&binode->vfs_inode); |
| 7596 | if (!inode) | 8315 | if (!inode) { |
| 8316 | clear_bit(BTRFS_INODE_IN_DELALLOC_LIST, | ||
| 8317 | &binode->runtime_flags); | ||
| 7597 | continue; | 8318 | continue; |
| 8319 | } | ||
| 7598 | 8320 | ||
| 7599 | list_add_tail(&binode->delalloc_inodes, | 8321 | list_add_tail(&binode->delalloc_inodes, |
| 7600 | &root->fs_info->delalloc_inodes); | 8322 | &root->fs_info->delalloc_inodes); |
| @@ -7619,13 +8341,6 @@ again: | |||
| 7619 | btrfs_wait_and_free_delalloc_work(work); | 8341 | btrfs_wait_and_free_delalloc_work(work); |
| 7620 | } | 8342 | } |
| 7621 | 8343 | ||
| 7622 | spin_lock(&root->fs_info->delalloc_lock); | ||
| 7623 | if (!list_empty(&root->fs_info->delalloc_inodes)) { | ||
| 7624 | spin_unlock(&root->fs_info->delalloc_lock); | ||
| 7625 | goto again; | ||
| 7626 | } | ||
| 7627 | spin_unlock(&root->fs_info->delalloc_lock); | ||
| 7628 | |||
| 7629 | /* the filemap_flush will queue IO into the worker threads, but | 8344 | /* the filemap_flush will queue IO into the worker threads, but |
| 7630 | * we have to make sure the IO is actually started and that | 8345 | * we have to make sure the IO is actually started and that |
| 7631 | * ordered extents get created before we return | 8346 | * ordered extents get created before we return |
| @@ -7801,8 +8516,9 @@ static int __btrfs_prealloc_file_range(struct inode *inode, int mode, | |||
| 7801 | } | 8516 | } |
| 7802 | } | 8517 | } |
| 7803 | 8518 | ||
| 7804 | ret = btrfs_reserve_extent(trans, root, num_bytes, min_size, | 8519 | ret = btrfs_reserve_extent(trans, root, |
| 7805 | 0, *alloc_hint, &ins, 1); | 8520 | min(num_bytes, 256ULL * 1024 * 1024), |
| 8521 | min_size, 0, *alloc_hint, &ins, 1); | ||
| 7806 | if (ret) { | 8522 | if (ret) { |
| 7807 | if (own_trans) | 8523 | if (own_trans) |
| 7808 | btrfs_end_transaction(trans, root); | 8524 | btrfs_end_transaction(trans, root); |
