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