summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2018-01-07 16:44:34 -0500
committerKent Overstreet <kent.overstreet@gmail.com>2018-05-22 00:44:18 -0400
commit068e3da3565aeb3b808ce66b92e01ab847635abf (patch)
tree9d6ffbcd68322f408cd360abf8b919dc6ab733b3
parent9fb51eaa10e0fa1fe904132fb0c187047f2db2c9 (diff)
bcachefs: fix df
-rw-r--r--fs/bcachefs/buckets.c19
-rw-r--r--fs/bcachefs/buckets.h1
-rw-r--r--fs/bcachefs/fs.c3
3 files changed, 14 insertions, 9 deletions
diff --git a/fs/bcachefs/buckets.c b/fs/bcachefs/buckets.c
index 2e249d66ab00..43133cbb50e9 100644
--- a/fs/bcachefs/buckets.c
+++ b/fs/bcachefs/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);
@@ -665,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: */
@@ -810,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];
diff --git a/fs/bcachefs/buckets.h b/fs/bcachefs/buckets.h
index 8cebc2b31da6..86e72829c430 100644
--- a/fs/bcachefs/buckets.h
+++ b/fs/bcachefs/buckets.h
@@ -184,6 +184,7 @@ void bch2_fs_usage_apply(struct bch_fs *, struct bch_fs_usage *,
u64 __bch2_fs_sectors_used(struct bch_fs *, struct bch_fs_usage);
u64 bch2_fs_sectors_used(struct bch_fs *, struct bch_fs_usage);
+u64 bch2_fs_sectors_free(struct bch_fs *, struct bch_fs_usage);
static inline bool is_available_bucket(struct bucket_mark mark)
{
diff --git a/fs/bcachefs/fs.c b/fs/bcachefs/fs.c
index 472df23a4ad1..72aa52e2f5d4 100644
--- a/fs/bcachefs/fs.c
+++ b/fs/bcachefs/fs.c
@@ -1009,8 +1009,7 @@ static int bch2_statfs(struct dentry *dentry, struct kstatfs *buf)
buf->f_type = BCACHEFS_STATFS_MAGIC;
buf->f_bsize = sb->s_blocksize;
buf->f_blocks = c->capacity >> PAGE_SECTOR_SHIFT;
- buf->f_bfree = (c->capacity -
- bch2_fs_sectors_used(c, bch2_fs_usage_read(c))) >>
+ buf->f_bfree = bch2_fs_sectors_free(c, bch2_fs_usage_read(c)) >>
PAGE_SECTOR_SHIFT;
buf->f_bavail = buf->f_bfree;
buf->f_files = atomic_long_read(&c->nr_inodes);