bcachefs: Fix six_lock_readers_add()
authorKent Overstreet <kent.overstreet@linux.dev>
Fri, 2 Sep 2022 02:05:16 +0000 (22:05 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:40 +0000 (17:09 -0400)
Have to be careful with bit fields - when subtracting, this was
overflowing into the write_locking bit.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_locking.c

index 24d0ea903380249bec97193bb2a69573c226c811..158cb7ac64f2849cba72a9a74f89aa1f510d2b65 100644 (file)
@@ -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,