aboutsummaryrefslogtreecommitdiff
path: root/fs
diff options
context:
space:
mode:
Diffstat (limited to 'fs')
-rw-r--r--fs/bcachefs/six.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/fs/bcachefs/six.c b/fs/bcachefs/six.c
index 01ff210ff18c..abdc2414f58b 100644
--- a/fs/bcachefs/six.c
+++ b/fs/bcachefs/six.c
@@ -198,6 +198,14 @@ retry:
atomic64_add(__SIX_VAL(write_locking, 1),
&lock->state.counter);
smp_mb__after_atomic();
+ } else if (!(lock->state.waiters & (1 << SIX_LOCK_write))) {
+ atomic64_add(__SIX_VAL(waiters, 1 << SIX_LOCK_write),
+ &lock->state.counter);
+ /*
+ * pairs with barrier after unlock and before checking
+ * for readers in unlock path
+ */
+ smp_mb__after_atomic();
}
ret = !pcpu_read_count(lock);
@@ -212,9 +220,6 @@ retry:
if (ret || try)
v -= __SIX_VAL(write_locking, 1);
- if (!ret && !try && !(lock->state.waiters & (1 << SIX_LOCK_write)))
- v += __SIX_VAL(waiters, 1 << SIX_LOCK_write);
-
if (try && !ret) {
old.v = atomic64_add_return(v, &lock->state.counter);
six_lock_wakeup(lock, old, SIX_LOCK_read);