summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/bcachefs/journal.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/fs/bcachefs/journal.c b/fs/bcachefs/journal.c
index 880ca2061012..0570cd1cb8cf 100644
--- a/fs/bcachefs/journal.c
+++ b/fs/bcachefs/journal.c
@@ -96,12 +96,15 @@ static void bch2_journal_buf_init(struct journal *j)
void bch2_journal_halt(struct journal *j)
{
union journal_res_state old, new;
- u64 v = atomic64_read(&j->reservations.counter);
+ u64 v;
+
+ spin_lock(&j->lock);
+ v = atomic64_read(&j->reservations.counter);
do {
old.v = new.v = v;
if (old.cur_entry_offset == JOURNAL_ENTRY_ERROR_VAL)
- return;
+ goto out;
new.cur_entry_offset = JOURNAL_ENTRY_ERROR_VAL;
} while ((v = atomic64_cmpxchg(&j->reservations.counter,
@@ -115,6 +118,8 @@ void bch2_journal_halt(struct journal *j)
j->err_seq = journal_cur_seq(j);
journal_wake(j);
closure_wake_up(&journal_cur_buf(j)->wait);
+out:
+ spin_unlock(&j->lock);
}
/* journal entry close/open: */
@@ -266,6 +271,9 @@ static int journal_entry_open(struct journal *j)
if (j->cur_entry_error)
return j->cur_entry_error;
+ if (bch2_journal_error(j))
+ return cur_entry_insufficient_devices; /* -EROFS */
+
BUG_ON(!j->cur_entry_sectors);
/* We used to add things to the first journal entry before opening it,
@@ -296,8 +304,7 @@ static int journal_entry_open(struct journal *j)
do {
old.v = new.v = v;
- if (old.cur_entry_offset == JOURNAL_ENTRY_ERROR_VAL)
- return cur_entry_insufficient_devices;
+ BUG_ON(old.cur_entry_offset == JOURNAL_ENTRY_ERROR_VAL);
EBUG_ON(journal_state_count(new, new.idx));
journal_state_inc(&new);