diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2022-09-01 22:05:16 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2022-09-18 19:43:22 -0400 |
commit | 382857f510428b00f0bc94070a0689f45be31c6c (patch) | |
tree | 4b30ee605571fc084db01873897c59597ab259ae | |
parent | b8e7c88439c8fbfa34b0f3da7dd10c8b430e8b7d (diff) |
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 <kent.overstreet@linux.dev>
-rw-r--r-- | fs/bcachefs/btree_locking.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/fs/bcachefs/btree_locking.c b/fs/bcachefs/btree_locking.c index 87718c647fbb..2c3d44564d50 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, |