Unverified Commit 777ee5ee authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

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

parents 65730a66 1b8252c1
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -486,7 +486,7 @@ struct btrfs_block_rsv *btrfs_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 = btrfs_block_rsv_use_bytes(block_rsv, blocksize);
+16 −0
Original line number Diff line number Diff line
@@ -101,4 +101,20 @@ static inline bool btrfs_block_rsv_full(const struct btrfs_block_rsv *rsv)
	return data_race(rsv->full);
}

/*
 * 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;
}

#endif /* BTRFS_BLOCK_RSV_H */