Commit 2cce3752 authored by Kent Overstreet's avatar Kent Overstreet
Browse files

bcachefs: split out ignore_blacklisted, ignore_not_dirty



prep work for replaying the journal backwards

Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent 69426613
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -512,7 +512,7 @@ int bch2_journal_keys_sort(struct bch_fs *c)
	genradix_for_each(&c->journal_entries, iter, _i) {
		i = *_i;

		if (!i || i->ignore)
		if (journal_replay_ignore(i))
			continue;

		cond_resched();
+2 −2
Original line number Diff line number Diff line
@@ -1204,7 +1204,7 @@ int bch2_fs_journal_start(struct journal *j, u64 cur_seq)
	genradix_for_each_reverse(&c->journal_entries, iter, _i) {
		i = *_i;

		if (!i || i->ignore)
		if (journal_replay_ignore(i))
			continue;

		last_seq = le64_to_cpu(i->j.last_seq);
@@ -1237,7 +1237,7 @@ int bch2_fs_journal_start(struct journal *j, u64 cur_seq)
	genradix_for_each(&c->journal_entries, iter, _i) {
		i = *_i;

		if (!i || i->ignore)
		if (journal_replay_ignore(i))
			continue;

		seq = le64_to_cpu(i->j.seq);
+19 −14
Original line number Diff line number Diff line
@@ -86,9 +86,12 @@ static void __journal_replay_free(struct bch_fs *c,
	kvfree(i);
}

static void journal_replay_free(struct bch_fs *c, struct journal_replay *i)
static void journal_replay_free(struct bch_fs *c, struct journal_replay *i, bool blacklisted)
{
	i->ignore = true;
	if (blacklisted)
		i->ignore_blacklisted = true;
	else
		i->ignore_not_dirty = true;

	if (!c->opts.read_entire_journal)
		__journal_replay_free(c, i);
@@ -138,12 +141,13 @@ static int journal_entry_add(struct bch_fs *c, struct bch_dev *ca,
				       journal_entry_radix_idx(c, jlist->last_seq)) {
			i = *_i;

			if (!i || i->ignore)
			if (journal_replay_ignore(i))
				continue;

			if (le64_to_cpu(i->j.seq) >= last_seq)
				break;
			journal_replay_free(c, i);

			journal_replay_free(c, i, false);
		}
	}

@@ -200,7 +204,8 @@ static int journal_entry_add(struct bch_fs *c, struct bch_dev *ca,

	darray_init(&i->ptrs);
	i->csum_good		= entry_ptr.csum_good;
	i->ignore	= false;
	i->ignore_blacklisted	= false;
	i->ignore_not_dirty	= false;
	unsafe_memcpy(&i->j, j, bytes, "embedded variable length struct");

	if (dup) {
@@ -1255,20 +1260,20 @@ int bch2_journal_read(struct bch_fs *c,

		i = *_i;

		if (!i || i->ignore)
		if (journal_replay_ignore(i))
			continue;

		if (!*start_seq)
			*blacklist_seq = *start_seq = le64_to_cpu(i->j.seq) + 1;

		if (JSET_NO_FLUSH(&i->j)) {
			i->ignore = true;
			i->ignore_blacklisted = true;
			continue;
		}

		if (!last_write_torn && !i->csum_good) {
			last_write_torn = true;
			i->ignore = true;
			i->ignore_blacklisted = true;
			continue;
		}

@@ -1307,12 +1312,12 @@ int bch2_journal_read(struct bch_fs *c,
	genradix_for_each(&c->journal_entries, radix_iter, _i) {
		i = *_i;

		if (!i || i->ignore)
		if (journal_replay_ignore(i))
			continue;

		seq = le64_to_cpu(i->j.seq);
		if (seq < *last_seq) {
			journal_replay_free(c, i);
			journal_replay_free(c, i, false);
			continue;
		}

@@ -1320,7 +1325,7 @@ int bch2_journal_read(struct bch_fs *c,
			fsck_err_on(!JSET_NO_FLUSH(&i->j), c,
				    jset_seq_blacklisted,
				    "found blacklisted journal entry %llu", seq);
			i->ignore = true;
			i->ignore_blacklisted = true;
		}
	}

@@ -1329,7 +1334,7 @@ int bch2_journal_read(struct bch_fs *c,
	genradix_for_each(&c->journal_entries, radix_iter, _i) {
		i = *_i;

		if (!i || i->ignore)
		if (journal_replay_ignore(i))
			continue;

		BUG_ON(seq > le64_to_cpu(i->j.seq));
@@ -1382,7 +1387,7 @@ int bch2_journal_read(struct bch_fs *c,
		};

		i = *_i;
		if (!i || i->ignore)
		if (journal_replay_ignore(i))
			continue;

		darray_for_each(i->ptrs, ptr) {
+7 −1
Original line number Diff line number Diff line
@@ -20,11 +20,17 @@ struct journal_replay {
	DARRAY_PREALLOCATED(struct journal_ptr, 8) ptrs;

	bool			csum_good;
	bool			ignore;
	bool			ignore_blacklisted;
	bool			ignore_not_dirty;
	/* must be last: */
	struct jset		j;
};

static inline bool journal_replay_ignore(struct journal_replay *i)
{
	return !i || i->ignore_blacklisted || i->ignore_not_dirty;
}

static inline struct jset_entry *__jset_entry_type_next(struct jset *jset,
					struct jset_entry *entry, unsigned type)
{
+4 −3
Original line number Diff line number Diff line
@@ -366,7 +366,7 @@ static int journal_replay_early(struct bch_fs *c,
		genradix_for_each(&c->journal_entries, iter, _i) {
			i = *_i;

			if (!i || i->ignore)
			if (journal_replay_ignore(i))
				continue;

			vstruct_for_each(&i->j, entry) {
@@ -868,7 +868,7 @@ int bch2_fs_recovery(struct bch_fs *c)
			goto out;

		genradix_for_each_reverse(&c->journal_entries, iter, i)
			if (*i && !(*i)->ignore) {
			if (!journal_replay_ignore(*i)) {
				last_journal_entry = &(*i)->j;
				break;
			}
@@ -893,7 +893,8 @@ int bch2_fs_recovery(struct bch_fs *c)
			genradix_for_each_reverse(&c->journal_entries, iter, i)
				if (*i) {
					last_journal_entry = &(*i)->j;
					(*i)->ignore = false;
					(*i)->ignore_blacklisted = false;
					(*i)->ignore_not_dirty= false;
					/*
					 * This was probably a NO_FLUSH entry,
					 * so last_seq was garbage - but we know