Commit 3956ff8b authored by Kent Overstreet's avatar Kent Overstreet
Browse files

bcachefs: Don't use wait_event_interruptible() in recovery

Fix a bug where mount was failing with -ERESTARTSYS:
https://github.com/koverstreet/bcachefs/issues/741



We only want the interruptible wait when called from fsync.

Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent eb5db64c
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -182,7 +182,7 @@ static int bch2_flush_inode(struct bch_fs *c,

	struct bch_inode_unpacked u;
	int ret = bch2_inode_find_by_inum(c, inode_inum(inode), &u) ?:
		  bch2_journal_flush_seq(&c->journal, u.bi_journal_seq) ?:
		  bch2_journal_flush_seq(&c->journal, u.bi_journal_seq, TASK_INTERRUPTIBLE) ?:
		  bch2_inode_flush_nocow_writes(c, inode);
	bch2_write_ref_put(c, BCH_WRITE_REF_fsync);
	return ret;
+6 −4
Original line number Diff line number Diff line
@@ -758,7 +758,7 @@ int bch2_journal_flush_seq_async(struct journal *j, u64 seq,
	return ret;
}

int bch2_journal_flush_seq(struct journal *j, u64 seq)
int bch2_journal_flush_seq(struct journal *j, u64 seq, unsigned task_state)
{
	u64 start_time = local_clock();
	int ret, ret2;
@@ -769,7 +769,9 @@ int bch2_journal_flush_seq(struct journal *j, u64 seq)
	if (seq <= j->flushed_seq_ondisk)
		return 0;

	ret = wait_event_interruptible(j->wait, (ret2 = bch2_journal_flush_seq_async(j, seq, NULL)));
	ret = wait_event_state(j->wait,
			       (ret2 = bch2_journal_flush_seq_async(j, seq, NULL)),
			       task_state);

	if (!ret)
		bch2_time_stats_update(j->flush_seq_time, start_time);
@@ -788,7 +790,7 @@ void bch2_journal_flush_async(struct journal *j, struct closure *parent)

int bch2_journal_flush(struct journal *j)
{
	return bch2_journal_flush_seq(j, atomic64_read(&j->seq));
	return bch2_journal_flush_seq(j, atomic64_read(&j->seq), TASK_UNINTERRUPTIBLE);
}

/*
@@ -851,7 +853,7 @@ int bch2_journal_meta(struct journal *j)

	bch2_journal_res_put(j, &res);

	return bch2_journal_flush_seq(j, res.seq);
	return bch2_journal_flush_seq(j, res.seq, TASK_UNINTERRUPTIBLE);
}

/* block/unlock the journal: */
+1 −1
Original line number Diff line number Diff line
@@ -401,7 +401,7 @@ void bch2_journal_entry_res_resize(struct journal *,
int bch2_journal_flush_seq_async(struct journal *, u64, struct closure *);
void bch2_journal_flush_async(struct journal *, struct closure *);

int bch2_journal_flush_seq(struct journal *, u64);
int bch2_journal_flush_seq(struct journal *, u64, unsigned);
int bch2_journal_flush(struct journal *);
bool bch2_journal_noflush_seq(struct journal *, u64);
int bch2_journal_meta(struct journal *);