Commit e6dd405b authored by Filipe Manana's avatar Filipe Manana Committed by David Sterba
Browse files

btrfs: abort transaction in the process_one_buffer() log tree walk callback



In the process_one_buffer() log tree walk callback we return errors to the
log tree walk caller and then the caller aborts the transaction, if we
have one, or turns the fs into error state if we don't have one. While
this reduces code it makes it harder to figure out where exactly an error
came from. So add the transaction aborts after every failure inside the
process_one_buffer() callback, so that it helps figuring out why failures
happen.

Reviewed-by: default avatarBoris Burkov <boris@bur.io>
Reviewed-by: default avatarQu Wenruo <wqu@suse.com>
Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 6ebd726b
Loading
Loading
Loading
Loading
+16 −4
Original line number Diff line number Diff line
@@ -347,6 +347,7 @@ static int process_one_buffer(struct btrfs_root *log,
			      struct extent_buffer *eb,
			      struct walk_control *wc, u64 gen, int level)
{
	struct btrfs_trans_handle *trans = wc->trans;
	struct btrfs_fs_info *fs_info = log->fs_info;
	int ret = 0;

@@ -361,18 +362,29 @@ static int process_one_buffer(struct btrfs_root *log,
		};

		ret = btrfs_read_extent_buffer(eb, &check);
		if (ret)
		if (ret) {
			if (trans)
				btrfs_abort_transaction(trans, ret);
			else
				btrfs_handle_fs_error(fs_info, ret, NULL);
			return ret;
		}
	}

	if (wc->pin) {
		ret = btrfs_pin_extent_for_log_replay(wc->trans, eb);
		if (ret)
		ASSERT(trans != NULL);
		ret = btrfs_pin_extent_for_log_replay(trans, eb);
		if (ret) {
			btrfs_abort_transaction(trans, ret);
			return ret;
		}

		if (btrfs_buffer_uptodate(eb, gen, 0) &&
		    btrfs_header_level(eb) == 0)
		    btrfs_header_level(eb) == 0) {
			ret = btrfs_exclude_logged_extents(eb);
			if (ret)
				btrfs_abort_transaction(trans, ret);
		}
	}
	return ret;
}