summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2020-06-15 20:27:26 -0400
committerKent Overstreet <kent.overstreet@gmail.com>2020-06-15 20:27:26 -0400
commit70a4b086a2948c539ba143a88f37c3d9b765f677 (patch)
tree07cb2a4c4adf89f012f1d0e2f0d3714b8ed8bc11
parente7ceeac558e80b8c1ea77508894bf9f2a1784cc8 (diff)
fixup! bcachefs: Implement a new gc that only recalcs oldest gen
-rw-r--r--fs/bcachefs/btree_gc.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/fs/bcachefs/btree_gc.c b/fs/bcachefs/btree_gc.c
index e8abc1937b55..7293b8fedd27 100644
--- a/fs/bcachefs/btree_gc.c
+++ b/fs/bcachefs/btree_gc.c
@@ -902,6 +902,7 @@ static int bch2_gc_btree_gens(struct bch_fs *c, enum btree_id id)
struct bkey_ptrs_c ptrs = bch2_bkey_ptrs_c(k);
const struct bch_extent_ptr *ptr;
+ percpu_down_read(&c->mark_lock);
bkey_for_each_ptr(ptrs, ptr) {
struct bch_dev *ca = bch_dev_bkey_exists(c, ptr->dev);
struct bucket *g = PTR_BUCKET(ca, ptr, false);
@@ -914,6 +915,7 @@ static int bch2_gc_btree_gens(struct bch_fs *c, enum btree_id id)
}
}
+ percpu_up_read(&c->mark_lock);
}
bch2_trans_exit(&trans);
@@ -923,17 +925,20 @@ static int bch2_gc_btree_gens(struct bch_fs *c, enum btree_id id)
int bch2_gc_gens(struct bch_fs *c)
{
struct bch_dev *ca;
+ struct bucket_array *buckets;
+ struct bucket *g;
unsigned i;
int ret;
down_read(&c->state_lock);
for_each_member_device(ca, c, i) {
- struct bucket_array *buckets = bucket_array(ca);
- struct bucket *g;
+ down_read(&ca->bucket_lock);
+ buckets = bucket_array(ca);
for_each_bucket(g, buckets)
g->gc_gen = g->mark.gen;
+ up_read(&ca->bucket_lock);
}
for (i = 0; i < BTREE_ID_NR; i++)
@@ -944,11 +949,12 @@ int bch2_gc_gens(struct bch_fs *c)
}
for_each_member_device(ca, c, i) {
- struct bucket_array *buckets = bucket_array(ca);
- struct bucket *g;
+ down_read(&ca->bucket_lock);
+ buckets = bucket_array(ca);
for_each_bucket(g, buckets)
g->oldest_gen = g->gc_gen;
+ up_read(&ca->bucket_lock);
}
err:
up_read(&c->state_lock);