|
@@ -4458,6 +4458,7 @@ static int ext4_statfs(struct dentry *dentry, struct kstatfs *buf)
|
|
|
struct ext4_sb_info *sbi = EXT4_SB(sb);
|
|
|
struct ext4_super_block *es = sbi->s_es;
|
|
|
u64 fsid;
|
|
|
+ s64 bfree;
|
|
|
|
|
|
if (test_opt(sb, MINIX_DF)) {
|
|
|
sbi->s_overhead_last = 0;
|
|
@@ -4501,8 +4502,10 @@ static int ext4_statfs(struct dentry *dentry, struct kstatfs *buf)
|
|
|
buf->f_type = EXT4_SUPER_MAGIC;
|
|
|
buf->f_bsize = sb->s_blocksize;
|
|
|
buf->f_blocks = ext4_blocks_count(es) - sbi->s_overhead_last;
|
|
|
- buf->f_bfree = percpu_counter_sum_positive(&sbi->s_freeblocks_counter) -
|
|
|
+ bfree = percpu_counter_sum_positive(&sbi->s_freeblocks_counter) -
|
|
|
percpu_counter_sum_positive(&sbi->s_dirtyblocks_counter);
|
|
|
+ /* prevent underflow in case that few free space is available */
|
|
|
+ buf->f_bfree = max_t(s64, bfree, 0);
|
|
|
buf->f_bavail = buf->f_bfree - ext4_r_blocks_count(es);
|
|
|
if (buf->f_bfree < ext4_r_blocks_count(es))
|
|
|
buf->f_bavail = 0;
|