summaryrefslogtreecommitdiff
path: root/fs/bcachefs/buckets.h
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2021-04-13 16:49:23 +0300
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-23 00:08:54 +0300
commitcb66fc5fe4cc806d60d8884cb82b67c357b49640 (patch)
tree7259c200084c9baf05d68584f2346abe957165e8 /fs/bcachefs/buckets.h
parent006d69aa2655f1a0ca4e47666939669f27bb740f (diff)
downloadlinux-cb66fc5fe4cc806d60d8884cb82b67c357b49640.tar.xz
bcachefs: Fix copygc threshold
Awhile back the meaning of is_available_bucket() and thus also bch_dev_usage->buckets_unavailable changed to include buckets that are owned by the allocator - this was so that the stat could be persisted like other allocation information, and wouldn't have to be regenerated by walking each bucket at mount time. This broke copygc, which needs to consider buckets that are reclaimable and haven't yet been grabbed by the allocator thread and moved onta freelist. This patch fixes that by adding dev_buckets_reclaimable() for copygc and the allocator thread, and cleans up some of the callers a bit. Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com> Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs/buckets.h')
-rw-r--r--fs/bcachefs/buckets.h26
1 files changed, 16 insertions, 10 deletions
diff --git a/fs/bcachefs/buckets.h b/fs/bcachefs/buckets.h
index c965c4d48218..e53cee27a720 100644
--- a/fs/bcachefs/buckets.h
+++ b/fs/bcachefs/buckets.h
@@ -175,25 +175,31 @@ static inline u64 __dev_buckets_available(struct bch_dev *ca,
return total - stats.buckets_unavailable;
}
-/*
- * Number of reclaimable buckets - only for use by the allocator thread:
- */
static inline u64 dev_buckets_available(struct bch_dev *ca)
{
return __dev_buckets_available(ca, bch2_dev_usage_read(ca));
}
-static inline u64 __dev_buckets_free(struct bch_dev *ca,
- struct bch_dev_usage stats)
+static inline u64 __dev_buckets_reclaimable(struct bch_dev *ca,
+ struct bch_dev_usage stats)
{
- return __dev_buckets_available(ca, stats) +
- fifo_used(&ca->free[RESERVE_NONE]) +
- fifo_used(&ca->free_inc);
+ struct bch_fs *c = ca->fs;
+ s64 available = __dev_buckets_available(ca, stats);
+ unsigned i;
+
+ spin_lock(&c->freelist_lock);
+ for (i = 0; i < RESERVE_NR; i++)
+ available -= fifo_used(&ca->free[i]);
+ available -= fifo_used(&ca->free_inc);
+ available -= ca->nr_open_buckets;
+ spin_unlock(&c->freelist_lock);
+
+ return max(available, 0LL);
}
-static inline u64 dev_buckets_free(struct bch_dev *ca)
+static inline u64 dev_buckets_reclaimable(struct bch_dev *ca)
{
- return __dev_buckets_free(ca, bch2_dev_usage_read(ca));
+ return __dev_buckets_reclaimable(ca, bch2_dev_usage_read(ca));
}
/* Filesystem usage: */