]> www.infradead.org Git - users/hch/dma-mapping.git/commitdiff
bcachefs: Don't use wait_event_interruptible() in recovery
authorKent Overstreet <kent.overstreet@linux.dev>
Sat, 19 Oct 2024 21:50:41 +0000 (17:50 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 20 Oct 2024 20:50:14 +0000 (16:50 -0400)
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>
fs/bcachefs/fs-io.c
fs/bcachefs/journal.c
fs/bcachefs/journal.h

index 71d0fa3875094b3b98d946273148f25cef5a778a..15d3f073b8243d268323a3a29590babec4ddca5a 100644 (file)
@@ -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;
index dc099f06341f6122541264306e042bd45142e220..2dc0d60c174509f20fdf1d89685c7074bf93c375 100644 (file)
@@ -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: */
index 377a3750406e4c86d6da57716d9ef1d81f607dbf..2762be6f9814c9c0417d08279abc7d0e66d7de49 100644 (file)
@@ -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 *);