diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2019-02-06 11:56:51 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2019-04-03 12:44:05 -0400 |
commit | 23785a4073c520855c29156938a41014de7d58f1 (patch) | |
tree | 254d64eb9bec8fd16dc505e698329e48db7bc0cb | |
parent | 66e2a723d8bf91e6216d81b07c527029dfdbf3bf (diff) |
bcachefs: don't do initial gc if have alloc info feature
-rw-r--r-- | fs/bcachefs/bcachefs.h | 1 | ||||
-rw-r--r-- | fs/bcachefs/bcachefs_format.h | 4 | ||||
-rw-r--r-- | fs/bcachefs/btree_gc.c | 6 | ||||
-rw-r--r-- | fs/bcachefs/recovery.c | 18 | ||||
-rw-r--r-- | fs/bcachefs/super-io.c | 7 |
5 files changed, 25 insertions, 11 deletions
diff --git a/fs/bcachefs/bcachefs.h b/fs/bcachefs/bcachefs.h index 41668f6ef91a..5e33b3aee3b9 100644 --- a/fs/bcachefs/bcachefs.h +++ b/fs/bcachefs/bcachefs.h @@ -565,6 +565,7 @@ struct bch_fs { u32 time_base_hi; u32 time_precision; u64 features; + u64 compat; } sb; struct bch_sb_handle disk_sb; diff --git a/fs/bcachefs/bcachefs_format.h b/fs/bcachefs/bcachefs_format.h index 4d75cdcecae4..d020cf74e9e9 100644 --- a/fs/bcachefs/bcachefs_format.h +++ b/fs/bcachefs/bcachefs_format.h @@ -1274,6 +1274,10 @@ enum bch_sb_features { BCH_FEATURE_NR, }; +enum bch_sb_compat { + BCH_COMPAT_FEAT_ALLOC_INFO = 0, +}; + /* options: */ #define BCH_REPLICAS_MAX 4U diff --git a/fs/bcachefs/btree_gc.c b/fs/bcachefs/btree_gc.c index c20007da12a1..b1f5e8b1071e 100644 --- a/fs/bcachefs/btree_gc.c +++ b/fs/bcachefs/btree_gc.c @@ -573,7 +573,8 @@ static void bch2_gc_done(struct bch_fs *c, bool initial) percpu_down_write(&c->mark_lock); - if (initial) { + if (initial && + !(c->sb.compat & (1ULL << BCH_COMPAT_FEAT_ALLOC_INFO))) { bch2_gc_done_nocheck(c); goto out; } @@ -815,9 +816,6 @@ out: bch2_gc_free(c); up_write(&c->gc_lock); - if (!ret && initial) - set_bit(BCH_FS_INITIAL_GC_DONE, &c->flags); - trace_gc_end(c); bch2_time_stats_update(&c->times[BCH_TIME_btree_gc], start_time); diff --git a/fs/bcachefs/recovery.c b/fs/bcachefs/recovery.c index 0d68439e636e..7e50547cc51f 100644 --- a/fs/bcachefs/recovery.c +++ b/fs/bcachefs/recovery.c @@ -299,14 +299,18 @@ int bch2_fs_recovery(struct bch_fs *c) set_bit(BCH_FS_ALLOC_READ_DONE, &c->flags); - bch_verbose(c, "starting mark and sweep:"); - err = "error in recovery"; - ret = bch2_gc(c, &journal, true); - if (ret) - goto err; - bch_verbose(c, "mark and sweep done"); + if (!(c->sb.compat & (1ULL << BCH_COMPAT_FEAT_ALLOC_INFO)) || + c->opts.fsck) { + bch_verbose(c, "starting mark and sweep:"); + err = "error in recovery"; + ret = bch2_gc(c, &journal, true); + if (ret) + goto err; + bch_verbose(c, "mark and sweep done"); + } clear_bit(BCH_FS_REBUILD_REPLICAS, &c->flags); + set_bit(BCH_FS_INITIAL_GC_DONE, &c->flags); /* * Skip past versions that might have possibly been used (as nonces), @@ -410,6 +414,8 @@ int bch2_fs_initialize(struct bch_fs *c) if (ret) goto err; + set_bit(BCH_FS_INITIAL_GC_DONE, &c->flags); + err = "unable to allocate journal buckets"; for_each_online_member(ca, c, i) if (bch2_dev_journal_alloc(ca)) { diff --git a/fs/bcachefs/super-io.c b/fs/bcachefs/super-io.c index f0a3aaf55303..b88750ff1bb7 100644 --- a/fs/bcachefs/super-io.c +++ b/fs/bcachefs/super-io.c @@ -363,6 +363,7 @@ static void bch2_sb_update(struct bch_fs *c) c->sb.time_base_hi = le32_to_cpu(src->time_base_hi); c->sb.time_precision = le32_to_cpu(src->time_precision); c->sb.features = le64_to_cpu(src->features[0]); + c->sb.compat = le64_to_cpu(src->compat[0]); for_each_member_device(ca, c, i) ca->mi = bch2_mi_to_cpu(mi->members + i); @@ -885,8 +886,10 @@ void bch2_sb_clean_renumber(struct bch_sb_field_clean *clean, int write) static void bch2_fs_mark_dirty(struct bch_fs *c) { mutex_lock(&c->sb_lock); - if (BCH_SB_CLEAN(c->disk_sb.sb)) { + if (BCH_SB_CLEAN(c->disk_sb.sb) || + (c->disk_sb.sb->compat[0] & (1ULL << BCH_COMPAT_FEAT_ALLOC_INFO))) { SET_BCH_SB_CLEAN(c->disk_sb.sb, false); + c->disk_sb.sb->compat[0] &= ~(1ULL << BCH_COMPAT_FEAT_ALLOC_INFO); bch2_write_super(c); } mutex_unlock(&c->sb_lock); @@ -1003,6 +1006,8 @@ void bch2_fs_mark_clean(struct bch_fs *c, bool clean) SET_BCH_SB_CLEAN(c->disk_sb.sb, true); + c->disk_sb.sb->compat[0] |= 1ULL << BCH_COMPAT_FEAT_ALLOC_INFO; + u64s = sizeof(*sb_clean) / sizeof(u64) + c->journal.entry_u64s_reserved; sb_clean = bch2_sb_resize_clean(&c->disk_sb, u64s); |