summaryrefslogtreecommitdiff
path: root/libbcachefs/buckets.c
diff options
context:
space:
mode:
Diffstat (limited to 'libbcachefs/buckets.c')
-rw-r--r--libbcachefs/buckets.c48
1 files changed, 12 insertions, 36 deletions
diff --git a/libbcachefs/buckets.c b/libbcachefs/buckets.c
index 2dbe7d37..43133cbb 100644
--- a/libbcachefs/buckets.c
+++ b/libbcachefs/buckets.c
@@ -258,6 +258,11 @@ static u64 reserve_factor(u64 r)
return r + (round_up(r, (1 << RESERVE_FACTOR)) >> RESERVE_FACTOR);
}
+static u64 avail_factor(u64 r)
+{
+ return (r << RESERVE_FACTOR) / (1 << RESERVE_FACTOR) + 1;
+}
+
u64 __bch2_fs_sectors_used(struct bch_fs *c, struct bch_fs_usage stats)
{
struct fs_usage_sum sum = __fs_usage_sum(stats);
@@ -270,6 +275,11 @@ u64 bch2_fs_sectors_used(struct bch_fs *c, struct bch_fs_usage stats)
return min(c->capacity, __bch2_fs_sectors_used(c, stats));
}
+u64 bch2_fs_sectors_free(struct bch_fs *c, struct bch_fs_usage stats)
+{
+ return avail_factor(c->capacity - bch2_fs_sectors_used(c, stats));
+}
+
static inline int is_unavailable_bucket(struct bucket_mark m)
{
return !is_available_bucket(m);
@@ -382,7 +392,6 @@ bool bch2_invalidate_bucket(struct bch_fs *c, struct bch_dev *ca,
}
new.owned_by_allocator = 1;
- new.touched_this_mount = 1;
new.data_type = 0;
new.cached_sectors = 0;
new.dirty_sectors = 0;
@@ -396,29 +405,6 @@ bool bch2_invalidate_bucket(struct bch_fs *c, struct bch_dev *ca,
return true;
}
-bool bch2_mark_alloc_bucket_startup(struct bch_fs *c, struct bch_dev *ca,
- size_t b)
-{
- struct bucket *g;
- struct bucket_mark new, old;
-
- lg_local_lock(&c->usage_lock);
- g = bucket(ca, b);
-
- old = bucket_data_cmpxchg(c, ca, g, new, ({
- if (!is_startup_available_bucket(new)) {
- lg_local_unlock(&c->usage_lock);
- return false;
- }
-
- new.owned_by_allocator = 1;
- new.touched_this_mount = 1;
- }));
- lg_local_unlock(&c->usage_lock);
-
- return true;
-}
-
void bch2_mark_alloc_bucket(struct bch_fs *c, struct bch_dev *ca,
size_t b, bool owned_by_allocator,
struct gc_pos pos, unsigned flags)
@@ -436,7 +422,6 @@ void bch2_mark_alloc_bucket(struct bch_fs *c, struct bch_dev *ca,
}
old = bucket_data_cmpxchg(c, ca, g, new, ({
- new.touched_this_mount = 1;
new.owned_by_allocator = owned_by_allocator;
}));
lg_local_unlock(&c->usage_lock);
@@ -481,7 +466,6 @@ void bch2_mark_metadata_bucket(struct bch_fs *c, struct bch_dev *ca,
saturated_add(ca, new.dirty_sectors, sectors,
GC_MAX_SECTORS_USED);
new.data_type = type;
- new.touched_this_mount = 1;
}));
lg_local_unlock(&c->usage_lock);
@@ -539,7 +523,6 @@ static void bch2_mark_pointer(struct bch_fs *c,
if (flags & BCH_BUCKET_MARK_GC_WILL_VISIT) {
if (journal_seq)
bucket_cmpxchg(g, new, ({
- new.touched_this_mount = 1;
new.journal_seq_valid = 1;
new.journal_seq = journal_seq;
}));
@@ -588,8 +571,6 @@ static void bch2_mark_pointer(struct bch_fs *c,
new.data_type = data_type;
}
- new.touched_this_mount = 1;
-
if (flags & BCH_BUCKET_MARK_NOATOMIC) {
g->_mark = new;
break;
@@ -694,17 +675,12 @@ void bch2_mark_key(struct bch_fs *c, struct bkey_s_c k,
static u64 __recalc_sectors_available(struct bch_fs *c)
{
- u64 avail;
int cpu;
for_each_possible_cpu(cpu)
per_cpu_ptr(c->usage_percpu, cpu)->available_cache = 0;
- avail = c->capacity - bch2_fs_sectors_used(c, bch2_fs_usage_read(c));
-
- avail <<= RESERVE_FACTOR;
- avail /= (1 << RESERVE_FACTOR) + 1;
- return avail;
+ return bch2_fs_sectors_free(c, bch2_fs_usage_read(c));
}
/* Used by gc when it's starting: */
@@ -839,7 +815,7 @@ static void buckets_free_rcu(struct rcu_head *rcu)
int bch2_dev_buckets_resize(struct bch_fs *c, struct bch_dev *ca, u64 nbuckets)
{
- struct bucket_array *buckets = NULL, *old_buckets;
+ struct bucket_array *buckets = NULL, *old_buckets = NULL;
unsigned long *buckets_dirty = NULL;
u8 *oldest_gens = NULL;
alloc_fifo free[RESERVE_NR];