Commit 9a17ebfe authored by Darrick J. Wong's avatar Darrick J. Wong
Browse files

xfs: report realtime block quota limits on realtime directories



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: default avatarDarrick J. Wong <djwong@kernel.org>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
parent 184c619f
Loading
Loading
Loading
Loading
+12 −6
Original line number Diff line number Diff line
@@ -19,18 +19,24 @@
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);
	}
}
+5 −6
Original line number Diff line number Diff line
@@ -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;
}