On Sun, Mar 20, 2022 at 09:43:55AM -0700, Darrick J. Wong wrote: > From: Darrick J. Wong <djwong@xxxxxxxxxx> > > On a modern filesystem, we don't allow userspace to allocate blocks for > data storage from the per-AG space reservations, the user-controlled > reservation pool that prevents ENOSPC in the middle of internal > operations, or the internal per-AG set-aside that prevents ENOSPC. We can prevent -ENOSPC now? Neat! :) > Since we now consider free space btree blocks as unavailable for > allocation for data storage, we shouldn't report those blocks via statfs > either. > Might be worth a sentence or two that document the (intentional) side effects of this from a user perspective. I.e., that technically the presented free space will be a conservative estimate of actual free space (since allocbt blocks free up as free extents are consumed, etc.). Otherwise with that sort of commit log tweak: Reviewed-by: Brian Foster <bfoster@xxxxxxxxxx> > Signed-off-by: Darrick J. Wong <djwong@xxxxxxxxxx> > --- > fs/xfs/xfs_fsops.c | 2 +- > fs/xfs/xfs_super.c | 3 ++- > 2 files changed, 3 insertions(+), 2 deletions(-) > > > diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c > index 615334e4f689..863e6389c6ff 100644 > --- a/fs/xfs/xfs_fsops.c > +++ b/fs/xfs/xfs_fsops.c > @@ -347,7 +347,7 @@ xfs_fs_counts( > cnt->allocino = percpu_counter_read_positive(&mp->m_icount); > cnt->freeino = percpu_counter_read_positive(&mp->m_ifree); > cnt->freedata = percpu_counter_read_positive(&mp->m_fdblocks) - > - mp->m_alloc_set_aside; > + xfs_fdblocks_unavailable(mp); > > spin_lock(&mp->m_sb_lock); > cnt->freertx = mp->m_sb.sb_frextents; > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index d84714e4e46a..54be9d64093e 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -815,7 +815,8 @@ xfs_fs_statfs( > spin_unlock(&mp->m_sb_lock); > > /* make sure statp->f_bfree does not underflow */ > - statp->f_bfree = max_t(int64_t, fdblocks - mp->m_alloc_set_aside, 0); > + statp->f_bfree = max_t(int64_t, 0, > + fdblocks - xfs_fdblocks_unavailable(mp)); > statp->f_bavail = statp->f_bfree; > > fakeinos = XFS_FSB_TO_INO(mp, statp->f_bfree); >