Commit 46d7cbb2 authored by Linus Torvalds's avatar Linus Torvalds

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
parents bd30fac1 9d1032cc
...@@ -2647,7 +2647,10 @@ static noinline int __btrfs_run_delayed_refs(struct btrfs_trans_handle *trans, ...@@ -2647,7 +2647,10 @@ static noinline int __btrfs_run_delayed_refs(struct btrfs_trans_handle *trans,
btrfs_free_delayed_extent_op(extent_op); btrfs_free_delayed_extent_op(extent_op);
if (ret) { if (ret) {
spin_lock(&delayed_refs->lock);
locked_ref->processing = 0; locked_ref->processing = 0;
delayed_refs->num_heads_ready++;
spin_unlock(&delayed_refs->lock);
btrfs_delayed_ref_unlock(locked_ref); btrfs_delayed_ref_unlock(locked_ref);
btrfs_put_delayed_ref(ref); btrfs_put_delayed_ref(ref);
btrfs_debug(fs_info, "run_one_delayed_ref returned %d", btrfs_debug(fs_info, "run_one_delayed_ref returned %d",
......
...@@ -5569,7 +5569,7 @@ void le_bitmap_set(u8 *map, unsigned int start, int len) ...@@ -5569,7 +5569,7 @@ void le_bitmap_set(u8 *map, unsigned int start, int len)
*p |= mask_to_set; *p |= mask_to_set;
len -= bits_to_set; len -= bits_to_set;
bits_to_set = BITS_PER_BYTE; bits_to_set = BITS_PER_BYTE;
mask_to_set = ~(u8)0; mask_to_set = ~0;
p++; p++;
} }
if (len) { if (len) {
...@@ -5589,7 +5589,7 @@ void le_bitmap_clear(u8 *map, unsigned int start, int len) ...@@ -5589,7 +5589,7 @@ void le_bitmap_clear(u8 *map, unsigned int start, int len)
*p &= ~mask_to_clear; *p &= ~mask_to_clear;
len -= bits_to_clear; len -= bits_to_clear;
bits_to_clear = BITS_PER_BYTE; bits_to_clear = BITS_PER_BYTE;
mask_to_clear = ~(u8)0; mask_to_clear = ~0;
p++; p++;
} }
if (len) { if (len) {
...@@ -5679,7 +5679,7 @@ void extent_buffer_bitmap_set(struct extent_buffer *eb, unsigned long start, ...@@ -5679,7 +5679,7 @@ void extent_buffer_bitmap_set(struct extent_buffer *eb, unsigned long start,
kaddr[offset] |= mask_to_set; kaddr[offset] |= mask_to_set;
len -= bits_to_set; len -= bits_to_set;
bits_to_set = BITS_PER_BYTE; bits_to_set = BITS_PER_BYTE;
mask_to_set = ~(u8)0; mask_to_set = ~0;
if (++offset >= PAGE_SIZE && len > 0) { if (++offset >= PAGE_SIZE && len > 0) {
offset = 0; offset = 0;
page = eb->pages[++i]; page = eb->pages[++i];
...@@ -5721,7 +5721,7 @@ void extent_buffer_bitmap_clear(struct extent_buffer *eb, unsigned long start, ...@@ -5721,7 +5721,7 @@ void extent_buffer_bitmap_clear(struct extent_buffer *eb, unsigned long start,
kaddr[offset] &= ~mask_to_clear; kaddr[offset] &= ~mask_to_clear;
len -= bits_to_clear; len -= bits_to_clear;
bits_to_clear = BITS_PER_BYTE; bits_to_clear = BITS_PER_BYTE;
mask_to_clear = ~(u8)0; mask_to_clear = ~0;
if (++offset >= PAGE_SIZE && len > 0) { if (++offset >= PAGE_SIZE && len > 0) {
offset = 0; offset = 0;
page = eb->pages[++i]; page = eb->pages[++i];
......
...@@ -4605,8 +4605,8 @@ int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans, ...@@ -4605,8 +4605,8 @@ int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans,
BUG_ON(ret); BUG_ON(ret);
if (btrfs_should_throttle_delayed_refs(trans, root)) if (btrfs_should_throttle_delayed_refs(trans, root))
btrfs_async_run_delayed_refs(root, btrfs_async_run_delayed_refs(root,
trans->transid, trans->delayed_ref_updates * 2,
trans->delayed_ref_updates * 2, 0); trans->transid, 0);
if (be_nice) { if (be_nice) {
if (truncate_space_check(trans, root, if (truncate_space_check(trans, root,
extent_num_bytes)) { extent_num_bytes)) {
...@@ -8931,8 +8931,13 @@ static void btrfs_invalidatepage(struct page *page, unsigned int offset, ...@@ -8931,8 +8931,13 @@ static void btrfs_invalidatepage(struct page *page, unsigned int offset,
* So even we call qgroup_free_data(), it won't decrease reserved * So even we call qgroup_free_data(), it won't decrease reserved
* space. * space.
* 2) Not written to disk * 2) Not written to disk
* This means the reserved space should be freed here. * This means the reserved space should be freed here. However,
* if a truncate invalidates the page (by clearing PageDirty)
* and the page is accounted for while allocating extent
* in btrfs_check_data_free_space() we let delayed_ref to
* free the entire extent.
*/ */
if (PageDirty(page))
btrfs_qgroup_free_data(inode, page_start, PAGE_SIZE); btrfs_qgroup_free_data(inode, page_start, PAGE_SIZE);
if (!inode_evicting) { if (!inode_evicting) {
clear_extent_bit(tree, page_start, page_end, clear_extent_bit(tree, page_start, page_end,
......
...@@ -3814,6 +3814,11 @@ static int btrfs_clone(struct inode *src, struct inode *inode, ...@@ -3814,6 +3814,11 @@ static int btrfs_clone(struct inode *src, struct inode *inode,
} }
btrfs_release_path(path); btrfs_release_path(path);
key.offset = next_key_min_offset; key.offset = next_key_min_offset;
if (fatal_signal_pending(current)) {
ret = -EINTR;
goto out;
}
} }
ret = 0; ret = 0;
......
...@@ -2728,7 +2728,14 @@ static int do_relocation(struct btrfs_trans_handle *trans, ...@@ -2728,7 +2728,14 @@ static int do_relocation(struct btrfs_trans_handle *trans,
bytenr = btrfs_node_blockptr(upper->eb, slot); bytenr = btrfs_node_blockptr(upper->eb, slot);
if (lowest) { if (lowest) {
BUG_ON(bytenr != node->bytenr); if (bytenr != node->bytenr) {
btrfs_err(root->fs_info,
"lowest leaf/node mismatch: bytenr %llu node->bytenr %llu slot %d upper %llu",
bytenr, node->bytenr, slot,
upper->eb->start);
err = -EIO;
goto next;
}
} else { } else {
if (node->eb->start == bytenr) if (node->eb->start == bytenr)
goto next; goto next;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment