Because we have lazy counters, it's possible that we over-allocate inodes past the maxicount (imaxpct) limit. A previous commit, 2fe3366 xfs: ensure f_ffree returned by statfs() is non-negative stopped statfs from underflowing f_ffree in this case, but that only happened when we mis-reported f_files, capped at maxicount. Change statfs to report the actual number of inodes allocated, even if it is greater than maxicount. It's reality. Deal with it. ;) Signed-off-by: Eric Sandeen <sandeen@xxxxxxxxxx> --- diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index f317488..7c7a810 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1083,7 +1083,6 @@ xfs_fs_statfs( struct xfs_inode *ip = XFS_I(dentry->d_inode); __uint64_t fakeinos, id; xfs_extlen_t lsize; - __int64_t ffree; statp->f_type = XFS_SB_MAGIC; statp->f_namelen = MAXNAMELEN - 1; @@ -1100,17 +1099,24 @@ xfs_fs_statfs( statp->f_blocks = sbp->sb_dblocks - lsize; statp->f_bfree = statp->f_bavail = sbp->sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); + + /* Potential number of new inodes in free blocks */ fakeinos = statp->f_bfree << sbp->sb_inopblog; + /* Total possible files is current inodes + potential new inodes */ statp->f_files = MIN(sbp->sb_icount + fakeinos, (__uint64_t)XFS_MAXINUMBER); + /* Unless we have maxicount! Then cap it at that */ if (mp->m_maxicount) statp->f_files = min_t(typeof(statp->f_files), statp->f_files, mp->m_maxicount); - /* make sure statp->f_ffree does not underflow */ - ffree = statp->f_files - (sbp->sb_icount - sbp->sb_ifree); - statp->f_ffree = max_t(__int64_t, ffree, 0); + /* But if we already managed to allocate more, let's be honest */ + statp->f_files = max_t(typeof(statp->f_files), + sbp->sb_icount, + statp->f_files); + + statp->f_ffree = statp->f_files - (sbp->sb_icount - sbp->sb_ifree); spin_unlock(&mp->m_sb_lock); _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs