Skip to content

Commit 778ac32

Browse files
author
Kent Overstreet
committed
bcachefs: Fix deadlock on -ENOSPC w.r.t. partial open buckets
Open buckets on the partial list should not count as allocated when we're trying to allocate from the partial list. Signed-off-by: Kent Overstreet <[email protected]>
1 parent e0fafac commit 778ac32

File tree

2 files changed

+16
-1
lines changed

2 files changed

+16
-1
lines changed

fs/bcachefs/alloc_foreground.c

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,10 @@ static void open_bucket_free_unused(struct bch_fs *c, struct open_bucket *ob)
162162
ARRAY_SIZE(c->open_buckets_partial));
163163

164164
spin_lock(&c->freelist_lock);
165+
rcu_read_lock();
166+
bch2_dev_rcu(c, ob->dev)->nr_partial_buckets++;
167+
rcu_read_unlock();
168+
165169
ob->on_partial_list = true;
166170
c->open_buckets_partial[c->open_buckets_partial_nr++] =
167171
ob - c->open_buckets;
@@ -972,7 +976,7 @@ static int bucket_alloc_set_partial(struct bch_fs *c,
972976
u64 avail;
973977

974978
bch2_dev_usage_read_fast(ca, &usage);
975-
avail = dev_buckets_free(ca, usage, watermark);
979+
avail = dev_buckets_free(ca, usage, watermark) + ca->nr_partial_buckets;
976980
if (!avail)
977981
continue;
978982

@@ -981,6 +985,10 @@ static int bucket_alloc_set_partial(struct bch_fs *c,
981985
i);
982986
ob->on_partial_list = false;
983987

988+
rcu_read_lock();
989+
bch2_dev_rcu(c, ob->dev)->nr_partial_buckets--;
990+
rcu_read_unlock();
991+
984992
ret = add_new_bucket(c, ptrs, devs_may_alloc,
985993
nr_replicas, nr_effective,
986994
have_cache, ob);
@@ -1191,7 +1199,13 @@ void bch2_open_buckets_stop(struct bch_fs *c, struct bch_dev *ca,
11911199
--c->open_buckets_partial_nr;
11921200
swap(c->open_buckets_partial[i],
11931201
c->open_buckets_partial[c->open_buckets_partial_nr]);
1202+
11941203
ob->on_partial_list = false;
1204+
1205+
rcu_read_lock();
1206+
bch2_dev_rcu(c, ob->dev)->nr_partial_buckets--;
1207+
rcu_read_unlock();
1208+
11951209
spin_unlock(&c->freelist_lock);
11961210
bch2_open_bucket_put(c, ob);
11971211
spin_lock(&c->freelist_lock);

fs/bcachefs/bcachefs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -555,6 +555,7 @@ struct bch_dev {
555555
u64 alloc_cursor[3];
556556

557557
unsigned nr_open_buckets;
558+
unsigned nr_partial_buckets;
558559
unsigned nr_btree_reserve;
559560

560561
size_t inc_gen_needs_gc;

0 commit comments

Comments
 (0)