bcachefs: Fix lost wake up
authorAlan Huang <mmpgouride@gmail.com>
Tue, 27 Aug 2024 15:14:48 +0000 (23:14 +0800)
committerKent Overstreet <kent.overstreet@linux.dev>
Sat, 28 Sep 2024 02:32:23 +0000 (22:32 -0400)
commite057a290ef715d2765560778625e1660b7352994
treea4bad53c297e41293809b9b685de8bc2111c5a92
parentd50d7a5fa4df3190b6b6c6d6551b631fda4a4ed2
bcachefs: Fix lost wake up

If the reader acquires the read lock and then the writer enters the slow
path, while the reader proceeds to the unlock path, the following scenario
can occur without the change:

writer: pcpu_read_count(lock) return 1 (so __do_six_trylock will return 0)
reader: this_cpu_dec(*lock->readers)
reader: smp_mb()
reader: state = atomic_read(&lock->state) (there is no waiting flag set)
writer: six_set_bitmask()

then the writer will sleep forever.

Signed-off-by: Alan Huang <mmpgouride@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/six.c