diff options
Diffstat (limited to 'fs/xfs/quota/xfs_trans_dquot.c')
-rw-r--r-- | fs/xfs/quota/xfs_trans_dquot.c | 60 |
1 files changed, 29 insertions, 31 deletions
diff --git a/fs/xfs/quota/xfs_trans_dquot.c b/fs/xfs/quota/xfs_trans_dquot.c index 149b2a1fd949..3b99daf8a640 100644 --- a/fs/xfs/quota/xfs_trans_dquot.c +++ b/fs/xfs/quota/xfs_trans_dquot.c | |||
@@ -187,7 +187,7 @@ xfs_trans_dup_dqinfo( | |||
187 | /* | 187 | /* |
188 | * Wrap around mod_dquot to account for both user and group quotas. | 188 | * Wrap around mod_dquot to account for both user and group quotas. |
189 | */ | 189 | */ |
190 | void | 190 | STATIC void |
191 | xfs_trans_mod_dquot_byino( | 191 | xfs_trans_mod_dquot_byino( |
192 | xfs_trans_t *tp, | 192 | xfs_trans_t *tp, |
193 | xfs_inode_t *ip, | 193 | xfs_inode_t *ip, |
@@ -207,12 +207,10 @@ xfs_trans_mod_dquot_byino( | |||
207 | if (tp->t_dqinfo == NULL) | 207 | if (tp->t_dqinfo == NULL) |
208 | xfs_trans_alloc_dqinfo(tp); | 208 | xfs_trans_alloc_dqinfo(tp); |
209 | 209 | ||
210 | if (XFS_IS_UQUOTA_ON(mp) && ip->i_udquot) { | 210 | if (XFS_IS_UQUOTA_ON(mp) && ip->i_udquot) |
211 | (void) xfs_trans_mod_dquot(tp, ip->i_udquot, field, delta); | 211 | (void) xfs_trans_mod_dquot(tp, ip->i_udquot, field, delta); |
212 | } | 212 | if (XFS_IS_OQUOTA_ON(mp) && ip->i_gdquot) |
213 | if (XFS_IS_GQUOTA_ON(mp) && ip->i_gdquot) { | ||
214 | (void) xfs_trans_mod_dquot(tp, ip->i_gdquot, field, delta); | 213 | (void) xfs_trans_mod_dquot(tp, ip->i_gdquot, field, delta); |
215 | } | ||
216 | } | 214 | } |
217 | 215 | ||
218 | STATIC xfs_dqtrx_t * | 216 | STATIC xfs_dqtrx_t * |
@@ -368,7 +366,7 @@ xfs_trans_dqlockedjoin( | |||
368 | * Unreserve just the reservations done by this transaction. | 366 | * Unreserve just the reservations done by this transaction. |
369 | * dquot is still left locked at exit. | 367 | * dquot is still left locked at exit. |
370 | */ | 368 | */ |
371 | void | 369 | STATIC void |
372 | xfs_trans_apply_dquot_deltas( | 370 | xfs_trans_apply_dquot_deltas( |
373 | xfs_trans_t *tp) | 371 | xfs_trans_t *tp) |
374 | { | 372 | { |
@@ -499,7 +497,7 @@ xfs_trans_apply_dquot_deltas( | |||
499 | * Adjust the RT reservation. | 497 | * Adjust the RT reservation. |
500 | */ | 498 | */ |
501 | if (qtrx->qt_rtblk_res != 0) { | 499 | if (qtrx->qt_rtblk_res != 0) { |
502 | if (qtrx->qt_blk_res != qtrx->qt_blk_res_used) { | 500 | if (qtrx->qt_rtblk_res != qtrx->qt_rtblk_res_used) { |
503 | if (qtrx->qt_rtblk_res > | 501 | if (qtrx->qt_rtblk_res > |
504 | qtrx->qt_rtblk_res_used) | 502 | qtrx->qt_rtblk_res_used) |
505 | dqp->q_res_rtbcount -= (xfs_qcnt_t) | 503 | dqp->q_res_rtbcount -= (xfs_qcnt_t) |
@@ -532,12 +530,6 @@ xfs_trans_apply_dquot_deltas( | |||
532 | (xfs_qcnt_t)qtrx->qt_icount_delta; | 530 | (xfs_qcnt_t)qtrx->qt_icount_delta; |
533 | } | 531 | } |
534 | 532 | ||
535 | |||
536 | #ifdef QUOTADEBUG | ||
537 | if (qtrx->qt_rtblk_res != 0) | ||
538 | cmn_err(CE_DEBUG, "RT res %d for 0x%p\n", | ||
539 | (int) qtrx->qt_rtblk_res, dqp); | ||
540 | #endif | ||
541 | ASSERT(dqp->q_res_bcount >= | 533 | ASSERT(dqp->q_res_bcount >= |
542 | INT_GET(dqp->q_core.d_bcount, ARCH_CONVERT)); | 534 | INT_GET(dqp->q_core.d_bcount, ARCH_CONVERT)); |
543 | ASSERT(dqp->q_res_icount >= | 535 | ASSERT(dqp->q_res_icount >= |
@@ -638,7 +630,10 @@ xfs_trans_dqresv( | |||
638 | int error; | 630 | int error; |
639 | xfs_qcnt_t hardlimit; | 631 | xfs_qcnt_t hardlimit; |
640 | xfs_qcnt_t softlimit; | 632 | xfs_qcnt_t softlimit; |
641 | time_t btimer; | 633 | time_t timer; |
634 | xfs_qwarncnt_t warns; | ||
635 | xfs_qwarncnt_t warnlimit; | ||
636 | xfs_qcnt_t count; | ||
642 | xfs_qcnt_t *resbcountp; | 637 | xfs_qcnt_t *resbcountp; |
643 | xfs_quotainfo_t *q = mp->m_quotainfo; | 638 | xfs_quotainfo_t *q = mp->m_quotainfo; |
644 | 639 | ||
@@ -653,7 +648,9 @@ xfs_trans_dqresv( | |||
653 | softlimit = INT_GET(dqp->q_core.d_blk_softlimit, ARCH_CONVERT); | 648 | softlimit = INT_GET(dqp->q_core.d_blk_softlimit, ARCH_CONVERT); |
654 | if (!softlimit) | 649 | if (!softlimit) |
655 | softlimit = q->qi_bsoftlimit; | 650 | softlimit = q->qi_bsoftlimit; |
656 | btimer = INT_GET(dqp->q_core.d_btimer, ARCH_CONVERT); | 651 | timer = INT_GET(dqp->q_core.d_btimer, ARCH_CONVERT); |
652 | warns = INT_GET(dqp->q_core.d_bwarns, ARCH_CONVERT); | ||
653 | warnlimit = XFS_QI_BWARNLIMIT(dqp->q_mount); | ||
657 | resbcountp = &dqp->q_res_bcount; | 654 | resbcountp = &dqp->q_res_bcount; |
658 | } else { | 655 | } else { |
659 | ASSERT(flags & XFS_TRANS_DQ_RES_RTBLKS); | 656 | ASSERT(flags & XFS_TRANS_DQ_RES_RTBLKS); |
@@ -663,7 +660,9 @@ xfs_trans_dqresv( | |||
663 | softlimit = INT_GET(dqp->q_core.d_rtb_softlimit, ARCH_CONVERT); | 660 | softlimit = INT_GET(dqp->q_core.d_rtb_softlimit, ARCH_CONVERT); |
664 | if (!softlimit) | 661 | if (!softlimit) |
665 | softlimit = q->qi_rtbsoftlimit; | 662 | softlimit = q->qi_rtbsoftlimit; |
666 | btimer = INT_GET(dqp->q_core.d_rtbtimer, ARCH_CONVERT); | 663 | timer = INT_GET(dqp->q_core.d_rtbtimer, ARCH_CONVERT); |
664 | warns = INT_GET(dqp->q_core.d_rtbwarns, ARCH_CONVERT); | ||
665 | warnlimit = XFS_QI_RTBWARNLIMIT(dqp->q_mount); | ||
667 | resbcountp = &dqp->q_res_rtbcount; | 666 | resbcountp = &dqp->q_res_rtbcount; |
668 | } | 667 | } |
669 | error = 0; | 668 | error = 0; |
@@ -693,37 +692,36 @@ xfs_trans_dqresv( | |||
693 | * If timer or warnings has expired, | 692 | * If timer or warnings has expired, |
694 | * return EDQUOT | 693 | * return EDQUOT |
695 | */ | 694 | */ |
696 | if ((btimer != 0 && get_seconds() > btimer) || | 695 | if ((timer != 0 && get_seconds() > timer) || |
697 | (dqp->q_core.d_bwarns && | 696 | (warns != 0 && warns >= warnlimit)) { |
698 | INT_GET(dqp->q_core.d_bwarns, ARCH_CONVERT) >= | ||
699 | XFS_QI_BWARNLIMIT(dqp->q_mount))) { | ||
700 | error = EDQUOT; | 697 | error = EDQUOT; |
701 | goto error_return; | 698 | goto error_return; |
702 | } | 699 | } |
703 | } | 700 | } |
704 | } | 701 | } |
705 | if (ninos > 0) { | 702 | if (ninos > 0) { |
706 | hardlimit = INT_GET(dqp->q_core.d_ino_hardlimit, ARCH_CONVERT); | 703 | count = INT_GET(dqp->q_core.d_icount, ARCH_CONVERT); |
704 | timer = INT_GET(dqp->q_core.d_itimer, ARCH_CONVERT); | ||
705 | warns = INT_GET(dqp->q_core.d_iwarns, ARCH_CONVERT); | ||
706 | warnlimit = XFS_QI_IWARNLIMIT(dqp->q_mount); | ||
707 | hardlimit = INT_GET(dqp->q_core.d_ino_hardlimit, | ||
708 | ARCH_CONVERT); | ||
707 | if (!hardlimit) | 709 | if (!hardlimit) |
708 | hardlimit = q->qi_ihardlimit; | 710 | hardlimit = q->qi_ihardlimit; |
709 | softlimit = INT_GET(dqp->q_core.d_ino_softlimit, ARCH_CONVERT); | 711 | softlimit = INT_GET(dqp->q_core.d_ino_softlimit, |
712 | ARCH_CONVERT); | ||
710 | if (!softlimit) | 713 | if (!softlimit) |
711 | softlimit = q->qi_isoftlimit; | 714 | softlimit = q->qi_isoftlimit; |
712 | if (hardlimit > 0ULL && | 715 | if (hardlimit > 0ULL && count >= hardlimit) { |
713 | INT_GET(dqp->q_core.d_icount, ARCH_CONVERT) >= hardlimit) { | ||
714 | error = EDQUOT; | 716 | error = EDQUOT; |
715 | goto error_return; | 717 | goto error_return; |
716 | } else if (softlimit > 0ULL && | 718 | } else if (softlimit > 0ULL && count >= softlimit) { |
717 | INT_GET(dqp->q_core.d_icount, ARCH_CONVERT) >= softlimit) { | ||
718 | /* | 719 | /* |
719 | * If timer or warnings has expired, | 720 | * If timer or warnings has expired, |
720 | * return EDQUOT | 721 | * return EDQUOT |
721 | */ | 722 | */ |
722 | if ((dqp->q_core.d_itimer && | 723 | if ((timer != 0 && get_seconds() > timer) || |
723 | get_seconds() > INT_GET(dqp->q_core.d_itimer, ARCH_CONVERT)) || | 724 | (warns != 0 && warns >= warnlimit)) { |
724 | (dqp->q_core.d_iwarns && | ||
725 | INT_GET(dqp->q_core.d_iwarns, ARCH_CONVERT) >= | ||
726 | XFS_QI_IWARNLIMIT(dqp->q_mount))) { | ||
727 | error = EDQUOT; | 725 | error = EDQUOT; |
728 | goto error_return; | 726 | goto error_return; |
729 | } | 727 | } |