]> www.infradead.org Git - users/hch/xfs.git/commitdiff
xfs: report realtime block quota limits on realtime directories
authorDarrick J. Wong <djwong@kernel.org>
Mon, 23 Sep 2024 20:20:39 +0000 (13:20 -0700)
committerChristoph Hellwig <hch@lst.de>
Wed, 9 Oct 2024 13:55:43 +0000 (15:55 +0200)
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>
fs/xfs/xfs_qm_bhv.c
fs/xfs/xfs_super.c

index 79a96558f739e3b5c48a1a2828603b39b7788f64..847ba29630e9d8e74e923066cfa67f42773649ba 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 90d79d22793e79877fb85a5b844bb21109995843..adc8109a6a953dc9d1c10bf7a78f88b34e0f4880 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;
 }