summaryrefslogtreecommitdiff
path: root/libbcachefs/journal.c
diff options
context:
space:
mode:
Diffstat (limited to 'libbcachefs/journal.c')
-rw-r--r--libbcachefs/journal.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/libbcachefs/journal.c b/libbcachefs/journal.c
index ea67af3d..addd51f0 100644
--- a/libbcachefs/journal.c
+++ b/libbcachefs/journal.c
@@ -725,7 +725,10 @@ static int __bch2_set_nr_journal_buckets(struct bch_dev *ca, unsigned nr,
long bucket;
if (new_fs) {
+ percpu_down_read_preempt_disable(&c->usage_lock);
bucket = bch2_bucket_alloc_new_fs(ca);
+ percpu_up_read_preempt_enable(&c->usage_lock);
+
if (bucket < 0) {
ret = -ENOSPC;
goto err;
@@ -741,8 +744,10 @@ static int __bch2_set_nr_journal_buckets(struct bch_dev *ca, unsigned nr,
bucket = sector_to_bucket(ca, ob->ptr.offset);
}
- if (c)
+ if (c) {
+ percpu_down_read_preempt_disable(&c->usage_lock);
spin_lock(&c->journal.lock);
+ }
__array_insert_item(ja->buckets, ja->nr, ja->last_idx);
__array_insert_item(ja->bucket_seq, ja->nr, ja->last_idx);
@@ -759,9 +764,6 @@ static int __bch2_set_nr_journal_buckets(struct bch_dev *ca, unsigned nr,
}
ja->nr++;
- if (c)
- spin_unlock(&c->journal.lock);
-
bch2_mark_metadata_bucket(c, ca, bucket, BCH_DATA_JOURNAL,
ca->mi.bucket_size,
gc_phase(GC_PHASE_SB),
@@ -769,6 +771,11 @@ static int __bch2_set_nr_journal_buckets(struct bch_dev *ca, unsigned nr,
? BCH_BUCKET_MARK_MAY_MAKE_UNAVAILABLE
: 0);
+ if (c) {
+ spin_unlock(&c->journal.lock);
+ percpu_up_read_preempt_enable(&c->usage_lock);
+ }
+
if (!new_fs)
bch2_open_bucket_put(c, ob);
}