closures: Fix race in closure_sync()
authorKent Overstreet <kent.overstreet@linux.dev>
Tue, 24 Oct 2023 18:46:58 +0000 (14:46 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Tue, 31 Oct 2023 01:48:22 +0000 (21:48 -0400)
commitee526b88caaa4b4182144bf2576af2c3b1e9c759
treed25c1a6b69d86c8a7ed518334dbcc13a842b37e4
parent2bce6368c46b835a133f7f4946eea9c4513828dd
closures: Fix race in closure_sync()

As pointed out by Linus, closure_sync() was racy; we could skip blocking
immediately after a get() and a put(), but then that would skip any
barrier corresponding to the other thread's put() barrier.

To fix this, always do the full __closure_sync() sequence whenever any
get() has happened and the closure might have been used by other
threads.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/fs-io-direct.c
include/linux/closure.h
lib/closure.c