]> www.infradead.org Git - nvme.git/commitdiff
bcachefs: Reduce the scope of gc_lock
authorKent Overstreet <kent.overstreet@linux.dev>
Thu, 13 Jun 2024 21:07:36 +0000 (17:07 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 14 Jul 2024 23:00:15 +0000 (19:00 -0400)
gc_lock is now only for synchronization between check_alloc_info and
interior btree updates - nothing else

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/alloc_background.c
fs/bcachefs/bcachefs.h
fs/bcachefs/btree_gc.c
fs/bcachefs/buckets.c
fs/bcachefs/buckets.h
fs/bcachefs/recovery_passes.c

index 23e4aa9baa3a97d59f2b5c1c34b13f517a53cdda..54e066ee8dcac78a6bcfe7321d2a4aecf8d4cb0b 100644 (file)
@@ -596,8 +596,6 @@ int bch2_alloc_read(struct bch_fs *c)
        struct bch_dev *ca = NULL;
        int ret;
 
-       down_read(&c->gc_lock);
-
        if (c->sb.version_upgrade_complete >= bcachefs_metadata_version_bucket_gens) {
                ret = for_each_btree_key(trans, iter, BTREE_ID_bucket_gens, POS_MIN,
                                         BTREE_ITER_prefetch, k, ({
@@ -646,7 +644,6 @@ int bch2_alloc_read(struct bch_fs *c)
 
        bch2_dev_put(ca);
        bch2_trans_put(trans);
-       up_read(&c->gc_lock);
 
        bch_err_fn(c, ret);
        return ret;
index ea4bf11fb8dd3100ffec21d3c7cd8e429b3aaacb..91361a167dcd6329ed10ac7c791311d7412f21db 100644 (file)
@@ -538,8 +538,8 @@ struct bch_dev {
        /*
         * Buckets:
         * Per-bucket arrays are protected by c->mark_lock, bucket_lock and
-        * gc_lock, for device resize - holding any is sufficient for access:
-        * Or rcu_read_lock(), but only for dev_ptr_stale():
+        * gc_gens_lock, for device resize - holding any is sufficient for
+        * access: Or rcu_read_lock(), but only for dev_ptr_stale():
         */
        struct bucket_array __rcu *buckets_gc;
        struct bucket_gens __rcu *bucket_gens;
index b712620a1703ec6128a78b5467674bfc35af2694..6cbf2aa6a9479b346f2f64bd650b41f6111fec08 100644 (file)
@@ -1240,7 +1240,7 @@ int bch2_gc_gens(struct bch_fs *c)
        int ret;
 
        /*
-        * Ideally we would be using state_lock and not gc_lock here, but that
+        * Ideally we would be using state_lock and not gc_gens_lock here, but that
         * introduces a deadlock in the RO path - we currently take the state
         * lock at the start of going RO, thus the gc thread may get stuck:
         */
@@ -1248,7 +1248,8 @@ int bch2_gc_gens(struct bch_fs *c)
                return 0;
 
        trace_and_count(c, gc_gens_start, c);
-       down_read(&c->gc_lock);
+
+       down_read(&c->state_lock);
 
        for_each_member_device(c, ca) {
                struct bucket_gens *gens = bucket_gens(ca);
@@ -1317,7 +1318,7 @@ err:
                ca->oldest_gen = NULL;
        }
 
-       up_read(&c->gc_lock);
+       up_read(&c->state_lock);
        mutex_unlock(&c->gc_gens_lock);
        if (!bch2_err_matches(ret, EROFS))
                bch_err_fn(c, ret);
index 42fd77fe1fe8bf2618a7428693f44bdf1861e61c..95e27995875af4c5401505902a73ceba9ced1ba7 100644 (file)
@@ -1217,7 +1217,6 @@ int bch2_dev_buckets_resize(struct bch_fs *c, struct bch_dev *ca, u64 nbuckets)
                bucket_gens->nbuckets - bucket_gens->first_bucket;
 
        if (resize) {
-               down_write(&c->gc_lock);
                down_write(&ca->bucket_lock);
                percpu_down_write(&c->mark_lock);
        }
@@ -1240,7 +1239,6 @@ int bch2_dev_buckets_resize(struct bch_fs *c, struct bch_dev *ca, u64 nbuckets)
        if (resize) {
                percpu_up_write(&c->mark_lock);
                up_write(&ca->bucket_lock);
-               up_write(&c->gc_lock);
        }
 
        ret = 0;
index fc6359f84e82ca00f06204eb30a10d62c8b5e98e..2d35eeb24a2d693e5117b2ebd11d0cf07a338490 100644 (file)
@@ -85,7 +85,7 @@ static inline struct bucket_array *gc_bucket_array(struct bch_dev *ca)
        return rcu_dereference_check(ca->buckets_gc,
                                     !ca->fs ||
                                     percpu_rwsem_is_held(&ca->fs->mark_lock) ||
-                                    lockdep_is_held(&ca->fs->gc_lock) ||
+                                    lockdep_is_held(&ca->fs->state_lock) ||
                                     lockdep_is_held(&ca->bucket_lock));
 }
 
@@ -103,7 +103,7 @@ static inline struct bucket_gens *bucket_gens(struct bch_dev *ca)
        return rcu_dereference_check(ca->bucket_gens,
                                     !ca->fs ||
                                     percpu_rwsem_is_held(&ca->fs->mark_lock) ||
-                                    lockdep_is_held(&ca->fs->gc_lock) ||
+                                    lockdep_is_held(&ca->fs->state_lock) ||
                                     lockdep_is_held(&ca->bucket_lock));
 }
 
index 4a59f52f8d56de73f3280cf58d8fdddd9069aaa6..73339a0a31111f032518a0ada76f6e5c1c6c0942 100644 (file)
@@ -193,6 +193,8 @@ int bch2_run_online_recovery_passes(struct bch_fs *c)
 {
        int ret = 0;
 
+       down_read(&c->state_lock);
+
        for (unsigned i = 0; i < ARRAY_SIZE(recovery_pass_fns); i++) {
                struct recovery_pass_fn *p = recovery_pass_fns + i;
 
@@ -208,6 +210,8 @@ int bch2_run_online_recovery_passes(struct bch_fs *c)
                        break;
        }
 
+       up_read(&c->state_lock);
+
        return ret;
 }