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 <[email protected]>
---
 fs/bcachefs/fs-io.c   |  2 +-
 fs/bcachefs/journal.c | 10 ++++++----
 fs/bcachefs/journal.h |  2 +-
 3 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/fs/bcachefs/fs-io.c b/fs/bcachefs/fs-io.c
index 71d0fa387509..15d3f073b824 100644
--- a/fs/bcachefs/fs-io.c
+++ b/fs/bcachefs/fs-io.c
@@ -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;
diff --git a/fs/bcachefs/journal.c b/fs/bcachefs/journal.c
index dc099f06341f..2dc0d60c1745 100644
--- a/fs/bcachefs/journal.c
+++ b/fs/bcachefs/journal.c
@@ -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: */
diff --git a/fs/bcachefs/journal.h b/fs/bcachefs/journal.h
index 377a3750406e..2762be6f9814 100644
--- a/fs/bcachefs/journal.h
+++ b/fs/bcachefs/journal.h
@@ -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 *);
-- 
2.45.2


Reply via email to