mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-09 14:50:19 +00:00
[XFS] Fix uquota and oquota enforcement problems.
When uquota and oquota (gquota/pquota) are enabled for accounting both are enforced if ether has enforcement active. Conditions: - Both XFS_UQUOTA_ACCT and XFS_GQUOTA_ACCT are enabled. - Either XFS_UQUOTA_ENFD or XFS_OQUOTA_ENFD is enabled. - The usage without enforce is reached at the soft limit. Problems: 1. "repquota" shows all grace time even if no enforcement. 2. we cannot make a file over a hard limits even if no enforcement. SGI-PV: 962291 SGI-Modid: xfs-linux-melb:xfs-kern:28272a Signed-off-by: Kouta Ooizumi <k-ooizumi@tnes.nec.co.jp> Signed-off-by: Donald Douwsma <donaldd@sgi.com> Signed-off-by: Tim Shimmin <tes@sgi.com>
This commit is contained in:
parent
d3cf209476
commit
e6d29426bc
@ -909,14 +909,19 @@ xfs_qm_export_dquot(
|
|||||||
* gets turned off. No need to confuse the user level code,
|
* gets turned off. No need to confuse the user level code,
|
||||||
* so return zeroes in that case.
|
* so return zeroes in that case.
|
||||||
*/
|
*/
|
||||||
if (! XFS_IS_QUOTA_ENFORCED(mp)) {
|
if ((!XFS_IS_UQUOTA_ENFORCED(mp) && src->d_flags == XFS_DQ_USER) ||
|
||||||
|
(!XFS_IS_OQUOTA_ENFORCED(mp) &&
|
||||||
|
(src->d_flags & (XFS_DQ_PROJ | XFS_DQ_GROUP)))) {
|
||||||
dst->d_btimer = 0;
|
dst->d_btimer = 0;
|
||||||
dst->d_itimer = 0;
|
dst->d_itimer = 0;
|
||||||
dst->d_rtbtimer = 0;
|
dst->d_rtbtimer = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
if (XFS_IS_QUOTA_ENFORCED(mp) && dst->d_id != 0) {
|
if (((XFS_IS_UQUOTA_ENFORCED(mp) && dst->d_flags == XFS_USER_QUOTA) ||
|
||||||
|
(XFS_IS_OQUOTA_ENFORCED(mp) &&
|
||||||
|
(dst->d_flags & (XFS_PROJ_QUOTA | XFS_GROUP_QUOTA)))) &&
|
||||||
|
dst->d_id != 0) {
|
||||||
if (((int) dst->d_bcount >= (int) dst->d_blk_softlimit) &&
|
if (((int) dst->d_bcount >= (int) dst->d_blk_softlimit) &&
|
||||||
(dst->d_blk_softlimit > 0)) {
|
(dst->d_blk_softlimit > 0)) {
|
||||||
ASSERT(dst->d_btimer != 0);
|
ASSERT(dst->d_btimer != 0);
|
||||||
|
@ -656,7 +656,9 @@ xfs_trans_dqresv(
|
|||||||
|
|
||||||
if ((flags & XFS_QMOPT_FORCE_RES) == 0 &&
|
if ((flags & XFS_QMOPT_FORCE_RES) == 0 &&
|
||||||
dqp->q_core.d_id &&
|
dqp->q_core.d_id &&
|
||||||
XFS_IS_QUOTA_ENFORCED(dqp->q_mount)) {
|
((XFS_IS_UQUOTA_ENFORCED(dqp->q_mount) && XFS_QM_ISUDQ(dqp)) ||
|
||||||
|
(XFS_IS_OQUOTA_ENFORCED(dqp->q_mount) &&
|
||||||
|
(XFS_QM_ISPDQ(dqp) || XFS_QM_ISGDQ(dqp))))) {
|
||||||
#ifdef QUOTADEBUG
|
#ifdef QUOTADEBUG
|
||||||
cmn_err(CE_DEBUG, "BLK Res: nblks=%ld + resbcount=%Ld"
|
cmn_err(CE_DEBUG, "BLK Res: nblks=%ld + resbcount=%Ld"
|
||||||
" > hardlimit=%Ld?", nblks, *resbcountp, hardlimit);
|
" > hardlimit=%Ld?", nblks, *resbcountp, hardlimit);
|
||||||
|
@ -154,10 +154,11 @@ typedef struct xfs_qoff_logformat {
|
|||||||
#define XFS_ALL_QUOTA_CHKD (XFS_UQUOTA_CHKD | XFS_OQUOTA_CHKD)
|
#define XFS_ALL_QUOTA_CHKD (XFS_UQUOTA_CHKD | XFS_OQUOTA_CHKD)
|
||||||
|
|
||||||
#define XFS_IS_QUOTA_RUNNING(mp) ((mp)->m_qflags & XFS_ALL_QUOTA_ACCT)
|
#define XFS_IS_QUOTA_RUNNING(mp) ((mp)->m_qflags & XFS_ALL_QUOTA_ACCT)
|
||||||
#define XFS_IS_QUOTA_ENFORCED(mp) ((mp)->m_qflags & XFS_ALL_QUOTA_ENFD)
|
|
||||||
#define XFS_IS_UQUOTA_RUNNING(mp) ((mp)->m_qflags & XFS_UQUOTA_ACCT)
|
#define XFS_IS_UQUOTA_RUNNING(mp) ((mp)->m_qflags & XFS_UQUOTA_ACCT)
|
||||||
#define XFS_IS_PQUOTA_RUNNING(mp) ((mp)->m_qflags & XFS_PQUOTA_ACCT)
|
#define XFS_IS_PQUOTA_RUNNING(mp) ((mp)->m_qflags & XFS_PQUOTA_ACCT)
|
||||||
#define XFS_IS_GQUOTA_RUNNING(mp) ((mp)->m_qflags & XFS_GQUOTA_ACCT)
|
#define XFS_IS_GQUOTA_RUNNING(mp) ((mp)->m_qflags & XFS_GQUOTA_ACCT)
|
||||||
|
#define XFS_IS_UQUOTA_ENFORCED(mp) ((mp)->m_qflags & XFS_UQUOTA_ENFD)
|
||||||
|
#define XFS_IS_OQUOTA_ENFORCED(mp) ((mp)->m_qflags & XFS_OQUOTA_ENFD)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Incore only flags for quotaoff - these bits get cleared when quota(s)
|
* Incore only flags for quotaoff - these bits get cleared when quota(s)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user