Commit eb5b64f1 authored by Dennis Zhou's avatar Dennis Zhou Committed by David Sterba

btrfs: adjust dirty_metadata_bytes after writeback failure of extent buffer

Before, if a eb failed to write out, we would end up triggering a
BUG_ON(). As of f4340622 ("btrfs: extent_io: Move the BUG_ON() in
flush_write_bio() one level up"), we no longer BUG_ON(), so we should
make life consistent and add back the unwritten bytes to
dirty_metadata_bytes.

Fixes: f4340622 ("btrfs: extent_io: Move the BUG_ON() in flush_write_bio() one level up")
CC: stable@vger.kernel.org # 5.2+
Reviewed-by: default avatarFilipe Manana <fdmanana@kernel.org>
Signed-off-by: default avatarDennis Zhou <dennis@kernel.org>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 9f7fec0b
...@@ -3728,11 +3728,20 @@ static void end_extent_buffer_writeback(struct extent_buffer *eb) ...@@ -3728,11 +3728,20 @@ static void end_extent_buffer_writeback(struct extent_buffer *eb)
static void set_btree_ioerr(struct page *page) static void set_btree_ioerr(struct page *page)
{ {
struct extent_buffer *eb = (struct extent_buffer *)page->private; struct extent_buffer *eb = (struct extent_buffer *)page->private;
struct btrfs_fs_info *fs_info;
SetPageError(page); SetPageError(page);
if (test_and_set_bit(EXTENT_BUFFER_WRITE_ERR, &eb->bflags)) if (test_and_set_bit(EXTENT_BUFFER_WRITE_ERR, &eb->bflags))
return; return;
/*
* If we error out, we should add back the dirty_metadata_bytes
* to make it consistent.
*/
fs_info = eb->fs_info;
percpu_counter_add_batch(&fs_info->dirty_metadata_bytes,
eb->len, fs_info->dirty_metadata_batch);
/* /*
* If writeback for a btree extent that doesn't belong to a log tree * If writeback for a btree extent that doesn't belong to a log tree
* failed, increment the counter transaction->eb_write_errors. * failed, increment the counter transaction->eb_write_errors.
......
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