From 73bbeaa2de1d429590a1b5ddd706dfeaf6d7d0e1 Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Wed, 27 Sep 2023 19:51:29 -0400 Subject: bcachefs: bucket_lock() is now a sleepable lock fsck_err() may sleep - it takes a mutex and may allocate memory, so bucket_lock() needs to be a sleepable lock. Signed-off-by: Kent Overstreet --- fs/bcachefs/buckets.c | 2 -- fs/bcachefs/buckets.h | 7 +++++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/fs/bcachefs/buckets.c b/fs/bcachefs/buckets.c index e7f4506f69ca..46b6406d772b 100644 --- a/fs/bcachefs/buckets.c +++ b/fs/bcachefs/buckets.c @@ -367,7 +367,6 @@ static inline int update_replicas(struct bch_fs *c, struct bkey_s_c k, struct printbuf buf = PRINTBUF; percpu_down_read(&c->mark_lock); - buf.atomic++; idx = bch2_replicas_entry_idx(c, r); if (idx < 0 && @@ -795,7 +794,6 @@ static int mark_stripe_bucket(struct btree_trans *trans, /* * XXX doesn't handle deletion */ percpu_down_read(&c->mark_lock); - buf.atomic++; g = PTR_GC_BUCKET(ca, ptr); if (g->dirty_sectors || diff --git a/fs/bcachefs/buckets.h b/fs/bcachefs/buckets.h index ecbeb7280f87..bf8d7f407e9c 100644 --- a/fs/bcachefs/buckets.h +++ b/fs/bcachefs/buckets.h @@ -70,12 +70,15 @@ union ulong_byte_assert { static inline void bucket_unlock(struct bucket *b) { BUILD_BUG_ON(!((union ulong_byte_assert) { .ulong = 1UL << BUCKET_LOCK_BITNR }).byte); - bit_spin_unlock(BUCKET_LOCK_BITNR, (void *) &b->lock); + + clear_bit_unlock(BUCKET_LOCK_BITNR, (void *) &b->lock); + wake_up_bit((void *) &b->lock, BUCKET_LOCK_BITNR); } static inline void bucket_lock(struct bucket *b) { - bit_spin_lock(BUCKET_LOCK_BITNR, (void *) &b->lock); + wait_on_bit_lock((void *) &b->lock, BUCKET_LOCK_BITNR, + TASK_UNINTERRUPTIBLE); } static inline struct bucket_array *gc_bucket_array(struct bch_dev *ca) -- cgit v1.2.3