mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-23 12:14:10 +08:00
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: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
eb5db64c45
commit
3956ff8bc2
@ -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;
|
||||
|
@ -758,7 +758,7 @@ out:
|
||||
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: */
|
||||
|
@ -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 *);
|
||||
|
Loading…
Reference in New Issue
Block a user