On Mon, Mar 21, 2022 at 11:22:58AM -0400, Brian Foster wrote: > 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! :) Heh, that was a bad sentence. I'll update the end of that to read: "...or the internal per-AG set-aside that prevents unwanted filesystem shutdowns due to ENOSPC during a bmap btree split." > > 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.). Ok. Added the following at the end of the commit log: "This makes the numbers that we return via the statfs f_bavail and f_bfree fields a more conservative estimate of actual free space." --D > > 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); > > >