bcachefs: Simplify resuming of journal position
authorKent Overstreet <kent.overstreet@linux.dev>
Fri, 26 Apr 2024 04:31:14 +0000 (00:31 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Wed, 8 May 2024 21:29:21 +0000 (17:29 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/journal_io.c
fs/bcachefs/journal_types.h

index f3c5e9a423fd17130a9d0977ee106af735d9459d..dec50e7a8cb41b3ad7060c3a307195f4681c57c8 100644 (file)
@@ -1089,6 +1089,13 @@ reread:
                        goto err;
                }
 
+               if (le64_to_cpu(j->seq) > ja->highest_seq_found) {
+                       ja->highest_seq_found = le64_to_cpu(j->seq);
+                       ja->cur_idx = bucket;
+                       ja->sectors_free = ca->mi.bucket_size -
+                               bucket_remainder(ca, offset) - sectors;
+               }
+
                /*
                 * This happens sometimes if we don't have discards on -
                 * when we've partially overwritten a bucket with new
@@ -1157,8 +1164,6 @@ static CLOSURE_CALLBACK(bch2_journal_read_device)
        struct bch_fs *c = ca->fs;
        struct journal_list *jlist =
                container_of(cl->parent, struct journal_list, cl);
-       struct journal_replay *r, **_r;
-       struct genradix_iter iter;
        struct journal_read_buf buf = { NULL, 0 };
        unsigned i;
        int ret = 0;
@@ -1178,47 +1183,6 @@ static CLOSURE_CALLBACK(bch2_journal_read_device)
                        goto err;
        }
 
-       ja->sectors_free = ca->mi.bucket_size;
-
-       mutex_lock(&jlist->lock);
-       genradix_for_each_reverse(&c->journal_entries, iter, _r) {
-               r = *_r;
-
-               if (!r)
-                       continue;
-
-               darray_for_each(r->ptrs, i)
-                       if (i->dev == ca->dev_idx) {
-                               unsigned wrote = bucket_remainder(ca, i->sector) +
-                                       vstruct_sectors(&r->j, c->block_bits);
-
-                               ja->cur_idx = i->bucket;
-                               ja->sectors_free = ca->mi.bucket_size - wrote;
-                               goto found;
-                       }
-       }
-found:
-       mutex_unlock(&jlist->lock);
-
-       if (ja->bucket_seq[ja->cur_idx] &&
-           ja->sectors_free == ca->mi.bucket_size) {
-#if 0
-               /*
-                * Debug code for ZNS support, where we (probably) want to be
-                * correlated where we stopped in the journal to the zone write
-                * points:
-                */
-               bch_err(c, "ja->sectors_free == ca->mi.bucket_size");
-               bch_err(c, "cur_idx %u/%u", ja->cur_idx, ja->nr);
-               for (i = 0; i < 3; i++) {
-                       unsigned idx = (ja->cur_idx + ja->nr - 1 + i) % ja->nr;
-
-                       bch_err(c, "bucket_seq[%u] = %llu", idx, ja->bucket_seq[idx]);
-               }
-#endif
-               ja->sectors_free = 0;
-       }
-
        /*
         * Set dirty_idx to indicate the entire journal is full and needs to be
         * reclaimed - journal reclaim will immediately reclaim whatever isn't
index 3d2135e1d7a1cf020e95ae48cd8e6683f2e97245..45c1c48f49179a779e3eb27e7ac82c561dd4cfd9 100644 (file)
@@ -327,6 +327,7 @@ struct journal_device {
 
        /* for bch_journal_read_device */
        struct closure          read;
+       u64                     highest_seq_found;
 };
 
 /*