Unverified Commit 220dd43f authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!6397 btrfs: fix data race at btrfs_use_block_rsv() when accessing block reserve

parents 28b2cacc 5a1ba47b
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -2815,6 +2815,22 @@ u64 add_new_free_space(struct btrfs_block_group_cache *block_group,
		       u64 start, u64 end);
void btrfs_mark_bg_unused(struct btrfs_block_group_cache *bg);

/*
 * Get the size of a block reserve in a context where getting a stale value is
 * acceptable, instead of accessing it directly and trigger data race warning
 * from KCSAN.
 */
static inline u64 btrfs_block_rsv_size(struct btrfs_block_rsv *rsv)
{
	u64 ret;

	spin_lock(&rsv->lock);
	ret = rsv->size;
	spin_unlock(&rsv->lock);

	return ret;
}

/* ctree.c */
int btrfs_bin_search(struct extent_buffer *eb, const struct btrfs_key *key,
		     int level, int *slot);
+1 −1
Original line number Diff line number Diff line
@@ -8188,7 +8188,7 @@ use_block_rsv(struct btrfs_trans_handle *trans,

	block_rsv = get_block_rsv(trans, root);

	if (unlikely(block_rsv->size == 0))
	if (unlikely(btrfs_block_rsv_size(block_rsv) == 0))
		goto try_reserve;
again:
	ret = block_rsv_use_bytes(block_rsv, blocksize);