]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bcachefs: Delete some obsolete journal_seq_blacklist code
authorKent Overstreet <kent.overstreet@gmail.com>
Sun, 26 Dec 2021 21:59:36 +0000 (16:59 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:20 +0000 (17:09 -0400)
Since metadata version bcachefs_metadata_version_btree_ptr_sectors_written,
we haven't needed the journal seq blacklist mechanism for ignoring
blacklisted btree node writes - we now only need it for ignoring journal
entries that were written after the newest flush journal entry, and then
we only need to keep those blacklist entries around until journal replay
is finished.

That means we can delete the code for scanning btree nodes to GC
journal_seq_blacklist entries.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
fs/bcachefs/bcachefs.h
fs/bcachefs/journal_seq_blacklist.c
fs/bcachefs/journal_seq_blacklist.h
fs/bcachefs/recovery.c
fs/bcachefs/super.c

index 5f18531dc34cd816b3f8805368d94aa1e41db2a5..f41d9b3ac4831057428a19e79be0ef29532cc9ad 100644 (file)
@@ -750,7 +750,6 @@ struct bch_fs {
        /* JOURNAL SEQ BLACKLIST */
        struct journal_seq_blacklist_table *
                                journal_seq_blacklist_table;
-       struct work_struct      journal_seq_blacklist_gc_work;
 
        /* ALLOCATOR */
        spinlock_t              freelist_lock;
index 79bc0e49389b021343a6f38ee64869d58ca7f72a..10bd23e969d24228ab77401fb5892fd8f1373bba 100644 (file)
@@ -235,81 +235,3 @@ const struct bch_sb_field_ops bch_sb_field_ops_journal_seq_blacklist = {
        .validate       = bch2_sb_journal_seq_blacklist_validate,
        .to_text        = bch2_sb_journal_seq_blacklist_to_text
 };
-
-void bch2_blacklist_entries_gc(struct work_struct *work)
-{
-       struct bch_fs *c = container_of(work, struct bch_fs,
-                                       journal_seq_blacklist_gc_work);
-       struct journal_seq_blacklist_table *t;
-       struct bch_sb_field_journal_seq_blacklist *bl;
-       struct journal_seq_blacklist_entry *src, *dst;
-       struct btree_trans trans;
-       unsigned i, nr, new_nr;
-       int ret;
-
-       bch2_trans_init(&trans, c, 0, 0);
-
-       for (i = 0; i < BTREE_ID_NR; i++) {
-               struct btree_iter iter;
-               struct btree *b;
-
-               bch2_trans_node_iter_init(&trans, &iter, i, POS_MIN,
-                                         0, 0, BTREE_ITER_PREFETCH);
-retry:
-               bch2_trans_begin(&trans);
-
-               b = bch2_btree_iter_peek_node(&iter);
-
-               while (!(ret = PTR_ERR_OR_ZERO(b)) &&
-                      b &&
-                      !test_bit(BCH_FS_STOPPING, &c->flags))
-                       b = bch2_btree_iter_next_node(&iter);
-
-               if (ret == -EINTR)
-                       goto retry;
-
-               bch2_trans_iter_exit(&trans, &iter);
-       }
-
-       bch2_trans_exit(&trans);
-       if (ret)
-               return;
-
-       mutex_lock(&c->sb_lock);
-       bl = bch2_sb_get_journal_seq_blacklist(c->disk_sb.sb);
-       if (!bl)
-               goto out;
-
-       nr = blacklist_nr_entries(bl);
-       dst = bl->start;
-
-       t = c->journal_seq_blacklist_table;
-       BUG_ON(nr != t->nr);
-
-       for (src = bl->start, i = eytzinger0_first(t->nr);
-            src < bl->start + nr;
-            src++, i = eytzinger0_next(i, nr)) {
-               BUG_ON(t->entries[i].start      != le64_to_cpu(src->start));
-               BUG_ON(t->entries[i].end        != le64_to_cpu(src->end));
-
-               if (t->entries[i].dirty)
-                       *dst++ = *src;
-       }
-
-       new_nr = dst - bl->start;
-
-       bch_info(c, "nr blacklist entries was %u, now %u", nr, new_nr);
-
-       if (new_nr != nr) {
-               bl = bch2_sb_resize_journal_seq_blacklist(&c->disk_sb,
-                               new_nr ? sb_blacklist_u64s(new_nr) : 0);
-               BUG_ON(new_nr && !bl);
-
-               if (!new_nr)
-                       c->disk_sb.sb->features[0] &= cpu_to_le64(~(1ULL << BCH_FEATURE_journal_seq_blacklist_v3));
-
-               bch2_write_super(c);
-       }
-out:
-       mutex_unlock(&c->sb_lock);
-}
index afb886ec8e254b240f13c7a81313b26dd7da08a3..b4f876a04586413019c33639f8eed47204d48d3c 100644 (file)
@@ -17,6 +17,4 @@ int bch2_blacklist_table_initialize(struct bch_fs *);
 
 extern const struct bch_sb_field_ops bch_sb_field_ops_journal_seq_blacklist;
 
-void bch2_blacklist_entries_gc(struct work_struct *);
-
 #endif /* _BCACHEFS_JOURNAL_SEQ_BLACKLIST_H */
index 118d536b43769b3e85cf7f1f67a59189cb1d537f..ffa8ab933a113a617a6fe16ea7bf95f7742b4b3e 100644 (file)
@@ -1162,16 +1162,6 @@ use_clean:
        if (ret)
                goto err;
 
-       /*
-        * After an unclean shutdown, skip then next few journal sequence
-        * numbers as they may have been referenced by btree writes that
-        * happened before their corresponding journal writes - those btree
-        * writes need to be ignored, by skipping and blacklisting the next few
-        * journal sequence numbers:
-        */
-       if (!c->sb.clean)
-               journal_seq += 8;
-
        if (blacklist_seq != journal_seq) {
                ret = bch2_journal_seq_blacklist_add(c,
                                        blacklist_seq, journal_seq);
@@ -1309,7 +1299,8 @@ use_clean:
        }
 
        if (!(c->sb.compat & (1ULL << BCH_COMPAT_extents_above_btree_updates_done)) ||
-           !(c->sb.compat & (1ULL << BCH_COMPAT_bformat_overflow_done))) {
+           !(c->sb.compat & (1ULL << BCH_COMPAT_bformat_overflow_done)) ||
+           le16_to_cpu(c->sb.version_min) < bcachefs_metadata_version_btree_ptr_sectors_written) {
                struct bch_move_stats stats;
 
                bch_move_stats_init(&stats, "recovery");
@@ -1326,6 +1317,15 @@ use_clean:
        }
 
        mutex_lock(&c->sb_lock);
+       /*
+        * With journal replay done, we can clear the journal seq blacklist
+        * table:
+        */
+       BUG_ON(!test_bit(JOURNAL_REPLAY_DONE, &c->journal.flags));
+       BUG_ON(le16_to_cpu(c->sb.version_min) < bcachefs_metadata_version_btree_ptr_sectors_written);
+
+       bch2_sb_resize_journal_seq_blacklist(&c->disk_sb, 0);
+
        if (c->opts.version_upgrade) {
                c->disk_sb.sb->version = cpu_to_le16(bcachefs_metadata_version_current);
                c->disk_sb.sb->features[0] |= cpu_to_le64(BCH_SB_FEATURES_ALL);
@@ -1349,10 +1349,6 @@ use_clean:
                bch2_write_super(c);
        mutex_unlock(&c->sb_lock);
 
-       if (c->journal_seq_blacklist_table &&
-           c->journal_seq_blacklist_table->nr > 128)
-               queue_work(system_long_wq, &c->journal_seq_blacklist_gc_work);
-
        ret = 0;
 out:
        set_bit(BCH_FS_FSCK_DONE, &c->flags);
index 75410b5dba140d82f81a834df8558733e0ea44f0..ec55ab865b8ff691a66a6029fc76443320ad773c 100644 (file)
@@ -535,8 +535,6 @@ void __bch2_fs_stop(struct bch_fs *c)
 
        set_bit(BCH_FS_STOPPING, &c->flags);
 
-       cancel_work_sync(&c->journal_seq_blacklist_gc_work);
-
        down_write(&c->state_lock);
        bch2_fs_read_only(c);
        up_write(&c->state_lock);
@@ -700,9 +698,6 @@ static struct bch_fs *bch2_fs_alloc(struct bch_sb *sb, struct bch_opts opts)
 
        spin_lock_init(&c->btree_write_error_lock);
 
-       INIT_WORK(&c->journal_seq_blacklist_gc_work,
-                 bch2_blacklist_entries_gc);
-
        INIT_LIST_HEAD(&c->journal_entries);
        INIT_LIST_HEAD(&c->journal_iters);