summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZheng Bin <zhengbin13@huawei.com>2020-05-12 11:48:35 -0700
committerDarrick J. Wong <darrick.wong@oracle.com>2020-05-13 15:32:45 -0700
commit237aac4624aac5d46b903539e91c8d4567a2bab5 (patch)
treeff6c818887afc31ec2259cbb5332ed26c52c4e39
parent3d60548b216b5486a541a06c167df3dfb6df9c2e (diff)
downloadlinux-stable-237aac4624aac5d46b903539e91c8d4567a2bab5.tar.gz
linux-stable-237aac4624aac5d46b903539e91c8d4567a2bab5.tar.bz2
linux-stable-237aac4624aac5d46b903539e91c8d4567a2bab5.zip
xfs: ensure f_bfree returned by statfs() is non-negative
Construct an img like this: dd if=/dev/zero of=xfs.img bs=1M count=20 mkfs.xfs -d agcount=1 xfs.img xfs_db -x xfs.img sb 0 write fdblocks 0 agf 0 write freeblks 0 write longest 0 quit mount it, df -h /mnt(xfs mount point), will show this: Filesystem Size Used Avail Use% Mounted on /dev/loop0 17M -64Z -32K 100% /mnt Reported-by: Hulk Robot <hulkci@huawei.com> Signed-off-by: Zheng Bin <zhengbin13@huawei.com> Reviewed-by: Brian Foster <bfoster@redhat.com> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
-rw-r--r--fs/xfs/xfs_super.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c
index e80bd2c4c279..aae469f73efe 100644
--- a/fs/xfs/xfs_super.c
+++ b/fs/xfs/xfs_super.c
@@ -807,7 +807,8 @@ xfs_fs_statfs(
statp->f_blocks = sbp->sb_dblocks - lsize;
spin_unlock(&mp->m_sb_lock);
- statp->f_bfree = fdblocks - mp->m_alloc_set_aside;
+ /* make sure statp->f_bfree does not underflow */
+ statp->f_bfree = max_t(int64_t, fdblocks - mp->m_alloc_set_aside, 0);
statp->f_bavail = statp->f_bfree;
fakeinos = XFS_FSB_TO_INO(mp, statp->f_bfree);