|
@@ -622,39 +622,14 @@ out:
|
|
|
return error;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-int
|
|
|
-xfs_qm_scall_getquota(
|
|
|
+/* Fill out the quota context. */
|
|
|
+static void
|
|
|
+xfs_qm_scall_getquota_fill_qc(
|
|
|
struct xfs_mount *mp,
|
|
|
- xfs_dqid_t *id,
|
|
|
uint type,
|
|
|
- struct qc_dqblk *dst,
|
|
|
- uint dqget_flags)
|
|
|
+ const struct xfs_dquot *dqp,
|
|
|
+ struct qc_dqblk *dst)
|
|
|
{
|
|
|
- struct xfs_dquot *dqp;
|
|
|
- int error;
|
|
|
-
|
|
|
- /*
|
|
|
- * Try to get the dquot. We don't want it allocated on disk, so
|
|
|
- * we aren't passing the XFS_QMOPT_DOALLOC flag. If it doesn't
|
|
|
- * exist, we'll get ENOENT back.
|
|
|
- */
|
|
|
- error = xfs_qm_dqget(mp, NULL, *id, type, dqget_flags, &dqp);
|
|
|
- if (error)
|
|
|
- return error;
|
|
|
-
|
|
|
- /*
|
|
|
- * If everything's NULL, this dquot doesn't quite exist as far as
|
|
|
- * our utility programs are concerned.
|
|
|
- */
|
|
|
- if (XFS_IS_DQUOT_UNINITIALIZED(dqp)) {
|
|
|
- error = -ENOENT;
|
|
|
- goto out_put;
|
|
|
- }
|
|
|
-
|
|
|
- /* Fill in the ID we actually read from disk */
|
|
|
- *id = be32_to_cpu(dqp->q_core.d_id);
|
|
|
-
|
|
|
memset(dst, 0, sizeof(*dst));
|
|
|
dst->d_spc_hardlimit =
|
|
|
XFS_FSB_TO_B(mp, be64_to_cpu(dqp->q_core.d_blk_hardlimit));
|
|
@@ -696,7 +671,7 @@ xfs_qm_scall_getquota(
|
|
|
if (((XFS_IS_UQUOTA_ENFORCED(mp) && type == XFS_DQ_USER) ||
|
|
|
(XFS_IS_GQUOTA_ENFORCED(mp) && type == XFS_DQ_GROUP) ||
|
|
|
(XFS_IS_PQUOTA_ENFORCED(mp) && type == XFS_DQ_PROJ)) &&
|
|
|
- *id != 0) {
|
|
|
+ dqp->q_core.d_id != 0) {
|
|
|
if ((dst->d_space > dst->d_spc_softlimit) &&
|
|
|
(dst->d_spc_softlimit > 0)) {
|
|
|
ASSERT(dst->d_spc_timer != 0);
|
|
@@ -707,11 +682,70 @@ xfs_qm_scall_getquota(
|
|
|
}
|
|
|
}
|
|
|
#endif
|
|
|
+}
|
|
|
+
|
|
|
+/* Return the quota information for the dquot matching id. */
|
|
|
+int
|
|
|
+xfs_qm_scall_getquota(
|
|
|
+ struct xfs_mount *mp,
|
|
|
+ xfs_dqid_t id,
|
|
|
+ uint type,
|
|
|
+ struct qc_dqblk *dst)
|
|
|
+{
|
|
|
+ struct xfs_dquot *dqp;
|
|
|
+ int error;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Try to get the dquot. We don't want it allocated on disk, so
|
|
|
+ * we aren't passing the XFS_QMOPT_DOALLOC flag. If it doesn't
|
|
|
+ * exist, we'll get ENOENT back.
|
|
|
+ */
|
|
|
+ error = xfs_qm_dqget(mp, NULL, id, type, 0, &dqp);
|
|
|
+ if (error)
|
|
|
+ return error;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * If everything's NULL, this dquot doesn't quite exist as far as
|
|
|
+ * our utility programs are concerned.
|
|
|
+ */
|
|
|
+ if (XFS_IS_DQUOT_UNINITIALIZED(dqp)) {
|
|
|
+ error = -ENOENT;
|
|
|
+ goto out_put;
|
|
|
+ }
|
|
|
+
|
|
|
+ xfs_qm_scall_getquota_fill_qc(mp, type, dqp, dst);
|
|
|
+
|
|
|
out_put:
|
|
|
xfs_qm_dqput(dqp);
|
|
|
return error;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Return the quota information for the first initialized dquot whose id
|
|
|
+ * is at least as high as id.
|
|
|
+ */
|
|
|
+int
|
|
|
+xfs_qm_scall_getquota_next(
|
|
|
+ struct xfs_mount *mp,
|
|
|
+ xfs_dqid_t *id,
|
|
|
+ uint type,
|
|
|
+ struct qc_dqblk *dst)
|
|
|
+{
|
|
|
+ struct xfs_dquot *dqp;
|
|
|
+ int error;
|
|
|
+
|
|
|
+ error = xfs_qm_dqget_next(mp, *id, type, &dqp);
|
|
|
+ if (error)
|
|
|
+ return error;
|
|
|
+
|
|
|
+ /* Fill in the ID we actually read from disk */
|
|
|
+ *id = be32_to_cpu(dqp->q_core.d_id);
|
|
|
+
|
|
|
+ xfs_qm_scall_getquota_fill_qc(mp, type, dqp, dst);
|
|
|
+
|
|
|
+ xfs_qm_dqput(dqp);
|
|
|
+ return error;
|
|
|
+}
|
|
|
|
|
|
STATIC int
|
|
|
xfs_dqrele_inode(
|