summaryrefslogtreecommitdiff
path: root/libbcachefs/alloc_background.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2020-06-26 14:51:58 -0400
committerKent Overstreet <kent.overstreet@gmail.com>2020-06-26 14:51:58 -0400
commit0243e4d41c980d2cf8771836f9fa2b43b69d1e29 (patch)
tree83db19b59a6ec65c3a6ea1be5ff68588a16f5f1f /libbcachefs/alloc_background.c
parentf8f84d93888483ee8fbac6bdea96d474a89c93e7 (diff)
Update bcachefs sources to b1708f0191 bcachefs: Fix a null ptr deref in bch2_btree_iter_traverse_one()
Diffstat (limited to 'libbcachefs/alloc_background.c')
-rw-r--r--libbcachefs/alloc_background.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/libbcachefs/alloc_background.c b/libbcachefs/alloc_background.c
index 0d64ba63..cb720ee0 100644
--- a/libbcachefs/alloc_background.c
+++ b/libbcachefs/alloc_background.c
@@ -501,6 +501,7 @@ static void bch2_bucket_clock_init(struct bch_fs *c, int rw)
static int wait_buckets_available(struct bch_fs *c, struct bch_dev *ca)
{
unsigned long gc_count = c->gc_count;
+ u64 available;
int ret = 0;
ca->allocator_state = ALLOCATOR_BLOCKED;
@@ -516,9 +517,11 @@ static int wait_buckets_available(struct bch_fs *c, struct bch_dev *ca)
if (gc_count != c->gc_count)
ca->inc_gen_really_needs_gc = 0;
- if ((ssize_t) (dev_buckets_available(c, ca) -
- ca->inc_gen_really_needs_gc) >=
- (ssize_t) fifo_free(&ca->free_inc))
+ available = max_t(s64, 0, dev_buckets_available(c, ca) -
+ ca->inc_gen_really_needs_gc);
+
+ if (available > fifo_free(&ca->free_inc) ||
+ (available && !fifo_full(&ca->free[RESERVE_BTREE])))
break;
up_read(&c->gc_lock);
@@ -1101,6 +1104,8 @@ static int bch2_allocator_thread(void *arg)
while (1) {
cond_resched();
+ if (kthread_should_stop())
+ break;
pr_debug("discarding %zu invalidated buckets",
fifo_used(&ca->free_inc));