|
@@ -560,6 +560,37 @@ xfs_qm_shrink_count(
|
|
return list_lru_shrink_count(&qi->qi_lru, sc);
|
|
return list_lru_shrink_count(&qi->qi_lru, sc);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+STATIC void
|
|
|
|
+xfs_qm_set_defquota(
|
|
|
|
+ xfs_mount_t *mp,
|
|
|
|
+ uint type,
|
|
|
|
+ xfs_quotainfo_t *qinf)
|
|
|
|
+{
|
|
|
|
+ xfs_dquot_t *dqp;
|
|
|
|
+ struct xfs_def_quota *defq;
|
|
|
|
+ int error;
|
|
|
|
+
|
|
|
|
+ error = xfs_qm_dqread(mp, 0, type, XFS_QMOPT_DOWARN, &dqp);
|
|
|
|
+
|
|
|
|
+ if (!error) {
|
|
|
|
+ xfs_disk_dquot_t *ddqp = &dqp->q_core;
|
|
|
|
+
|
|
|
|
+ defq = xfs_get_defquota(dqp, qinf);
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Timers and warnings have been already set, let's just set the
|
|
|
|
+ * default limits for this quota type
|
|
|
|
+ */
|
|
|
|
+ defq->bhardlimit = be64_to_cpu(ddqp->d_blk_hardlimit);
|
|
|
|
+ defq->bsoftlimit = be64_to_cpu(ddqp->d_blk_softlimit);
|
|
|
|
+ defq->ihardlimit = be64_to_cpu(ddqp->d_ino_hardlimit);
|
|
|
|
+ defq->isoftlimit = be64_to_cpu(ddqp->d_ino_softlimit);
|
|
|
|
+ defq->rtbhardlimit = be64_to_cpu(ddqp->d_rtb_hardlimit);
|
|
|
|
+ defq->rtbsoftlimit = be64_to_cpu(ddqp->d_rtb_softlimit);
|
|
|
|
+ xfs_qm_dqdestroy(dqp);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* This initializes all the quota information that's kept in the
|
|
* This initializes all the quota information that's kept in the
|
|
* mount structure
|
|
* mount structure
|
|
@@ -606,19 +637,19 @@ xfs_qm_init_quotainfo(
|
|
* We try to get the limits from the superuser's limits fields.
|
|
* We try to get the limits from the superuser's limits fields.
|
|
* This is quite hacky, but it is standard quota practice.
|
|
* This is quite hacky, but it is standard quota practice.
|
|
*
|
|
*
|
|
- * We look at the USR dquot with id == 0 first, but if user quotas
|
|
|
|
- * are not enabled we goto the GRP dquot with id == 0.
|
|
|
|
- * We don't really care to keep separate default limits for user
|
|
|
|
- * and group quotas, at least not at this point.
|
|
|
|
- *
|
|
|
|
* Since we may not have done a quotacheck by this point, just read
|
|
* Since we may not have done a quotacheck by this point, just read
|
|
* the dquot without attaching it to any hashtables or lists.
|
|
* the dquot without attaching it to any hashtables or lists.
|
|
|
|
+ *
|
|
|
|
+ * Timers and warnings are globally set by the first timer found in
|
|
|
|
+ * 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,
|
|
error = xfs_qm_dqread(mp, 0,
|
|
XFS_IS_UQUOTA_RUNNING(mp) ? XFS_DQ_USER :
|
|
XFS_IS_UQUOTA_RUNNING(mp) ? XFS_DQ_USER :
|
|
(XFS_IS_GQUOTA_RUNNING(mp) ? XFS_DQ_GROUP :
|
|
(XFS_IS_GQUOTA_RUNNING(mp) ? XFS_DQ_GROUP :
|
|
XFS_DQ_PROJ),
|
|
XFS_DQ_PROJ),
|
|
XFS_QMOPT_DOWARN, &dqp);
|
|
XFS_QMOPT_DOWARN, &dqp);
|
|
|
|
+
|
|
if (!error) {
|
|
if (!error) {
|
|
xfs_disk_dquot_t *ddqp = &dqp->q_core;
|
|
xfs_disk_dquot_t *ddqp = &dqp->q_core;
|
|
|
|
|
|
@@ -639,13 +670,6 @@ xfs_qm_init_quotainfo(
|
|
be16_to_cpu(ddqp->d_iwarns) : XFS_QM_IWARNLIMIT;
|
|
be16_to_cpu(ddqp->d_iwarns) : XFS_QM_IWARNLIMIT;
|
|
qinf->qi_rtbwarnlimit = ddqp->d_rtbwarns ?
|
|
qinf->qi_rtbwarnlimit = ddqp->d_rtbwarns ?
|
|
be16_to_cpu(ddqp->d_rtbwarns) : XFS_QM_RTBWARNLIMIT;
|
|
be16_to_cpu(ddqp->d_rtbwarns) : XFS_QM_RTBWARNLIMIT;
|
|
- qinf->qi_bhardlimit = be64_to_cpu(ddqp->d_blk_hardlimit);
|
|
|
|
- qinf->qi_bsoftlimit = be64_to_cpu(ddqp->d_blk_softlimit);
|
|
|
|
- qinf->qi_ihardlimit = be64_to_cpu(ddqp->d_ino_hardlimit);
|
|
|
|
- qinf->qi_isoftlimit = be64_to_cpu(ddqp->d_ino_softlimit);
|
|
|
|
- qinf->qi_rtbhardlimit = be64_to_cpu(ddqp->d_rtb_hardlimit);
|
|
|
|
- qinf->qi_rtbsoftlimit = be64_to_cpu(ddqp->d_rtb_softlimit);
|
|
|
|
-
|
|
|
|
xfs_qm_dqdestroy(dqp);
|
|
xfs_qm_dqdestroy(dqp);
|
|
} else {
|
|
} else {
|
|
qinf->qi_btimelimit = XFS_QM_BTIMELIMIT;
|
|
qinf->qi_btimelimit = XFS_QM_BTIMELIMIT;
|
|
@@ -656,6 +680,13 @@ xfs_qm_init_quotainfo(
|
|
qinf->qi_rtbwarnlimit = XFS_QM_RTBWARNLIMIT;
|
|
qinf->qi_rtbwarnlimit = XFS_QM_RTBWARNLIMIT;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (XFS_IS_UQUOTA_RUNNING(mp))
|
|
|
|
+ xfs_qm_set_defquota(mp, XFS_DQ_USER, qinf);
|
|
|
|
+ if (XFS_IS_GQUOTA_RUNNING(mp))
|
|
|
|
+ xfs_qm_set_defquota(mp, XFS_DQ_GROUP, qinf);
|
|
|
|
+ if (XFS_IS_PQUOTA_RUNNING(mp))
|
|
|
|
+ xfs_qm_set_defquota(mp, XFS_DQ_PROJ, qinf);
|
|
|
|
+
|
|
qinf->qi_shrinker.count_objects = xfs_qm_shrink_count;
|
|
qinf->qi_shrinker.count_objects = xfs_qm_shrink_count;
|
|
qinf->qi_shrinker.scan_objects = xfs_qm_shrink_scan;
|
|
qinf->qi_shrinker.scan_objects = xfs_qm_shrink_scan;
|
|
qinf->qi_shrinker.seeks = DEFAULT_SEEKS;
|
|
qinf->qi_shrinker.seeks = DEFAULT_SEEKS;
|