summaryrefslogtreecommitdiff
path: root/fs/bcachefs/alloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/bcachefs/alloc.c')
-rw-r--r--fs/bcachefs/alloc.c42
1 files changed, 26 insertions, 16 deletions
diff --git a/fs/bcachefs/alloc.c b/fs/bcachefs/alloc.c
index a76103b5ce90..5737e9eebeec 100644
--- a/fs/bcachefs/alloc.c
+++ b/fs/bcachefs/alloc.c
@@ -1711,7 +1711,7 @@ void bch2_alloc_sectors_done(struct bch_fs *c, struct write_point *wp)
void bch2_recalc_capacity(struct bch_fs *c)
{
struct bch_dev *ca;
- u64 total_capacity, capacity = 0, reserved_sectors = 0;
+ u64 capacity = 0, reserved_sectors = 0;
unsigned long ra_pages = 0;
unsigned i, j;
@@ -1726,7 +1726,7 @@ void bch2_recalc_capacity(struct bch_fs *c)
bch2_set_ra_pages(c, ra_pages);
for_each_rw_member(ca, c, i) {
- size_t reserve = 0;
+ u64 dev_capacity, dev_reserve = 0;
/*
* We need to reserve buckets (from the number
@@ -1745,30 +1745,40 @@ void bch2_recalc_capacity(struct bch_fs *c)
* not -ENOSPC calculations.
*/
for (j = 0; j < RESERVE_NONE; j++)
- reserve += ca->free[j].size;
+ dev_reserve += ca->free[j].size;
- reserve += ca->free_inc.size;
+ dev_reserve += ca->free_inc.size;
- reserve += ARRAY_SIZE(c->write_points);
+ dev_reserve += ARRAY_SIZE(c->write_points);
- reserve += 1; /* btree write point */
+ dev_reserve += 1; /* btree write point */
+ dev_reserve += 1; /* copygc write point */
+ dev_reserve += 1; /* rebalance write point */
+ dev_reserve += WRITE_POINT_COUNT;
- reserved_sectors += bucket_to_sector(ca, reserve);
+ dev_reserve *= ca->mi.bucket_size;
- capacity += bucket_to_sector(ca, ca->mi.nbuckets -
- ca->mi.first_bucket);
- }
+ dev_reserve *= 2;
+
+ dev_capacity = bucket_to_sector(ca, ca->mi.nbuckets -
+ ca->mi.first_bucket);
- total_capacity = capacity;
+ ca->copygc_threshold =
+ max(div64_u64(dev_capacity *
+ c->opts.gc_reserve_percent, 100),
+ dev_reserve) / 2;
- capacity *= (100 - c->opts.gc_reserve_percent);
- capacity = div64_u64(capacity, 100);
+ capacity += dev_capacity;
+ reserved_sectors += dev_reserve;
+ }
- BUG_ON(reserved_sectors > total_capacity);
+ reserved_sectors = max(div64_u64(capacity *
+ c->opts.gc_reserve_percent, 100),
+ reserved_sectors);
- capacity = min(capacity, total_capacity - reserved_sectors);
+ BUG_ON(reserved_sectors > capacity);
- c->capacity = capacity;
+ c->capacity = capacity - reserved_sectors;
if (c->capacity) {
bch2_io_timer_add(&c->io_clock[READ],