diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2022-07-17 22:59:01 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-02-03 21:48:33 -0500 |
commit | 86f6ee4ebc4ee67fcab3a953c787b9234c1f2dfe (patch) | |
tree | 8bc6b79716753d621b7c020f9ff1efee88ecfa66 | |
parent | 71f6d1874a23d9b1f7bdfe7c944578d9e18f763c (diff) |
bcachefs: Fix should_invalidate_buckets()
Like bch2_copygc_wait_amount, should_invalidate_buckets() needs to try
to ensure that there are always more buckets free than the largest
reserve.
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
-rw-r--r-- | fs/bcachefs/alloc_background.h | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/fs/bcachefs/alloc_background.h b/fs/bcachefs/alloc_background.h index ff366e61ace5..488db3211ce4 100644 --- a/fs/bcachefs/alloc_background.h +++ b/fs/bcachefs/alloc_background.h @@ -134,11 +134,13 @@ void bch2_do_discards(struct bch_fs *); static inline u64 should_invalidate_buckets(struct bch_dev *ca, struct bch_dev_usage u) { - u64 free = u.d[BCH_DATA_free].buckets + - u.d[BCH_DATA_need_discard].buckets; + u64 want_free = ca->mi.nbuckets >> 7; + u64 free = max_t(s64, 0, + u.d[BCH_DATA_free].buckets + + u.d[BCH_DATA_need_discard].buckets + - bch2_dev_buckets_reserved(ca, RESERVE_none)); - return clamp_t(s64, (ca->mi.nbuckets >> 7) - free, - 0, u.d[BCH_DATA_cached].buckets); + return clamp_t(s64, want_free - free, 0, u.d[BCH_DATA_cached].buckets); } void bch2_do_invalidates(struct bch_fs *); |