bcachefs: Fix error path in bch2_trans_commit_write_locked()
authorKent Overstreet <kent.overstreet@linux.dev>
Tue, 13 Dec 2022 23:19:30 +0000 (18:19 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:48 +0000 (17:09 -0400)
Previously, we were journalling extra_journal_entries (which is used for
new btree roots, and irreversably mutates system state) before calling
bch2_trans_fs_usage_apply(), which can fail - whoops.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_update_leaf.c

index bdd703289ecb0ba3a870eeb40ea3186e3e470ed8..f986f1774b5125824c6acafa6c466905e881fe8a 100644 (file)
@@ -660,21 +660,13 @@ bch2_trans_commit_write_locked(struct btree_trans *trans,
                trans->journal_res.seq = c->journal.replay_journal_seq;
        }
 
-       if (unlikely(trans->extra_journal_entries.nr)) {
-               memcpy_u64s_small(journal_res_entry(&c->journal, &trans->journal_res),
-                                 trans->extra_journal_entries.data,
-                                 trans->extra_journal_entries.nr);
-
-               trans->journal_res.offset       += trans->extra_journal_entries.nr;
-               trans->journal_res.u64s         -= trans->extra_journal_entries.nr;
-       }
-
        /*
         * Not allowed to fail after we've gotten our journal reservation - we
         * have to use it:
         */
 
-       if (!(trans->flags & BTREE_INSERT_JOURNAL_REPLAY)) {
+       if (IS_ENABLED(CONFIG_BCACHEFS_DEBUG) &&
+           !(trans->flags & BTREE_INSERT_JOURNAL_REPLAY)) {
                if (bch2_journal_seq_verify)
                        trans_for_each_update(trans, i)
                                i->k->k.version.lo = trans->journal_res.seq;
@@ -700,6 +692,15 @@ bch2_trans_commit_write_locked(struct btree_trans *trans,
                        return ret;
        }
 
+       if (unlikely(trans->extra_journal_entries.nr)) {
+               memcpy_u64s_small(journal_res_entry(&c->journal, &trans->journal_res),
+                                 trans->extra_journal_entries.data,
+                                 trans->extra_journal_entries.nr);
+
+               trans->journal_res.offset       += trans->extra_journal_entries.nr;
+               trans->journal_res.u64s         -= trans->extra_journal_entries.nr;
+       }
+
        if (likely(!(trans->flags & BTREE_INSERT_JOURNAL_REPLAY))) {
                trans_for_each_update(trans, i) {
                        struct journal *j = &c->journal;