*
  * If XFS_QMOPT_DQALLOC is set, allocate a dquot on disk if it needed.
  */
-int
+static int
 xfs_qm_dqread(
        struct xfs_mount        *mp,
        xfs_dqid_t              id,
        return 0;
 }
 
+/*
+ * Given a dquot id and type, read and initialize a dquot from the on-disk
+ * metadata.  This function is only for use during quota initialization so
+ * it ignores the dquot cache assuming that the dquot shrinker isn't set up.
+ * The caller is responsible for _qm_dqdestroy'ing the returned dquot.
+ */
+int
+xfs_qm_dqget_uncached(
+       struct xfs_mount        *mp,
+       xfs_dqid_t              id,
+       uint                    type,
+       struct xfs_dquot        **dqpp)
+{
+       int                     error;
+
+       error = xfs_qm_dqget_checks(mp, type);
+       if (error)
+               return error;
+
+       return xfs_qm_dqread(mp, id, type, 0, dqpp);
+}
+
 /* Return the quota id for a given inode and type. */
 xfs_dqid_t
 xfs_qm_id_for_quotatype(
 
 #define XFS_QM_ISPDQ(dqp)      ((dqp)->dq_flags & XFS_DQ_PROJ)
 #define XFS_QM_ISGDQ(dqp)      ((dqp)->dq_flags & XFS_DQ_GROUP)
 
-extern int             xfs_qm_dqread(struct xfs_mount *, xfs_dqid_t, uint,
-                                       uint, struct xfs_dquot  **);
 extern void            xfs_qm_dqdestroy(xfs_dquot_t *);
 extern int             xfs_qm_dqflush(struct xfs_dquot *, struct xfs_buf **);
 extern void            xfs_qm_dqunpin_wait(xfs_dquot_t *);
                                        struct xfs_dquot **dqpp);
 extern int             xfs_qm_dqget_next(struct xfs_mount *mp, xfs_dqid_t id,
                                        uint type, struct xfs_dquot **dqpp);
+extern int             xfs_qm_dqget_uncached(struct xfs_mount *mp,
+                                       xfs_dqid_t id, uint type,
+                                       struct xfs_dquot **dqpp);
 extern void            xfs_qm_dqput(xfs_dquot_t *);
 
 extern void            xfs_dqlock2(struct xfs_dquot *, struct xfs_dquot *);
 
        struct xfs_def_quota    *defq;
        int                     error;
 
-       error = xfs_qm_dqread(mp, 0, type, 0, &dqp);
-
+       error = xfs_qm_dqget_uncached(mp, 0, type, &dqp);
        if (!error) {
                xfs_disk_dquot_t        *ddqp = &dqp->q_core;
 
  */
 STATIC int
 xfs_qm_init_quotainfo(
-       xfs_mount_t     *mp)
+       struct xfs_mount        *mp)
 {
-       xfs_quotainfo_t *qinf;
-       int             error;
-       xfs_dquot_t     *dqp;
+       struct xfs_quotainfo    *qinf;
+       struct xfs_dquot        *dqp;
+       uint                    type;
+       int                     error;
 
        ASSERT(XFS_IS_QUOTA_RUNNING(mp));
 
         * user/group/proj quota types, otherwise a default value is used.
         * This should be split into different fields per quota type.
         */
-       error = xfs_qm_dqread(mp, 0,
-                       XFS_IS_UQUOTA_RUNNING(mp) ? XFS_DQ_USER :
-                        (XFS_IS_GQUOTA_RUNNING(mp) ? XFS_DQ_GROUP :
-                         XFS_DQ_PROJ),
-                       0, &dqp);
-
+       if (XFS_IS_UQUOTA_RUNNING(mp))
+               type = XFS_DQ_USER;
+       else if (XFS_IS_GQUOTA_RUNNING(mp))
+               type = XFS_DQ_GROUP;
+       else
+               type = XFS_DQ_PROJ;
+       error = xfs_qm_dqget_uncached(mp, 0, type, &dqp);
        if (!error) {
                xfs_disk_dquot_t        *ddqp = &dqp->q_core;