diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2018-01-07 16:44:34 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2018-05-22 00:44:18 -0400 |
commit | 068e3da3565aeb3b808ce66b92e01ab847635abf (patch) | |
tree | 9d6ffbcd68322f408cd360abf8b919dc6ab733b3 | |
parent | 9fb51eaa10e0fa1fe904132fb0c187047f2db2c9 (diff) |
bcachefs: fix df
-rw-r--r-- | fs/bcachefs/buckets.c | 19 | ||||
-rw-r--r-- | fs/bcachefs/buckets.h | 1 | ||||
-rw-r--r-- | fs/bcachefs/fs.c | 3 |
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); |