Commit 61b85cb0 authored by Kent Overstreet's avatar Kent Overstreet
Browse files

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: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent 62d73dfc
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -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))
		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);