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)
committerDarrick J. Wong <djwong@kernel.org>
Tue, 5 Nov 2024 21:38:46 +0000 (13:38 -0800)
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>
fs/xfs/xfs_qm_bhv.c
fs/xfs/xfs_super.c

index 79a9655..847ba29 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 20fde24..f8d5908 100644 (file)
@@ -877,12 +877,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))) {
                s64     freertx;
@@ -893,6 +887,11 @@ xfs_fs_statfs(
                        xfs_rtbxlen_to_blen(mp, freertx);
        }
 
+       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;
 }