Commit 382e275f authored by Darrick J. Wong's avatar Darrick J. Wong
Browse files

xfs: don't count metadata directory files to quota



Files in the metadata directory tree are internal to the filesystem.
Don't count the inodes or the blocks they use in the root dquot because
users do not need to know about their resource usage.  This will also
quiet down complaints about dquot usage not matching du output.

Signed-off-by: default avatarDarrick J. Wong <djwong@kernel.org>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
parent df866c53
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -983,6 +983,7 @@ xfs_qm_dqget_inode(

	xfs_assert_ilocked(ip, XFS_ILOCK_EXCL);
	ASSERT(xfs_inode_dquot(ip, type) == NULL);
	ASSERT(!xfs_is_metadir_inode(ip));

	id = xfs_qm_id_for_quotatype(ip, type);

+11 −0
Original line number Diff line number Diff line
@@ -304,6 +304,8 @@ xfs_qm_need_dqattach(
		return false;
	if (xfs_is_quota_inode(&mp->m_sb, ip->i_ino))
		return false;
	if (xfs_is_metadir_inode(ip))
		return false;
	return true;
}

@@ -326,6 +328,7 @@ xfs_qm_dqattach_locked(
		return 0;

	xfs_assert_ilocked(ip, XFS_ILOCK_EXCL);
	ASSERT(!xfs_is_metadir_inode(ip));

	if (XFS_IS_UQUOTA_ON(mp) && !ip->i_udquot) {
		error = xfs_qm_dqattach_one(ip, XFS_DQTYPE_USER,
@@ -1204,6 +1207,10 @@ xfs_qm_dqusage_adjust(
		}
	}

	/* Metadata directory files are not accounted to user-visible quotas. */
	if (xfs_is_metadir_inode(ip))
		goto error0;

	ASSERT(ip->i_delayed_blks == 0);

	if (XFS_IS_REALTIME_INODE(ip)) {
@@ -1754,6 +1761,8 @@ xfs_qm_vop_dqalloc(
	if (!XFS_IS_QUOTA_ON(mp))
		return 0;

	ASSERT(!xfs_is_metadir_inode(ip));

	lockflags = XFS_ILOCK_EXCL;
	xfs_ilock(ip, lockflags);

@@ -1883,6 +1892,7 @@ xfs_qm_vop_chown(

	xfs_assert_ilocked(ip, XFS_ILOCK_EXCL);
	ASSERT(XFS_IS_QUOTA_ON(ip->i_mount));
	ASSERT(!xfs_is_metadir_inode(ip));

	/* old dquot */
	prevdq = *IO_olddq;
@@ -1970,6 +1980,7 @@ xfs_qm_vop_create_dqattach(
		return;

	xfs_assert_ilocked(ip, XFS_ILOCK_EXCL);
	ASSERT(!xfs_is_metadir_inode(ip));

	if (udqp && XFS_IS_UQUOTA_ON(mp)) {
		ASSERT(ip->i_udquot == NULL);
+5 −0
Original line number Diff line number Diff line
@@ -29,6 +29,11 @@ struct xfs_buf;
	 (XFS_IS_GQUOTA_ON(mp) && (ip)->i_gdquot == NULL) || \
	 (XFS_IS_PQUOTA_ON(mp) && (ip)->i_pdquot == NULL))

#define XFS_IS_DQDETACHED(ip) \
	((ip)->i_udquot == NULL && \
	 (ip)->i_gdquot == NULL && \
	 (ip)->i_pdquot == NULL)

#define XFS_QM_NEED_QUOTACHECK(mp) \
	((XFS_IS_UQUOTA_ON(mp) && \
		(mp->m_sb.sb_qflags & XFS_UQUOTA_CHKD) == 0) || \
+6 −0
Original line number Diff line number Diff line
@@ -156,6 +156,8 @@ xfs_trans_mod_ino_dquot(
	unsigned int			field,
	int64_t				delta)
{
	ASSERT(!xfs_is_metadir_inode(ip) || XFS_IS_DQDETACHED(ip));

	xfs_trans_mod_dquot(tp, dqp, field, delta);

	if (xfs_hooks_switched_on(&xfs_dqtrx_hooks_switch)) {
@@ -247,6 +249,8 @@ xfs_trans_mod_dquot_byino(
	    xfs_is_quota_inode(&mp->m_sb, ip->i_ino))
		return;

	ASSERT(!xfs_is_metadir_inode(ip) || XFS_IS_DQDETACHED(ip));

	if (XFS_IS_UQUOTA_ON(mp) && ip->i_udquot)
		xfs_trans_mod_ino_dquot(tp, ip, ip->i_udquot, field, delta);
	if (XFS_IS_GQUOTA_ON(mp) && ip->i_gdquot)
@@ -962,6 +966,8 @@ xfs_trans_reserve_quota_nblks(

	if (!XFS_IS_QUOTA_ON(mp))
		return 0;
	if (xfs_is_metadir_inode(ip))
		return 0;

	ASSERT(!xfs_is_quota_inode(&mp->m_sb, ip->i_ino));
	xfs_assert_ilocked(ip, XFS_ILOCK_EXCL);