aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/module-common.c
diff options
context:
space:
mode:
authorFilipe Manana <[email protected]>2025-08-06 11:11:32 +0000
committerDavid Sterba <[email protected]>2025-08-21 22:58:55 +0000
commit986bf6ed44dff7fbae7b43a0882757ee7f5ba21b (patch)
tree8d8c929e81980ea58276a6deefd120ad442a8b5f /scripts/module-common.c
parentbtrfs: fix race between setting last_dir_index_offset and inode logging (diff)
downloadkernel-986bf6ed44dff7fbae7b43a0882757ee7f5ba21b.tar.gz
kernel-986bf6ed44dff7fbae7b43a0882757ee7f5ba21b.zip
btrfs: avoid load/store tearing races when checking if an inode was logged
At inode_logged() we do a couple lockless checks for ->logged_trans, and these are generally safe except the second one in case we get a load or store tearing due to a concurrent call updating ->logged_trans (either at btrfs_log_inode() or later at inode_logged()). In the first case it's safe to compare to the current transaction ID since once ->logged_trans is set the current transaction, we never set it to a lower value. In the second case, where we check if it's greater than zero, we are prone to load/store tearing races, since we can have a concurrent task updating to the current transaction ID with store tearing for example, instead of updating with a single 64 bits write, to update with two 32 bits writes or four 16 bits writes. In that case the reading side at inode_logged() could see a positive value that does not match the current transaction and then return a false negative. Fix this by doing the second check while holding the inode's spinlock, add some comments about it too. Also add the data_race() annotation to the first check to avoid any reports from KCSAN (or similar tools) and comment about it. Fixes: 0f8ce49821de ("btrfs: avoid inode logging during rename and link when possible") Reviewed-by: Boris Burkov <[email protected]> Signed-off-by: Filipe Manana <[email protected]> Signed-off-by: David Sterba <[email protected]>
Diffstat (limited to 'scripts/module-common.c')
0 files changed, 0 insertions, 0 deletions