return error;
}
+/*
+ * Fill out the default quota limits for an ID that has no dquot on disk.
+ * Returns 0 if default limits are configured
+ * and were filled in, -ENOENT otherwise.
+ */
+static int
+xfs_qm_scall_getquota_fill_defaults(
+ struct xfs_mount *mp,
+ xfs_dqtype_t type,
+ struct qc_dqblk *dst)
+{
+ struct xfs_def_quota *defq;
+
+ defq = xfs_get_defquota(mp->m_quotainfo, type);
+
+ if (!defq->blk.soft && !defq->blk.hard &&
+ !defq->ino.soft && !defq->ino.hard &&
+ !defq->rtb.soft && !defq->rtb.hard) {
+ return -ENOENT;
+ }
+
+ memset(dst, 0, sizeof(*dst));
+ dst->d_spc_softlimit = XFS_FSB_TO_B(mp, defq->blk.soft);
+ dst->d_spc_hardlimit = XFS_FSB_TO_B(mp, defq->blk.hard);
+ dst->d_ino_softlimit = defq->ino.soft;
+ dst->d_ino_hardlimit = defq->ino.hard;
+ dst->d_rt_spc_softlimit = XFS_FSB_TO_B(mp, defq->rtb.soft);
+ dst->d_rt_spc_hardlimit = XFS_FSB_TO_B(mp, defq->rtb.hard);
+
+ return 0;
+}
+
/* Fill out the quota context. */
static void
xfs_qm_scall_getquota_fill_qc(
* set doalloc. If it doesn't exist, we'll get ENOENT back.
*/
error = xfs_qm_dqget(mp, id, type, false, &dqp);
- if (error)
+ if (error) {
+ /*
+ * If there is no dquot on disk and default limits are
+ * configured, return them with zero usage so that
+ * unprivileged users can see what limits apply to them.
+ */
+ if (error == -ENOENT && id != 0 &&
+ !xfs_qm_scall_getquota_fill_defaults(mp, type, dst))
+ return 0;
return error;
+ }
/*
* If everything's NULL, this dquot doesn't quite exist as far as