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 *);