]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bcachefs: bucket_lock() is now a sleepable lock
authorKent Overstreet <kent.overstreet@linux.dev>
Wed, 27 Sep 2023 23:51:29 +0000 (19:51 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:10:15 +0000 (17:10 -0400)
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 <kent.overstreet@linux.dev>
fs/bcachefs/buckets.c
fs/bcachefs/buckets.h

index e7f4506f69ca4c371ec6ca1ce2c26f5d7d6540b2..46b6406d772b2216e686b6df1a7c772aab0bebdf 100644 (file)
@@ -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 ||
index ecbeb7280f87f3cd2f9d3146412ebe8ebdf68da6..bf8d7f407e9cf372c2a5cf4b636e7bddf906e913 100644 (file)
@@ -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)