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

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

parents acaaafd2 d03e0696
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -485,7 +485,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
@@ -90,4 +90,20 @@ static inline void btrfs_unuse_block_rsv(struct btrfs_fs_info *fs_info,
	btrfs_block_rsv_release(fs_info, block_rsv, 0, NULL);
}

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