]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
xfs: report realtime block quota limits on realtime directories
authorDarrick J. Wong <djwong@kernel.org>
Mon, 4 Nov 2024 04:19:40 +0000 (20:19 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 13 Mar 2025 11:50:21 +0000 (12:50 +0100)
[ Upstream commit 9a17ebfea9d0c7e0bb7409dcf655bf982a5d6e52 ]

On the data device, calling statvfs on a projinherit directory results
in the block and avail counts being curtailed to the project quota block
limits, if any are set.  Do the same for realtime files or directories,
only use the project quota rt block limits.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Stable-dep-of: 4b8d867ca6e2 ("xfs: don't over-report free space or inodes in statvfs")
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/xfs/xfs_qm_bhv.c
fs/xfs/xfs_super.c

index b77673dd05581eaf36db6f8723b3eb87c1016230..268a07218c777c186d170c46257a497945d2ac4e 100644 (file)
 STATIC void
 xfs_fill_statvfs_from_dquot(
        struct kstatfs          *statp,
+       struct xfs_inode        *ip,
        struct xfs_dquot        *dqp)
 {
+       struct xfs_dquot_res    *blkres = &dqp->q_blk;
        uint64_t                limit;
 
-       limit = dqp->q_blk.softlimit ?
-               dqp->q_blk.softlimit :
-               dqp->q_blk.hardlimit;
+       if (XFS_IS_REALTIME_MOUNT(ip->i_mount) &&
+           (ip->i_diflags & (XFS_DIFLAG_RTINHERIT | XFS_DIFLAG_REALTIME)))
+               blkres = &dqp->q_rtb;
+
+       limit = blkres->softlimit ?
+               blkres->softlimit :
+               blkres->hardlimit;
        if (limit && statp->f_blocks > limit) {
                statp->f_blocks = limit;
                statp->f_bfree = statp->f_bavail =
-                       (statp->f_blocks > dqp->q_blk.reserved) ?
-                        (statp->f_blocks - dqp->q_blk.reserved) : 0;
+                       (statp->f_blocks > blkres->reserved) ?
+                        (statp->f_blocks - blkres->reserved) : 0;
        }
 
        limit = dqp->q_ino.softlimit ?
@@ -61,7 +67,7 @@ xfs_qm_statvfs(
        struct xfs_dquot        *dqp;
 
        if (!xfs_qm_dqget(mp, ip->i_projid, XFS_DQTYPE_PROJ, false, &dqp)) {
-               xfs_fill_statvfs_from_dquot(statp, dqp);
+               xfs_fill_statvfs_from_dquot(statp, ip, dqp);
                xfs_qm_dqput(dqp);
        }
 }
index f4c25b07dc99d3cd0d64052be94b34fce1f8e0fa..e48455e2b5f2fc434ace0fdf1a3084695b413f41 100644 (file)
@@ -837,12 +837,6 @@ xfs_fs_statfs(
        ffree = statp->f_files - (icount - ifree);
        statp->f_ffree = max_t(int64_t, ffree, 0);
 
-
-       if ((ip->i_diflags & XFS_DIFLAG_PROJINHERIT) &&
-           ((mp->m_qflags & (XFS_PQUOTA_ACCT|XFS_PQUOTA_ENFD))) ==
-                             (XFS_PQUOTA_ACCT|XFS_PQUOTA_ENFD))
-               xfs_qm_statvfs(ip, statp);
-
        if (XFS_IS_REALTIME_MOUNT(mp) &&
            (ip->i_diflags & (XFS_DIFLAG_RTINHERIT | XFS_DIFLAG_REALTIME))) {
                statp->f_blocks = sbp->sb_rblocks;
@@ -850,6 +844,11 @@ xfs_fs_statfs(
                        sbp->sb_frextents * sbp->sb_rextsize;
        }
 
+       if ((ip->i_diflags & XFS_DIFLAG_PROJINHERIT) &&
+           ((mp->m_qflags & (XFS_PQUOTA_ACCT|XFS_PQUOTA_ENFD))) ==
+                             (XFS_PQUOTA_ACCT|XFS_PQUOTA_ENFD))
+               xfs_qm_statvfs(ip, statp);
+
        return 0;
 }