]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/recovery.c
Update bcachefs sources to 7958ebe324 bcachefs: Fix alloc_v4_backpointers()
[bcachefs-tools-debian] / libbcachefs / recovery.c
index 0ad2bb2aa039bdec4426b1d98b92672159bb08b7..8c1aa6d2ce45f02f8cea4c782a45be8aa2237b6e 100644 (file)
@@ -588,7 +588,7 @@ static int journal_sort_seq_cmp(const void *_l, const void *_r)
        return cmp_int(l->journal_seq, r->journal_seq);
 }
 
-static int bch2_journal_replay(struct bch_fs *c)
+static int bch2_journal_replay(struct bch_fs *c, u64 start_seq, u64 end_seq)
 {
        struct journal_keys *keys = &c->journal_keys;
        struct journal_key **keys_sorted, *k;
@@ -610,6 +610,13 @@ static int bch2_journal_replay(struct bch_fs *c)
             sizeof(keys_sorted[0]),
             journal_sort_seq_cmp, NULL);
 
+       if (keys->nr) {
+               ret = bch2_fs_log_msg(c, "Starting journal replay (%zu keys in entries %llu-%llu)",
+                                     keys->nr, start_seq, end_seq);
+               if (ret)
+                       goto err;
+       }
+
        for (i = 0; i < keys->nr; i++) {
                k = keys_sorted[i];
 
@@ -639,7 +646,7 @@ static int bch2_journal_replay(struct bch_fs *c)
        ret = bch2_journal_error(j);
 
        if (keys->nr && !ret)
-               bch2_journal_log_msg(&c->journal, "journal replay finished");
+               bch2_fs_log_msg(c, "journal replay finished");
 err:
        kvfree(keys_sorted);
        return ret;
@@ -1045,7 +1052,7 @@ int bch2_fs_recovery(struct bch_fs *c)
        const char *err = "cannot allocate memory";
        struct bch_sb_field_clean *clean = NULL;
        struct jset *last_journal_entry = NULL;
-       u64 blacklist_seq, journal_seq;
+       u64 last_seq, blacklist_seq, journal_seq;
        bool write_sb = false;
        int ret = 0;
 
@@ -1115,7 +1122,7 @@ int bch2_fs_recovery(struct bch_fs *c)
                struct journal_replay **i;
 
                bch_verbose(c, "starting journal read");
-               ret = bch2_journal_read(c, &blacklist_seq, &journal_seq);
+               ret = bch2_journal_read(c, &last_seq, &blacklist_seq, &journal_seq);
                if (ret)
                        goto err;
 
@@ -1143,7 +1150,15 @@ int bch2_fs_recovery(struct bch_fs *c)
 
                if (!last_journal_entry) {
                        fsck_err_on(!c->sb.clean, c, "no journal entries found");
-                       goto use_clean;
+                       if (clean)
+                               goto use_clean;
+
+                       genradix_for_each_reverse(&c->journal_entries, iter, i)
+                               if (*i) {
+                                       last_journal_entry = &(*i)->j;
+                                       (*i)->ignore = false;
+                                       break;
+                               }
                }
 
                ret = journal_keys_sort(c);
@@ -1189,7 +1204,9 @@ use_clean:
                journal_seq += 8;
 
        if (blacklist_seq != journal_seq) {
-               ret = bch2_journal_seq_blacklist_add(c,
+               ret =   bch2_fs_log_msg(c, "blacklisting entries %llu-%llu",
+                                       blacklist_seq, journal_seq) ?:
+                       bch2_journal_seq_blacklist_add(c,
                                        blacklist_seq, journal_seq);
                if (ret) {
                        bch_err(c, "error creating new journal seq blacklist entry");
@@ -1197,7 +1214,9 @@ use_clean:
                }
        }
 
-       ret = bch2_fs_journal_start(&c->journal, journal_seq);
+       ret =   bch2_fs_log_msg(c, "starting journal at entry %llu, replaying %llu-%llu",
+                               journal_seq, last_seq, blacklist_seq - 1) ?:
+               bch2_fs_journal_start(&c->journal, journal_seq);
        if (ret)
                goto err;
 
@@ -1264,7 +1283,7 @@ use_clean:
 
                bch_info(c, "starting journal replay, %zu keys", c->journal_keys.nr);
                err = "journal replay failed";
-               ret = bch2_journal_replay(c);
+               ret = bch2_journal_replay(c, last_seq, blacklist_seq - 1);
                if (ret)
                        goto err;
                if (c->opts.verbose || !c->sb.clean)
@@ -1345,7 +1364,7 @@ use_clean:
 
                bch_verbose(c, "starting journal replay, %zu keys", c->journal_keys.nr);
                err = "journal replay failed";
-               ret = bch2_journal_replay(c);
+               ret = bch2_journal_replay(c, last_seq, blacklist_seq - 1);
                if (ret)
                        goto err;
                if (c->opts.verbose || !c->sb.clean)