summaryrefslogtreecommitdiffstats
path: root/fs/xfs
diff options
context:
space:
mode:
authorDarrick J. Wong <djwong@kernel.org>2024-12-02 10:57:24 -0800
committerDarrick J. Wong <djwong@kernel.org>2024-12-12 17:45:08 -0800
commit9b7280010366dbe32791acd498a37dc522f568db (patch)
treee552cd7f9ada092fe8faea688af5ff89e051ad9f /fs/xfs
parenta440a28ddbdcb861150987b4d6e828631656b92f (diff)
downloadlinux-stable-9b7280010366dbe32791acd498a37dc522f568db.tar.gz
linux-stable-9b7280010366dbe32791acd498a37dc522f568db.tar.bz2
linux-stable-9b7280010366dbe32791acd498a37dc522f568db.zip
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: 128a055291ebbc ("xfs: scrub quota file metapaths") Signed-off-by: "Darrick J. Wong" <djwong@kernel.org> Reviewed-by: Christoph Hellwig <hch@lst.de>
Diffstat (limited to 'fs/xfs')
-rw-r--r--fs/xfs/scrub/metapath.c41
1 files changed, 25 insertions, 16 deletions
diff --git a/fs/xfs/scrub/metapath.c b/fs/xfs/scrub/metapath.c
index b78db6513465..80467d6bc763 100644
--- a/fs/xfs/scrub/metapath.c
+++ b/fs/xfs/scrub/metapath.c
@@ -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