diff options
Diffstat (limited to 'fs/xfs/quota/xfs_trans_dquot.c')
| -rw-r--r-- | fs/xfs/quota/xfs_trans_dquot.c | 49 |
1 files changed, 32 insertions, 17 deletions
diff --git a/fs/xfs/quota/xfs_trans_dquot.c b/fs/xfs/quota/xfs_trans_dquot.c index 97ac9640be98..c3ab75cb1d9a 100644 --- a/fs/xfs/quota/xfs_trans_dquot.c +++ b/fs/xfs/quota/xfs_trans_dquot.c | |||
| @@ -589,12 +589,18 @@ xfs_trans_unreserve_and_mod_dquots( | |||
| 589 | } | 589 | } |
| 590 | } | 590 | } |
| 591 | 591 | ||
| 592 | STATIC int | 592 | STATIC void |
| 593 | xfs_quota_error(uint flags) | 593 | xfs_quota_warn( |
| 594 | struct xfs_mount *mp, | ||
| 595 | struct xfs_dquot *dqp, | ||
| 596 | int type) | ||
| 594 | { | 597 | { |
| 595 | if (flags & XFS_QMOPT_ENOSPC) | 598 | /* no warnings for project quotas - we just return ENOSPC later */ |
| 596 | return ENOSPC; | 599 | if (dqp->dq_flags & XFS_DQ_PROJ) |
| 597 | return EDQUOT; | 600 | return; |
| 601 | quota_send_warning((dqp->dq_flags & XFS_DQ_USER) ? USRQUOTA : GRPQUOTA, | ||
| 602 | be32_to_cpu(dqp->q_core.d_id), mp->m_super->s_dev, | ||
| 603 | type); | ||
| 598 | } | 604 | } |
| 599 | 605 | ||
| 600 | /* | 606 | /* |
| @@ -612,7 +618,6 @@ xfs_trans_dqresv( | |||
| 612 | long ninos, | 618 | long ninos, |
| 613 | uint flags) | 619 | uint flags) |
| 614 | { | 620 | { |
| 615 | int error; | ||
| 616 | xfs_qcnt_t hardlimit; | 621 | xfs_qcnt_t hardlimit; |
| 617 | xfs_qcnt_t softlimit; | 622 | xfs_qcnt_t softlimit; |
| 618 | time_t timer; | 623 | time_t timer; |
| @@ -649,7 +654,6 @@ xfs_trans_dqresv( | |||
| 649 | warnlimit = XFS_QI_RTBWARNLIMIT(dqp->q_mount); | 654 | warnlimit = XFS_QI_RTBWARNLIMIT(dqp->q_mount); |
| 650 | resbcountp = &dqp->q_res_rtbcount; | 655 | resbcountp = &dqp->q_res_rtbcount; |
| 651 | } | 656 | } |
| 652 | error = 0; | ||
| 653 | 657 | ||
| 654 | if ((flags & XFS_QMOPT_FORCE_RES) == 0 && | 658 | if ((flags & XFS_QMOPT_FORCE_RES) == 0 && |
| 655 | dqp->q_core.d_id && | 659 | dqp->q_core.d_id && |
| @@ -667,18 +671,20 @@ xfs_trans_dqresv( | |||
| 667 | * nblks. | 671 | * nblks. |
| 668 | */ | 672 | */ |
| 669 | if (hardlimit > 0ULL && | 673 | if (hardlimit > 0ULL && |
| 670 | (hardlimit <= nblks + *resbcountp)) { | 674 | hardlimit <= nblks + *resbcountp) { |
| 671 | error = xfs_quota_error(flags); | 675 | xfs_quota_warn(mp, dqp, QUOTA_NL_BHARDWARN); |
| 672 | goto error_return; | 676 | goto error_return; |
| 673 | } | 677 | } |
| 674 | |||
| 675 | if (softlimit > 0ULL && | 678 | if (softlimit > 0ULL && |
| 676 | (softlimit <= nblks + *resbcountp)) { | 679 | softlimit <= nblks + *resbcountp) { |
| 677 | if ((timer != 0 && get_seconds() > timer) || | 680 | if ((timer != 0 && get_seconds() > timer) || |
| 678 | (warns != 0 && warns >= warnlimit)) { | 681 | (warns != 0 && warns >= warnlimit)) { |
| 679 | error = xfs_quota_error(flags); | 682 | xfs_quota_warn(mp, dqp, |
| 683 | QUOTA_NL_BSOFTLONGWARN); | ||
| 680 | goto error_return; | 684 | goto error_return; |
| 681 | } | 685 | } |
| 686 | |||
| 687 | xfs_quota_warn(mp, dqp, QUOTA_NL_BSOFTWARN); | ||
| 682 | } | 688 | } |
| 683 | } | 689 | } |
| 684 | if (ninos > 0) { | 690 | if (ninos > 0) { |
| @@ -692,15 +698,19 @@ xfs_trans_dqresv( | |||
| 692 | softlimit = be64_to_cpu(dqp->q_core.d_ino_softlimit); | 698 | softlimit = be64_to_cpu(dqp->q_core.d_ino_softlimit); |
| 693 | if (!softlimit) | 699 | if (!softlimit) |
| 694 | softlimit = q->qi_isoftlimit; | 700 | softlimit = q->qi_isoftlimit; |
| 701 | |||
| 695 | if (hardlimit > 0ULL && count >= hardlimit) { | 702 | if (hardlimit > 0ULL && count >= hardlimit) { |
| 696 | error = xfs_quota_error(flags); | 703 | xfs_quota_warn(mp, dqp, QUOTA_NL_IHARDWARN); |
| 697 | goto error_return; | 704 | goto error_return; |
| 698 | } else if (softlimit > 0ULL && count >= softlimit) { | 705 | } |
| 699 | if ((timer != 0 && get_seconds() > timer) || | 706 | if (softlimit > 0ULL && count >= softlimit) { |
| 707 | if ((timer != 0 && get_seconds() > timer) || | ||
| 700 | (warns != 0 && warns >= warnlimit)) { | 708 | (warns != 0 && warns >= warnlimit)) { |
| 701 | error = xfs_quota_error(flags); | 709 | xfs_quota_warn(mp, dqp, |
| 710 | QUOTA_NL_ISOFTLONGWARN); | ||
| 702 | goto error_return; | 711 | goto error_return; |
| 703 | } | 712 | } |
| 713 | xfs_quota_warn(mp, dqp, QUOTA_NL_ISOFTWARN); | ||
| 704 | } | 714 | } |
| 705 | } | 715 | } |
| 706 | } | 716 | } |
| @@ -736,9 +746,14 @@ xfs_trans_dqresv( | |||
| 736 | ASSERT(dqp->q_res_rtbcount >= be64_to_cpu(dqp->q_core.d_rtbcount)); | 746 | ASSERT(dqp->q_res_rtbcount >= be64_to_cpu(dqp->q_core.d_rtbcount)); |
| 737 | ASSERT(dqp->q_res_icount >= be64_to_cpu(dqp->q_core.d_icount)); | 747 | ASSERT(dqp->q_res_icount >= be64_to_cpu(dqp->q_core.d_icount)); |
| 738 | 748 | ||
| 749 | xfs_dqunlock(dqp); | ||
| 750 | return 0; | ||
| 751 | |||
| 739 | error_return: | 752 | error_return: |
| 740 | xfs_dqunlock(dqp); | 753 | xfs_dqunlock(dqp); |
| 741 | return error; | 754 | if (flags & XFS_QMOPT_ENOSPC) |
| 755 | return ENOSPC; | ||
| 756 | return EDQUOT; | ||
| 742 | } | 757 | } |
| 743 | 758 | ||
| 744 | 759 | ||
