Skip to content

Commit b0d3ab5

Browse files
author
Kent Overstreet
committed
bcachefs: Reduce the scope of gc_lock
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>
1 parent 132e1a2 commit b0d3ab5

6 files changed

Lines changed: 12 additions & 12 deletions

File tree

fs/bcachefs/alloc_background.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -596,8 +596,6 @@ int bch2_alloc_read(struct bch_fs *c)
596596
struct bch_dev *ca = NULL;
597597
int ret;
598598

599-
down_read(&c->gc_lock);
600-
601599
if (c->sb.version_upgrade_complete >= bcachefs_metadata_version_bucket_gens) {
602600
ret = for_each_btree_key(trans, iter, BTREE_ID_bucket_gens, POS_MIN,
603601
BTREE_ITER_prefetch, k, ({
@@ -646,7 +644,6 @@ int bch2_alloc_read(struct bch_fs *c)
646644

647645
bch2_dev_put(ca);
648646
bch2_trans_put(trans);
649-
up_read(&c->gc_lock);
650647

651648
bch_err_fn(c, ret);
652649
return ret;

fs/bcachefs/bcachefs.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -538,8 +538,8 @@ struct bch_dev {
538538
/*
539539
* Buckets:
540540
* Per-bucket arrays are protected by c->mark_lock, bucket_lock and
541-
* gc_lock, for device resize - holding any is sufficient for access:
542-
* Or rcu_read_lock(), but only for dev_ptr_stale():
541+
* gc_gens_lock, for device resize - holding any is sufficient for
542+
* access: Or rcu_read_lock(), but only for dev_ptr_stale():
543543
*/
544544
struct bucket_array __rcu *buckets_gc;
545545
struct bucket_gens __rcu *bucket_gens;

fs/bcachefs/btree_gc.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1240,15 +1240,16 @@ int bch2_gc_gens(struct bch_fs *c)
12401240
int ret;
12411241

12421242
/*
1243-
* Ideally we would be using state_lock and not gc_lock here, but that
1243+
* Ideally we would be using state_lock and not gc_gens_lock here, but that
12441244
* introduces a deadlock in the RO path - we currently take the state
12451245
* lock at the start of going RO, thus the gc thread may get stuck:
12461246
*/
12471247
if (!mutex_trylock(&c->gc_gens_lock))
12481248
return 0;
12491249

12501250
trace_and_count(c, gc_gens_start, c);
1251-
down_read(&c->gc_lock);
1251+
1252+
down_read(&c->state_lock);
12521253

12531254
for_each_member_device(c, ca) {
12541255
struct bucket_gens *gens = bucket_gens(ca);
@@ -1317,7 +1318,7 @@ int bch2_gc_gens(struct bch_fs *c)
13171318
ca->oldest_gen = NULL;
13181319
}
13191320

1320-
up_read(&c->gc_lock);
1321+
up_read(&c->state_lock);
13211322
mutex_unlock(&c->gc_gens_lock);
13221323
if (!bch2_err_matches(ret, EROFS))
13231324
bch_err_fn(c, ret);

fs/bcachefs/buckets.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1217,7 +1217,6 @@ int bch2_dev_buckets_resize(struct bch_fs *c, struct bch_dev *ca, u64 nbuckets)
12171217
bucket_gens->nbuckets - bucket_gens->first_bucket;
12181218

12191219
if (resize) {
1220-
down_write(&c->gc_lock);
12211220
down_write(&ca->bucket_lock);
12221221
percpu_down_write(&c->mark_lock);
12231222
}
@@ -1240,7 +1239,6 @@ int bch2_dev_buckets_resize(struct bch_fs *c, struct bch_dev *ca, u64 nbuckets)
12401239
if (resize) {
12411240
percpu_up_write(&c->mark_lock);
12421241
up_write(&ca->bucket_lock);
1243-
up_write(&c->gc_lock);
12441242
}
12451243

12461244
ret = 0;

fs/bcachefs/buckets.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ static inline struct bucket_array *gc_bucket_array(struct bch_dev *ca)
8585
return rcu_dereference_check(ca->buckets_gc,
8686
!ca->fs ||
8787
percpu_rwsem_is_held(&ca->fs->mark_lock) ||
88-
lockdep_is_held(&ca->fs->gc_lock) ||
88+
lockdep_is_held(&ca->fs->state_lock) ||
8989
lockdep_is_held(&ca->bucket_lock));
9090
}
9191

@@ -103,7 +103,7 @@ static inline struct bucket_gens *bucket_gens(struct bch_dev *ca)
103103
return rcu_dereference_check(ca->bucket_gens,
104104
!ca->fs ||
105105
percpu_rwsem_is_held(&ca->fs->mark_lock) ||
106-
lockdep_is_held(&ca->fs->gc_lock) ||
106+
lockdep_is_held(&ca->fs->state_lock) ||
107107
lockdep_is_held(&ca->bucket_lock));
108108
}
109109

fs/bcachefs/recovery_passes.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,8 @@ int bch2_run_online_recovery_passes(struct bch_fs *c)
193193
{
194194
int ret = 0;
195195

196+
down_read(&c->state_lock);
197+
196198
for (unsigned i = 0; i < ARRAY_SIZE(recovery_pass_fns); i++) {
197199
struct recovery_pass_fn *p = recovery_pass_fns + i;
198200

@@ -208,6 +210,8 @@ int bch2_run_online_recovery_passes(struct bch_fs *c)
208210
break;
209211
}
210212

213+
up_read(&c->state_lock);
214+
211215
return ret;
212216
}
213217

0 commit comments

Comments
 (0)