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

xfs: metapath scrubber should use the already loaded inodes



Don't waste time in xchk_setup_metapath_dqinode doing a second lookup of
the quota inodes, just grab them from the quotainfo structure.  The
whole point of this scrubber is to make sure that the dirents exist, so
it's completely silly to do lookups.

Cc: <stable@vger.kernel.org> # v6.13-rc1
Fixes: 128a0552 ("xfs: scrub quota file metapaths")
Signed-off-by: default avatar"Darrick J. Wong" <djwong@kernel.org>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
parent a440a28d
Loading
Loading
Loading
Loading
+25 −16
Original line number Diff line number Diff line
@@ -196,36 +196,45 @@ xchk_setup_metapath_dqinode(
	struct xfs_scrub	*sc,
	xfs_dqtype_t		type)
{
	struct xfs_quotainfo	*qi = sc->mp->m_quotainfo;
	struct xfs_trans	*tp = NULL;
	struct xfs_inode	*dp = NULL;
	struct xfs_inode	*ip = NULL;
	const char		*path;
	int			error;

	if (!qi)
		return -ENOENT;

	switch (type) {
	case XFS_DQTYPE_USER:
		ip = qi->qi_uquotaip;
		break;
	case XFS_DQTYPE_GROUP:
		ip = qi->qi_gquotaip;
		break;
	case XFS_DQTYPE_PROJ:
		ip = qi->qi_pquotaip;
		break;
	default:
		ASSERT(0);
		return -EINVAL;
	}
	if (!ip)
		return -ENOENT;

	error = xfs_trans_alloc_empty(sc->mp, &tp);
	if (error)
		return error;

	error = xfs_dqinode_load_parent(tp, &dp);
	if (error)
		goto out_cancel;

	error = xfs_dqinode_load(tp, dp, type, &ip);
	if (error)
		goto out_dp;

	xfs_trans_cancel(tp);
	tp = NULL;
	if (error)
		return error;

	path = kasprintf(GFP_KERNEL, "%s", xfs_dqinode_path(type));
	error = xchk_setup_metapath_scan(sc, dp, path, ip);
	error = xchk_setup_metapath_scan(sc, dp,
			kstrdup(xfs_dqinode_path(type), GFP_KERNEL), ip);

	xfs_irele(ip);
out_dp:
	xfs_irele(dp);
out_cancel:
	if (tp)
		xfs_trans_cancel(tp);
	return error;
}
#else