Merge branch 'for-linus-4.7' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux-btrfs

Pull btrfs fixes from Chris Mason:
"I have a two part pull this time because one of the patches Dave
Sterba collected needed to be against v4.7-rc2 or higher (we used
rc4). I try to make my for-linus-xx branch testable on top of the
last major so we can hand fixes to people on the list more easily, so
I've split this pull in two.

This first part has some fixes and two performance improvements that
we've been testing for some time.

Josef's two performance fixes are most notable. The transid tracking
patch makes a big improvement on pretty much every workload"

* 'for-linus-4.7' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux-btrfs:
Btrfs: Force stripesize to the value of sectorsize
btrfs: fix disk_i_size update bug when fallocate() fails
Btrfs: fix error handling in map_private_extent_buffer
Btrfs: fix error return code in btrfs_init_test_fs()
Btrfs: don't do nocow check unless we have to
btrfs: fix deadlock in delayed_ref_async_start
Btrfs: track transid for delayed ref flushing

+5 -1
fs/btrfs/ctree.c
··· 1786 1786 if (!err) { 1787 1787 tmp = (struct btrfs_disk_key *)(kaddr + offset - 1788 1788 map_start); 1789 - } else { 1789 + } else if (err == 1) { 1790 1790 read_extent_buffer(eb, &unaligned, 1791 1791 offset, sizeof(unaligned)); 1792 1792 tmp = &unaligned; 1793 + } else { 1794 + return err; 1793 1795 } 1794 1796 1795 1797 } else { ··· 2832 2830 } 2833 2831 2834 2832 ret = key_search(b, key, level, &prev_cmp, &slot); 2833 + if (ret < 0) 2834 + goto done; 2835 2835 2836 2836 if (level != 0) { 2837 2837 int dec = 0;
+1 -1
fs/btrfs/ctree.h
··· 2518 2518 int btrfs_run_delayed_refs(struct btrfs_trans_handle *trans, 2519 2519 struct btrfs_root *root, unsigned long count); 2520 2520 int btrfs_async_run_delayed_refs(struct btrfs_root *root, 2521 - unsigned long count, int wait); 2521 + unsigned long count, u64 transid, int wait); 2522 2522 int btrfs_lookup_data_extent(struct btrfs_root *root, u64 start, u64 len); 2523 2523 int btrfs_lookup_extent_info(struct btrfs_trans_handle *trans, 2524 2524 struct btrfs_root *root, u64 bytenr,
+2 -4
fs/btrfs/disk-io.c
··· 2806 2806 2807 2807 nodesize = btrfs_super_nodesize(disk_super); 2808 2808 sectorsize = btrfs_super_sectorsize(disk_super); 2809 - stripesize = btrfs_super_stripesize(disk_super); 2809 + stripesize = sectorsize; 2810 2810 fs_info->dirty_metadata_batch = nodesize * (1 + ilog2(nr_cpu_ids)); 2811 2811 fs_info->delalloc_batch = sectorsize * 512 * (1 + ilog2(nr_cpu_ids)); 2812 2812 ··· 4133 4133 btrfs_super_bytes_used(sb)); 4134 4134 ret = -EINVAL; 4135 4135 } 4136 - if (!is_power_of_2(btrfs_super_stripesize(sb)) || 4137 - ((btrfs_super_stripesize(sb) != sectorsize) && 4138 - (btrfs_super_stripesize(sb) != 4096))) { 4136 + if (!is_power_of_2(btrfs_super_stripesize(sb))) { 4139 4137 btrfs_err(fs_info, "invalid stripesize %u", 4140 4138 btrfs_super_stripesize(sb)); 4141 4139 ret = -EINVAL;
+13 -2
fs/btrfs/extent-tree.c
··· 2835 2835 2836 2836 struct async_delayed_refs { 2837 2837 struct btrfs_root *root; 2838 + u64 transid; 2838 2839 int count; 2839 2840 int error; 2840 2841 int sync; ··· 2851 2850 2852 2851 async = container_of(work, struct async_delayed_refs, work); 2853 2852 2853 + /* if the commit is already started, we don't need to wait here */ 2854 + if (btrfs_transaction_blocked(async->root->fs_info)) 2855 + goto done; 2856 + 2854 2857 trans = btrfs_join_transaction(async->root); 2855 2858 if (IS_ERR(trans)) { 2856 2859 async->error = PTR_ERR(trans); ··· 2866 2861 * wait on delayed refs 2867 2862 */ 2868 2863 trans->sync = true; 2864 + 2865 + /* Don't bother flushing if we got into a different transaction */ 2866 + if (trans->transid > async->transid) 2867 + goto end; 2868 + 2869 2869 ret = btrfs_run_delayed_refs(trans, async->root, async->count); 2870 2870 if (ret) 2871 2871 async->error = ret; 2872 - 2872 + end: 2873 2873 ret = btrfs_end_transaction(trans, async->root); 2874 2874 if (ret && !async->error) 2875 2875 async->error = ret; ··· 2886 2876 } 2887 2877 2888 2878 int btrfs_async_run_delayed_refs(struct btrfs_root *root, 2889 - unsigned long count, int wait) 2879 + unsigned long count, u64 transid, int wait) 2890 2880 { 2891 2881 struct async_delayed_refs *async; 2892 2882 int ret; ··· 2898 2888 async->root = root->fs_info->tree_root; 2899 2889 async->count = count; 2900 2890 async->error = 0; 2891 + async->transid = transid; 2901 2892 if (wait) 2902 2893 async->sync = 1; 2903 2894 else
+6 -1
fs/btrfs/extent_io.c
··· 5342 5342 return ret; 5343 5343 } 5344 5344 5345 + /* 5346 + * return 0 if the item is found within a page. 5347 + * return 1 if the item spans two pages. 5348 + * return -EINVAL otherwise. 5349 + */ 5345 5350 int map_private_extent_buffer(struct extent_buffer *eb, unsigned long start, 5346 5351 unsigned long min_len, char **map, 5347 5352 unsigned long *map_start, ··· 5361 5356 PAGE_SHIFT; 5362 5357 5363 5358 if (i != end_i) 5364 - return -EINVAL; 5359 + return 1; 5365 5360 5366 5361 if (i == 0) { 5367 5362 offset = start_offset;
+22 -22
fs/btrfs/file.c
··· 1534 1534 reserve_bytes = round_up(write_bytes + sector_offset, 1535 1535 root->sectorsize); 1536 1536 1537 - if ((BTRFS_I(inode)->flags & (BTRFS_INODE_NODATACOW | 1538 - BTRFS_INODE_PREALLOC)) && 1539 - check_can_nocow(inode, pos, &write_bytes) > 0) { 1540 - /* 1541 - * For nodata cow case, no need to reserve 1542 - * data space. 1543 - */ 1544 - only_release_metadata = true; 1545 - /* 1546 - * our prealloc extent may be smaller than 1547 - * write_bytes, so scale down. 1548 - */ 1549 - num_pages = DIV_ROUND_UP(write_bytes + offset, 1550 - PAGE_SIZE); 1551 - reserve_bytes = round_up(write_bytes + sector_offset, 1552 - root->sectorsize); 1553 - goto reserve_metadata; 1537 + ret = btrfs_check_data_free_space(inode, pos, write_bytes); 1538 + if (ret < 0) { 1539 + if ((BTRFS_I(inode)->flags & (BTRFS_INODE_NODATACOW | 1540 + BTRFS_INODE_PREALLOC)) && 1541 + check_can_nocow(inode, pos, &write_bytes) > 0) { 1542 + /* 1543 + * For nodata cow case, no need to reserve 1544 + * data space. 1545 + */ 1546 + only_release_metadata = true; 1547 + /* 1548 + * our prealloc extent may be smaller than 1549 + * write_bytes, so scale down. 1550 + */ 1551 + num_pages = DIV_ROUND_UP(write_bytes + offset, 1552 + PAGE_SIZE); 1553 + reserve_bytes = round_up(write_bytes + 1554 + sector_offset, 1555 + root->sectorsize); 1556 + } else { 1557 + break; 1558 + } 1554 1559 } 1555 1560 1556 - ret = btrfs_check_data_free_space(inode, pos, write_bytes); 1557 - if (ret < 0) 1558 - break; 1559 - 1560 - reserve_metadata: 1561 1561 ret = btrfs_delalloc_reserve_metadata(inode, reserve_bytes); 1562 1562 if (ret) { 1563 1563 if (!only_release_metadata)
+1
fs/btrfs/inode.c
··· 4558 4558 BUG_ON(ret); 4559 4559 if (btrfs_should_throttle_delayed_refs(trans, root)) 4560 4560 btrfs_async_run_delayed_refs(root, 4561 + trans->transid, 4561 4562 trans->delayed_ref_updates * 2, 0); 4562 4563 if (be_nice) { 4563 4564 if (truncate_space_check(trans, root,
+2 -1
fs/btrfs/ordered-data.c
··· 968 968 struct rb_node *prev = NULL; 969 969 struct btrfs_ordered_extent *test; 970 970 int ret = 1; 971 + u64 orig_offset = offset; 971 972 972 973 spin_lock_irq(&tree->lock); 973 974 if (ordered) { ··· 984 983 985 984 /* truncate file */ 986 985 if (disk_i_size > i_size) { 987 - BTRFS_I(inode)->disk_i_size = i_size; 986 + BTRFS_I(inode)->disk_i_size = orig_offset; 988 987 ret = 0; 989 988 goto out; 990 989 }
+1 -1
fs/btrfs/tests/btrfs-tests.c
··· 68 68 if (IS_ERR(test_mnt)) { 69 69 printk(KERN_ERR "btrfs: cannot mount test file system\n"); 70 70 unregister_filesystem(&test_type); 71 - return ret; 71 + return PTR_ERR(test_mnt); 72 72 } 73 73 return 0; 74 74 }
+2 -1
fs/btrfs/transaction.c
··· 818 818 { 819 819 struct btrfs_transaction *cur_trans = trans->transaction; 820 820 struct btrfs_fs_info *info = root->fs_info; 821 + u64 transid = trans->transid; 821 822 unsigned long cur = trans->delayed_ref_updates; 822 823 int lock = (trans->type != TRANS_JOIN_NOLOCK); 823 824 int err = 0; ··· 906 905 907 906 kmem_cache_free(btrfs_trans_handle_cachep, trans); 908 907 if (must_run_delayed_refs) { 909 - btrfs_async_run_delayed_refs(root, cur, 908 + btrfs_async_run_delayed_refs(root, cur, transid, 910 909 must_run_delayed_refs == 1); 911 910 } 912 911 return err;
+2 -2
fs/btrfs/volumes.c
··· 4694 4694 4695 4695 if (type & BTRFS_BLOCK_GROUP_RAID5) { 4696 4696 raid_stripe_len = find_raid56_stripe_len(ndevs - 1, 4697 - btrfs_super_stripesize(info->super_copy)); 4697 + extent_root->stripesize); 4698 4698 data_stripes = num_stripes - 1; 4699 4699 } 4700 4700 if (type & BTRFS_BLOCK_GROUP_RAID6) { 4701 4701 raid_stripe_len = find_raid56_stripe_len(ndevs - 2, 4702 - btrfs_super_stripesize(info->super_copy)); 4702 + extent_root->stripesize); 4703 4703 data_stripes = num_stripes - 2; 4704 4704 } 4705 4705