btrfs: annotate block group access with data_race() when sorting for reclaim

When sorting the block group list for reclaim we are using a block group's
used bytes counter without taking the block group's spinlock, so we can
race with a concurrent task updating it (at btrfs_update_block_group()),
which makes tools like KCSAN unhappy and report a race.

Since the sorting is not strictly needed from a functional perspective
and such races should rarely cause any ordering changes (only load/store
tearing could cause them), not to mention that after the sorting the
ordering may no longer be accurate due to concurrent allocations and
deallocations of extents in a block group, annotate the accesses to the
used counter with data_race() to silence KCSAN and similar tools.

Reviewed-by: Qu Wenruo <wqu@suse.com>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>

authored by Filipe Manana and committed by David Sterba 80eb65cc 8679d268

+8 -1
+8 -1
fs/btrfs/block-group.c
··· 1795 1795 bg1 = list_entry(a, struct btrfs_block_group, bg_list); 1796 1796 bg2 = list_entry(b, struct btrfs_block_group, bg_list); 1797 1797 1798 - return bg1->used > bg2->used; 1798 + /* 1799 + * Some other task may be updating the ->used field concurrently, but it 1800 + * is not serious if we get a stale value or load/store tearing issues, 1801 + * as sorting the list of block groups to reclaim is not critical and an 1802 + * occasional imperfect order is ok. So silence KCSAN and avoid the 1803 + * overhead of locking or any other synchronization. 1804 + */ 1805 + return data_race(bg1->used > bg2->used); 1799 1806 } 1800 1807 1801 1808 static inline bool btrfs_should_reclaim(const struct btrfs_fs_info *fs_info)