mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 21:21:41 +00:00
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: Darrick J. Wong <djwong@kernel.org> Reviewed-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
parent
184c619f55
commit
9a17ebfea9
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user