diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2016-11-04 23:08:16 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-11-04 23:08:16 -0400 |
commit | 46d7cbb2c49ac93246aad9ac76b39ef2ac7bc41b (patch) | |
tree | 0315062e93f9b81a500bc9cf628c6053b350c17d /fs | |
parent | bd30fac18f9ec12b0c2590ebdb8e18ddb104c065 (diff) | |
parent | 9d1032cc49a8a1065e79ee323de66bcb4fdbd535 (diff) |
Merge branch 'for-4.9-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux
Pull btrfs fixes from Chris Mason:
"Some fixes that Dave Sterba collected. We held off on these last week
because I was focused on the memory corruption testing"
* 'for-4.9-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux:
btrfs: fix WARNING in btrfs_select_ref_head()
Btrfs: remove some no-op casts
btrfs: pass correct args to btrfs_async_run_delayed_refs()
btrfs: make file clone aware of fatal signals
btrfs: qgroup: Prevent qgroup->reserved from going subzero
Btrfs: kill BUG_ON in do_relocation
Diffstat (limited to 'fs')
-rw-r--r-- | fs/btrfs/extent-tree.c | 3 | ||||
-rw-r--r-- | fs/btrfs/extent_io.c | 8 | ||||
-rw-r--r-- | fs/btrfs/inode.c | 13 | ||||
-rw-r--r-- | fs/btrfs/ioctl.c | 5 | ||||
-rw-r--r-- | fs/btrfs/relocation.c | 9 |
5 files changed, 29 insertions, 9 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 210c94ac8818..4607af38c72e 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
@@ -2647,7 +2647,10 @@ static noinline int __btrfs_run_delayed_refs(struct btrfs_trans_handle *trans, | |||
2647 | 2647 | ||
2648 | btrfs_free_delayed_extent_op(extent_op); | 2648 | btrfs_free_delayed_extent_op(extent_op); |
2649 | if (ret) { | 2649 | if (ret) { |
2650 | spin_lock(&delayed_refs->lock); | ||
2650 | locked_ref->processing = 0; | 2651 | locked_ref->processing = 0; |
2652 | delayed_refs->num_heads_ready++; | ||
2653 | spin_unlock(&delayed_refs->lock); | ||
2651 | btrfs_delayed_ref_unlock(locked_ref); | 2654 | btrfs_delayed_ref_unlock(locked_ref); |
2652 | btrfs_put_delayed_ref(ref); | 2655 | btrfs_put_delayed_ref(ref); |
2653 | btrfs_debug(fs_info, "run_one_delayed_ref returned %d", | 2656 | btrfs_debug(fs_info, "run_one_delayed_ref returned %d", |
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 66a755150056..8ed05d95584a 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c | |||
@@ -5569,7 +5569,7 @@ void le_bitmap_set(u8 *map, unsigned int start, int len) | |||
5569 | *p |= mask_to_set; | 5569 | *p |= mask_to_set; |
5570 | len -= bits_to_set; | 5570 | len -= bits_to_set; |
5571 | bits_to_set = BITS_PER_BYTE; | 5571 | bits_to_set = BITS_PER_BYTE; |
5572 | mask_to_set = ~(u8)0; | 5572 | mask_to_set = ~0; |
5573 | p++; | 5573 | p++; |
5574 | } | 5574 | } |
5575 | if (len) { | 5575 | if (len) { |
@@ -5589,7 +5589,7 @@ void le_bitmap_clear(u8 *map, unsigned int start, int len) | |||
5589 | *p &= ~mask_to_clear; | 5589 | *p &= ~mask_to_clear; |
5590 | len -= bits_to_clear; | 5590 | len -= bits_to_clear; |
5591 | bits_to_clear = BITS_PER_BYTE; | 5591 | bits_to_clear = BITS_PER_BYTE; |
5592 | mask_to_clear = ~(u8)0; | 5592 | mask_to_clear = ~0; |
5593 | p++; | 5593 | p++; |
5594 | } | 5594 | } |
5595 | if (len) { | 5595 | if (len) { |
@@ -5679,7 +5679,7 @@ void extent_buffer_bitmap_set(struct extent_buffer *eb, unsigned long start, | |||
5679 | kaddr[offset] |= mask_to_set; | 5679 | kaddr[offset] |= mask_to_set; |
5680 | len -= bits_to_set; | 5680 | len -= bits_to_set; |
5681 | bits_to_set = BITS_PER_BYTE; | 5681 | bits_to_set = BITS_PER_BYTE; |
5682 | mask_to_set = ~(u8)0; | 5682 | mask_to_set = ~0; |
5683 | if (++offset >= PAGE_SIZE && len > 0) { | 5683 | if (++offset >= PAGE_SIZE && len > 0) { |
5684 | offset = 0; | 5684 | offset = 0; |
5685 | page = eb->pages[++i]; | 5685 | page = eb->pages[++i]; |
@@ -5721,7 +5721,7 @@ void extent_buffer_bitmap_clear(struct extent_buffer *eb, unsigned long start, | |||
5721 | kaddr[offset] &= ~mask_to_clear; | 5721 | kaddr[offset] &= ~mask_to_clear; |
5722 | len -= bits_to_clear; | 5722 | len -= bits_to_clear; |
5723 | bits_to_clear = BITS_PER_BYTE; | 5723 | bits_to_clear = BITS_PER_BYTE; |
5724 | mask_to_clear = ~(u8)0; | 5724 | mask_to_clear = ~0; |
5725 | if (++offset >= PAGE_SIZE && len > 0) { | 5725 | if (++offset >= PAGE_SIZE && len > 0) { |
5726 | offset = 0; | 5726 | offset = 0; |
5727 | page = eb->pages[++i]; | 5727 | page = eb->pages[++i]; |
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 2b790bda7998..8e3a5a266917 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -4605,8 +4605,8 @@ delete: | |||
4605 | BUG_ON(ret); | 4605 | BUG_ON(ret); |
4606 | if (btrfs_should_throttle_delayed_refs(trans, root)) | 4606 | if (btrfs_should_throttle_delayed_refs(trans, root)) |
4607 | btrfs_async_run_delayed_refs(root, | 4607 | btrfs_async_run_delayed_refs(root, |
4608 | trans->transid, | 4608 | trans->delayed_ref_updates * 2, |
4609 | trans->delayed_ref_updates * 2, 0); | 4609 | trans->transid, 0); |
4610 | if (be_nice) { | 4610 | if (be_nice) { |
4611 | if (truncate_space_check(trans, root, | 4611 | if (truncate_space_check(trans, root, |
4612 | extent_num_bytes)) { | 4612 | extent_num_bytes)) { |
@@ -8931,9 +8931,14 @@ again: | |||
8931 | * So even we call qgroup_free_data(), it won't decrease reserved | 8931 | * So even we call qgroup_free_data(), it won't decrease reserved |
8932 | * space. | 8932 | * space. |
8933 | * 2) Not written to disk | 8933 | * 2) Not written to disk |
8934 | * This means the reserved space should be freed here. | 8934 | * This means the reserved space should be freed here. However, |
8935 | * if a truncate invalidates the page (by clearing PageDirty) | ||
8936 | * and the page is accounted for while allocating extent | ||
8937 | * in btrfs_check_data_free_space() we let delayed_ref to | ||
8938 | * free the entire extent. | ||
8935 | */ | 8939 | */ |
8936 | btrfs_qgroup_free_data(inode, page_start, PAGE_SIZE); | 8940 | if (PageDirty(page)) |
8941 | btrfs_qgroup_free_data(inode, page_start, PAGE_SIZE); | ||
8937 | if (!inode_evicting) { | 8942 | if (!inode_evicting) { |
8938 | clear_extent_bit(tree, page_start, page_end, | 8943 | clear_extent_bit(tree, page_start, page_end, |
8939 | EXTENT_LOCKED | EXTENT_DIRTY | | 8944 | EXTENT_LOCKED | EXTENT_DIRTY | |
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 18e1aa0f85f5..7acbd2cf6192 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c | |||
@@ -3814,6 +3814,11 @@ process_slot: | |||
3814 | } | 3814 | } |
3815 | btrfs_release_path(path); | 3815 | btrfs_release_path(path); |
3816 | key.offset = next_key_min_offset; | 3816 | key.offset = next_key_min_offset; |
3817 | |||
3818 | if (fatal_signal_pending(current)) { | ||
3819 | ret = -EINTR; | ||
3820 | goto out; | ||
3821 | } | ||
3817 | } | 3822 | } |
3818 | ret = 0; | 3823 | ret = 0; |
3819 | 3824 | ||
diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c index 0ec8ffa37ab0..c4af0cdb783d 100644 --- a/fs/btrfs/relocation.c +++ b/fs/btrfs/relocation.c | |||
@@ -2728,7 +2728,14 @@ static int do_relocation(struct btrfs_trans_handle *trans, | |||
2728 | 2728 | ||
2729 | bytenr = btrfs_node_blockptr(upper->eb, slot); | 2729 | bytenr = btrfs_node_blockptr(upper->eb, slot); |
2730 | if (lowest) { | 2730 | if (lowest) { |
2731 | BUG_ON(bytenr != node->bytenr); | 2731 | if (bytenr != node->bytenr) { |
2732 | btrfs_err(root->fs_info, | ||
2733 | "lowest leaf/node mismatch: bytenr %llu node->bytenr %llu slot %d upper %llu", | ||
2734 | bytenr, node->bytenr, slot, | ||
2735 | upper->eb->start); | ||
2736 | err = -EIO; | ||
2737 | goto next; | ||
2738 | } | ||
2732 | } else { | 2739 | } else { |
2733 | if (node->eb->start == bytenr) | 2740 | if (node->eb->start == bytenr) |
2734 | goto next; | 2741 | goto next; |