Merge tag 'kbuild-v5.15' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy...
[linux-2.6-microblaze.git] / fs / xfs / xfs_qm.c
index fe341f3..5608066 100644 (file)
@@ -157,7 +157,7 @@ xfs_qm_dqpurge(
        }
 
        ASSERT(atomic_read(&dqp->q_pincount) == 0);
-       ASSERT(XFS_FORCED_SHUTDOWN(mp) ||
+       ASSERT(xfs_is_shutdown(mp) ||
                !test_bit(XFS_LI_IN_AIL, &dqp->q_logitem.qli_item.li_flags));
 
        xfs_dqfunlock(dqp);
@@ -185,17 +185,13 @@ out_unlock:
 /*
  * Purge the dquot cache.
  */
-void
+static void
 xfs_qm_dqpurge_all(
-       struct xfs_mount        *mp,
-       uint                    flags)
+       struct xfs_mount        *mp)
 {
-       if (flags & XFS_QMOPT_UQUOTA)
-               xfs_qm_dquot_walk(mp, XFS_DQTYPE_USER, xfs_qm_dqpurge, NULL);
-       if (flags & XFS_QMOPT_GQUOTA)
-               xfs_qm_dquot_walk(mp, XFS_DQTYPE_GROUP, xfs_qm_dqpurge, NULL);
-       if (flags & XFS_QMOPT_PQUOTA)
-               xfs_qm_dquot_walk(mp, XFS_DQTYPE_PROJ, xfs_qm_dqpurge, NULL);
+       xfs_qm_dquot_walk(mp, XFS_DQTYPE_USER, xfs_qm_dqpurge, NULL);
+       xfs_qm_dquot_walk(mp, XFS_DQTYPE_GROUP, xfs_qm_dqpurge, NULL);
+       xfs_qm_dquot_walk(mp, XFS_DQTYPE_PROJ, xfs_qm_dqpurge, NULL);
 }
 
 /*
@@ -206,7 +202,7 @@ xfs_qm_unmount(
        struct xfs_mount        *mp)
 {
        if (mp->m_quotainfo) {
-               xfs_qm_dqpurge_all(mp, XFS_QMOPT_QUOTALL);
+               xfs_qm_dqpurge_all(mp);
                xfs_qm_destroy_quotainfo(mp);
        }
 }
@@ -299,8 +295,6 @@ xfs_qm_need_dqattach(
 {
        struct xfs_mount        *mp = ip->i_mount;
 
-       if (!XFS_IS_QUOTA_RUNNING(mp))
-               return false;
        if (!XFS_IS_QUOTA_ON(mp))
                return false;
        if (!XFS_NOT_DQATTACHED(mp, ip))
@@ -635,7 +629,7 @@ xfs_qm_init_quotainfo(
        struct xfs_quotainfo    *qinf;
        int                     error;
 
-       ASSERT(XFS_IS_QUOTA_RUNNING(mp));
+       ASSERT(XFS_IS_QUOTA_ON(mp));
 
        qinf = mp->m_quotainfo = kmem_zalloc(sizeof(struct xfs_quotainfo), 0);
 
@@ -662,7 +656,7 @@ xfs_qm_init_quotainfo(
        /* Precalc some constants */
        qinf->qi_dqchunklen = XFS_FSB_TO_BB(mp, XFS_DQUOT_CLUSTER_SIZE_FSB);
        qinf->qi_dqperchunk = xfs_calc_dquots_per_chunk(qinf->qi_dqchunklen);
-       if (xfs_sb_version_hasbigtime(&mp->m_sb)) {
+       if (xfs_has_bigtime(mp)) {
                qinf->qi_expiry_min =
                        xfs_dq_bigtime_to_unix(XFS_DQ_BIGTIME_EXPIRY_MIN);
                qinf->qi_expiry_max =
@@ -680,11 +674,11 @@ xfs_qm_init_quotainfo(
        xfs_qm_init_timelimits(mp, XFS_DQTYPE_GROUP);
        xfs_qm_init_timelimits(mp, XFS_DQTYPE_PROJ);
 
-       if (XFS_IS_UQUOTA_RUNNING(mp))
+       if (XFS_IS_UQUOTA_ON(mp))
                xfs_qm_set_defquota(mp, XFS_DQTYPE_USER, qinf);
-       if (XFS_IS_GQUOTA_RUNNING(mp))
+       if (XFS_IS_GQUOTA_ON(mp))
                xfs_qm_set_defquota(mp, XFS_DQTYPE_GROUP, qinf);
-       if (XFS_IS_PQUOTA_RUNNING(mp))
+       if (XFS_IS_PQUOTA_ON(mp))
                xfs_qm_set_defquota(mp, XFS_DQTYPE_PROJ, qinf);
 
        qinf->qi_shrinker.count_objects = xfs_qm_shrink_count;
@@ -755,7 +749,7 @@ xfs_qm_qino_alloc(
         * with PQUOTA, just use sb_gquotino for sb_pquotino and
         * vice-versa.
         */
-       if (!xfs_sb_version_has_pquotino(&mp->m_sb) &&
+       if (!xfs_has_pquotino(mp) &&
                        (flags & (XFS_QMOPT_PQUOTA|XFS_QMOPT_GQUOTA))) {
                xfs_ino_t ino = NULLFSINO;
 
@@ -808,9 +802,9 @@ xfs_qm_qino_alloc(
         */
        spin_lock(&mp->m_sb_lock);
        if (flags & XFS_QMOPT_SBVERSION) {
-               ASSERT(!xfs_sb_version_hasquota(&mp->m_sb));
+               ASSERT(!xfs_has_quota(mp));
 
-               xfs_sb_version_addquota(&mp->m_sb);
+               xfs_add_quota(mp);
                mp->m_sb.sb_uquotino = NULLFSINO;
                mp->m_sb.sb_gquotino = NULLFSINO;
                mp->m_sb.sb_pquotino = NULLFSINO;
@@ -829,7 +823,7 @@ xfs_qm_qino_alloc(
 
        error = xfs_trans_commit(tp);
        if (error) {
-               ASSERT(XFS_FORCED_SHUTDOWN(mp));
+               ASSERT(xfs_is_shutdown(mp));
                xfs_alert(mp, "%s failed (error %d)!", __func__, error);
        }
        if (need_alloc)
@@ -896,11 +890,11 @@ xfs_qm_reset_dqcounts(
                        ddq->d_bwarns = 0;
                        ddq->d_iwarns = 0;
                        ddq->d_rtbwarns = 0;
-                       if (xfs_sb_version_hasbigtime(&mp->m_sb))
+                       if (xfs_has_bigtime(mp))
                                ddq->d_type |= XFS_DQTYPE_BIGTIME;
                }
 
-               if (xfs_sb_version_hascrc(&mp->m_sb)) {
+               if (xfs_has_crc(mp)) {
                        xfs_update_cksum((char *)&dqb[j],
                                         sizeof(struct xfs_dqblk),
                                         XFS_DQUOT_CRC_OFF);
@@ -1147,7 +1141,7 @@ xfs_qm_dqusage_adjust(
        xfs_filblks_t           rtblks = 0;     /* total rt blks */
        int                     error;
 
-       ASSERT(XFS_IS_QUOTA_RUNNING(mp));
+       ASSERT(XFS_IS_QUOTA_ON(mp));
 
        /*
         * rootino must have its resources accounted for, not so with the quota
@@ -1288,7 +1282,7 @@ xfs_qm_quotacheck(
        flags = 0;
 
        ASSERT(uip || gip || pip);
-       ASSERT(XFS_IS_QUOTA_RUNNING(mp));
+       ASSERT(XFS_IS_QUOTA_ON(mp));
 
        xfs_notice(mp, "Quotacheck needed: Please wait.");
 
@@ -1359,7 +1353,7 @@ xfs_qm_quotacheck(
         * at this point (because we intentionally didn't in dqget_noattach).
         */
        if (error) {
-               xfs_qm_dqpurge_all(mp, XFS_QMOPT_QUOTALL);
+               xfs_qm_dqpurge_all(mp);
                goto error_return;
        }
 
@@ -1418,7 +1412,7 @@ xfs_qm_mount_quotas(
                goto write_changes;
        }
 
-       ASSERT(XFS_IS_QUOTA_RUNNING(mp));
+       ASSERT(XFS_IS_QUOTA_ON(mp));
 
        /*
         * Allocate the quotainfo structure inside the mount struct, and
@@ -1473,7 +1467,7 @@ xfs_qm_mount_quotas(
                         * the incore structures are convinced that quotas are
                         * off, but the on disk superblock doesn't know that !
                         */
-                       ASSERT(!(XFS_IS_QUOTA_RUNNING(mp)));
+                       ASSERT(!(XFS_IS_QUOTA_ON(mp)));
                        xfs_alert(mp, "%s: Superblock update failed!",
                                __func__);
                }
@@ -1504,7 +1498,7 @@ xfs_qm_init_quotainos(
        /*
         * Get the uquota and gquota inodes
         */
-       if (xfs_sb_version_hasquota(&mp->m_sb)) {
+       if (xfs_has_quota(mp)) {
                if (XFS_IS_UQUOTA_ON(mp) &&
                    mp->m_sb.sb_uquotino != NULLFSINO) {
                        ASSERT(mp->m_sb.sb_uquotino > 0);
@@ -1645,7 +1639,7 @@ xfs_qm_vop_dqalloc(
        int                     error;
        uint                    lockflags;
 
-       if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp))
+       if (!XFS_IS_QUOTA_ON(mp))
                return 0;
 
        lockflags = XFS_ILOCK_EXCL;
@@ -1776,7 +1770,7 @@ xfs_qm_vop_chown(
 
 
        ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
-       ASSERT(XFS_IS_QUOTA_RUNNING(ip->i_mount));
+       ASSERT(XFS_IS_QUOTA_ON(ip->i_mount));
 
        /* old dquot */
        prevdq = *IO_olddq;
@@ -1829,7 +1823,7 @@ xfs_qm_vop_rename_dqattach(
        struct xfs_mount        *mp = i_tab[0]->i_mount;
        int                     i;
 
-       if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp))
+       if (!XFS_IS_QUOTA_ON(mp))
                return 0;
 
        for (i = 0; (i < 4 && i_tab[i]); i++) {
@@ -1860,7 +1854,7 @@ xfs_qm_vop_create_dqattach(
 {
        struct xfs_mount        *mp = tp->t_mountp;
 
-       if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp))
+       if (!XFS_IS_QUOTA_ON(mp))
                return;
 
        ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
@@ -1888,3 +1882,37 @@ xfs_qm_vop_create_dqattach(
        }
 }
 
+/* Decide if this inode's dquot is near an enforcement boundary. */
+bool
+xfs_inode_near_dquot_enforcement(
+       struct xfs_inode        *ip,
+       xfs_dqtype_t            type)
+{
+       struct xfs_dquot        *dqp;
+       int64_t                 freesp;
+
+       /* We only care for quotas that are enabled and enforced. */
+       dqp = xfs_inode_dquot(ip, type);
+       if (!dqp || !xfs_dquot_is_enforced(dqp))
+               return false;
+
+       if (xfs_dquot_res_over_limits(&dqp->q_ino) ||
+           xfs_dquot_res_over_limits(&dqp->q_rtb))
+               return true;
+
+       /* For space on the data device, check the various thresholds. */
+       if (!dqp->q_prealloc_hi_wmark)
+               return false;
+
+       if (dqp->q_blk.reserved < dqp->q_prealloc_lo_wmark)
+               return false;
+
+       if (dqp->q_blk.reserved >= dqp->q_prealloc_hi_wmark)
+               return true;
+
+       freesp = dqp->q_prealloc_hi_wmark - dqp->q_blk.reserved;
+       if (freesp < dqp->q_low_space[XFS_QLOWSP_5_PCNT])
+               return true;
+
+       return false;
+}