bcachefs: Fix usage of last_seq + encryption
authorKent Overstreet <kent.overstreet@gmail.com>
Sat, 8 May 2021 03:32:26 +0000 (23:32 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:02 +0000 (17:09 -0400)
jset->last_seq is in the region that's encrypted - on journal write
completion, we were using it and getting garbage. This patch shadows it
to fix.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/journal.c
fs/bcachefs/journal_io.c
fs/bcachefs/journal_types.h

index a70540853586ad38fdbcb23a69183eb679b27e02..a7cc0b1670722a3b7e2050f4ac372e9dce93b18b 100644 (file)
@@ -189,7 +189,8 @@ static bool __journal_entry_close(struct journal *j)
         * Hence, we want update/set last_seq on the current journal entry right
         * before we open a new one:
         */
-       buf->data->last_seq     = cpu_to_le64(journal_last_seq(j));
+       buf->last_seq           = journal_last_seq(j);
+       buf->data->last_seq     = cpu_to_le64(buf->last_seq);
 
        __bch2_journal_pin_put(j, le64_to_cpu(buf->data->seq));
 
index 4ab9cebee218f2cf584f737eb918b403df41b7b4..2d3fc33720b8529e9984edba9faabfd558105211 100644 (file)
@@ -1236,7 +1236,7 @@ static void journal_write_done(struct closure *cl)
                bch2_bkey_devs(bkey_i_to_s_c(&w->key));
        struct bch_replicas_padded replicas;
        union journal_res_state old, new;
-       u64 v, seq, last_seq;
+       u64 v, seq;
        int err = 0;
 
        bch2_time_stats_update(j->write_time, j->write_start_time);
@@ -1255,7 +1255,6 @@ static void journal_write_done(struct closure *cl)
 
        spin_lock(&j->lock);
        seq = le64_to_cpu(w->data->seq);
-       last_seq = le64_to_cpu(w->data->last_seq);
 
        if (seq >= j->pin.front)
                journal_seq_pin(j, seq)->devs = devs;
@@ -1266,7 +1265,7 @@ static void journal_write_done(struct closure *cl)
 
        if (!JSET_NO_FLUSH(w->data)) {
                j->flushed_seq_ondisk = seq;
-               j->last_seq_ondisk = last_seq;
+               j->last_seq_ondisk = w->last_seq;
        }
 
        /*
@@ -1400,7 +1399,7 @@ void bch2_journal_write(struct closure *cl)
            test_bit(JOURNAL_MAY_SKIP_FLUSH, &j->flags)) {
                w->noflush = true;
                SET_JSET_NO_FLUSH(jset, true);
-               jset->last_seq = 0;
+               jset->last_seq = w->last_seq = 0;
 
                j->nr_noflush_writes++;
        } else {
index 6e2a2d6b83466e9e9a319089eb9125034518c22e..b4e4d5e0bc93ae8feb9205cb408b3631c97051cd 100644 (file)
@@ -23,6 +23,7 @@ struct journal_buf {
        __BKEY_PADDED(key, BCH_REPLICAS_MAX);
 
        struct closure_waitlist wait;
+       u64                     last_seq;       /* copy of data->last_seq */
 
        unsigned                buf_size;       /* size in bytes of @data */
        unsigned                sectors;        /* maximum size for current entry */