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