From: Kent Overstreet Date: Fri, 2 Sep 2022 02:05:16 +0000 (-0400) Subject: bcachefs: Fix six_lock_readers_add() X-Git-Tag: v6.7-rc1~201^2~798 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6b81f194f345d15dd15601ee7b604a0640445895;p=thirdparty%2Fkernel%2Flinux.git bcachefs: Fix six_lock_readers_add() Have to be careful with bit fields - when subtracting, this was overflowing into the write_locking bit. Signed-off-by: Kent Overstreet --- diff --git a/fs/bcachefs/btree_locking.c b/fs/bcachefs/btree_locking.c index 24d0ea9033802..158cb7ac64f28 100644 --- a/fs/bcachefs/btree_locking.c +++ b/fs/bcachefs/btree_locking.c @@ -10,10 +10,12 @@ struct lock_class_key bch2_btree_node_lock_key; static inline void six_lock_readers_add(struct six_lock *lock, int nr) { - if (!lock->readers) + if (lock->readers) + this_cpu_add(*lock->readers, nr); + else if (nr > 0) atomic64_add(__SIX_VAL(read_lock, nr), &lock->state.counter); else - this_cpu_add(*lock->readers, nr); + atomic64_sub(__SIX_VAL(read_lock, -nr), &lock->state.counter); } struct six_lock_count bch2_btree_node_lock_counts(struct btree_trans *trans,