diff options
Diffstat (limited to 'libbcachefs/journal_io.c')
-rw-r--r-- | libbcachefs/journal_io.c | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/libbcachefs/journal_io.c b/libbcachefs/journal_io.c index e91c9848..c593d77d 100644 --- a/libbcachefs/journal_io.c +++ b/libbcachefs/journal_io.c @@ -19,6 +19,7 @@ #include <linux/ioprio.h> #include <linux/string_choices.h> +#include <linux/sched/sysctl.h> void bch2_journal_pos_from_member_info_set(struct bch_fs *c) { @@ -1263,7 +1264,8 @@ int bch2_journal_read(struct bch_fs *c, degraded = true; } - closure_sync(&jlist.cl); + while (closure_sync_timeout(&jlist.cl, sysctl_hung_task_timeout_secs * HZ / 2)) + ; if (jlist.ret) return jlist.ret; @@ -2045,15 +2047,6 @@ CLOSURE_CALLBACK(bch2_journal_write) j->write_start_time = local_clock(); - mutex_lock(&j->buf_lock); - journal_buf_realloc(j, w); - - ret = bch2_journal_write_prep(j, w); - mutex_unlock(&j->buf_lock); - - if (unlikely(ret)) - goto err; - spin_lock(&j->lock); if (nr_rw_members > 1) w->separate_flush = true; @@ -2064,6 +2057,15 @@ CLOSURE_CALLBACK(bch2_journal_write) if (unlikely(ret)) goto err; + mutex_lock(&j->buf_lock); + journal_buf_realloc(j, w); + + ret = bch2_journal_write_prep(j, w); + mutex_unlock(&j->buf_lock); + + if (unlikely(ret)) + goto err; + unsigned replicas_allocated = 0; while (1) { ret = journal_write_alloc(j, w, &replicas_allocated); |