From: Kent Overstreet Date: Tue, 14 Nov 2023 23:52:22 +0000 (-0500) Subject: bcachefs: six locks: Fix lost wakeup X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=61b85cb0d773115d9a4b20c3e67286844cf73f34;p=linux.git bcachefs: six locks: Fix lost wakeup In percpu reader mode, trylock() for read had a lost wakeup: on failure to get the lock, we may have caused a writer to fail to get the lock, because we temporarily elevated the reader count. We need to check for waiters after decrementing the read count - not before. Signed-off-by: Kent Overstreet --- diff --git a/fs/bcachefs/six.c b/fs/bcachefs/six.c index b775cf0fb7cbf..97790445e67ad 100644 --- a/fs/bcachefs/six.c +++ b/fs/bcachefs/six.c @@ -163,8 +163,11 @@ static int __do_six_trylock(struct six_lock *lock, enum six_lock_type type, this_cpu_sub(*lock->readers, !ret); preempt_enable(); - if (!ret && (old & SIX_LOCK_WAITING_write)) - ret = -1 - SIX_LOCK_write; + if (!ret) { + smp_mb(); + if (atomic_read(&lock->state) & SIX_LOCK_WAITING_write) + ret = -1 - SIX_LOCK_write; + } } else if (type == SIX_LOCK_write && lock->readers) { if (try) { atomic_add(SIX_LOCK_HELD_write, &lock->state);