xfs: quota: move to time64_t interfaces
authorArnd Bergmann <arnd@arndb.de>
Thu, 2 Jan 2020 21:27:45 +0000 (13:27 -0800)
committerDarrick J. Wong <darrick.wong@oracle.com>
Mon, 6 Jan 2020 16:57:37 +0000 (08:57 -0800)
As a preparation for removing the 32-bit time_t type and
all associated interfaces, change xfs to use time64_t and
ktime_get_real_seconds() for the quota housekeeping.

This avoids one difference between 32-bit and 64-bit kernels,
raising the theoretical limit for the quota grace period
to year 2106 on 32-bit instead of year 2038.

Note that common user space tools using the XFS quotactl
interface instead of the generic one still use the y2038
dates.

To fix quotas properly, both the on-disk format and user
space still need to be changed.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
fs/xfs/xfs_dquot.c
fs/xfs/xfs_qm.h
fs/xfs/xfs_quotaops.c
fs/xfs/xfs_trans_dquot.c

index 2bff21ca9d78d859ba048e1676f2d71084787829..9cfd3209f52b9c15c815e7ba8c68f71fa0d4a1f9 100644 (file)
@@ -137,7 +137,7 @@ xfs_qm_adjust_dqtimers(
                    (d->d_blk_hardlimit &&
                     (be64_to_cpu(d->d_bcount) >
                      be64_to_cpu(d->d_blk_hardlimit)))) {
-                       d->d_btimer = cpu_to_be32(get_seconds() +
+                       d->d_btimer = cpu_to_be32(ktime_get_real_seconds() +
                                        mp->m_quotainfo->qi_btimelimit);
                } else {
                        d->d_bwarns = 0;
@@ -160,7 +160,7 @@ xfs_qm_adjust_dqtimers(
                    (d->d_ino_hardlimit &&
                     (be64_to_cpu(d->d_icount) >
                      be64_to_cpu(d->d_ino_hardlimit)))) {
-                       d->d_itimer = cpu_to_be32(get_seconds() +
+                       d->d_itimer = cpu_to_be32(ktime_get_real_seconds() +
                                        mp->m_quotainfo->qi_itimelimit);
                } else {
                        d->d_iwarns = 0;
@@ -183,7 +183,7 @@ xfs_qm_adjust_dqtimers(
                    (d->d_rtb_hardlimit &&
                     (be64_to_cpu(d->d_rtbcount) >
                      be64_to_cpu(d->d_rtb_hardlimit)))) {
-                       d->d_rtbtimer = cpu_to_be32(get_seconds() +
+                       d->d_rtbtimer = cpu_to_be32(ktime_get_real_seconds() +
                                        mp->m_quotainfo->qi_rtbtimelimit);
                } else {
                        d->d_rtbwarns = 0;
index 7823af39008b93bb46a000946d10b3883fa119b4..4e57edca8bcee3d7b3a5980c7d42771307f21356 100644 (file)
@@ -64,9 +64,9 @@ struct xfs_quotainfo {
        struct xfs_inode        *qi_pquotaip;   /* project quota inode */
        struct list_lru  qi_lru;
        int              qi_dquots;
-       time_t           qi_btimelimit;  /* limit for blks timer */
-       time_t           qi_itimelimit;  /* limit for inodes timer */
-       time_t           qi_rtbtimelimit;/* limit for rt blks timer */
+       time64_t         qi_btimelimit;  /* limit for blks timer */
+       time64_t         qi_itimelimit;  /* limit for inodes timer */
+       time64_t         qi_rtbtimelimit;/* limit for rt blks timer */
        xfs_qwarncnt_t   qi_bwarnlimit;  /* limit for blks warnings */
        xfs_qwarncnt_t   qi_iwarnlimit;  /* limit for inodes warnings */
        xfs_qwarncnt_t   qi_rtbwarnlimit;/* limit for rt blks warnings */
index c7de17deeae64c107544387efd39bdbf4d1d776f..38669e8272060fc1ce6b4a75b4fbf89ea9e5f810 100644 (file)
@@ -37,9 +37,9 @@ xfs_qm_fill_state(
        tstate->flags |= QCI_SYSFILE;
        tstate->blocks = ip->i_d.di_nblocks;
        tstate->nextents = ip->i_d.di_nextents;
-       tstate->spc_timelimit = q->qi_btimelimit;
-       tstate->ino_timelimit = q->qi_itimelimit;
-       tstate->rt_spc_timelimit = q->qi_rtbtimelimit;
+       tstate->spc_timelimit = (u32)q->qi_btimelimit;
+       tstate->ino_timelimit = (u32)q->qi_itimelimit;
+       tstate->rt_spc_timelimit = (u32)q->qi_rtbtimelimit;
        tstate->spc_warnlimit = q->qi_bwarnlimit;
        tstate->ino_warnlimit = q->qi_iwarnlimit;
        tstate->rt_spc_warnlimit = q->qi_rtbwarnlimit;
index a6fe2d8dc40f38307f643360a84c80e5eaa6360b..d1b9869bc5fa61f723947da51199b708a809b394 100644 (file)
@@ -580,7 +580,7 @@ xfs_trans_dqresv(
 {
        xfs_qcnt_t              hardlimit;
        xfs_qcnt_t              softlimit;
-       time_t                  timer;
+       time64_t                timer;
        xfs_qwarncnt_t          warns;
        xfs_qwarncnt_t          warnlimit;
        xfs_qcnt_t              total_count;
@@ -635,7 +635,8 @@ xfs_trans_dqresv(
                                goto error_return;
                        }
                        if (softlimit && total_count > softlimit) {
-                               if ((timer != 0 && get_seconds() > timer) ||
+                               if ((timer != 0 &&
+                                    ktime_get_real_seconds() > timer) ||
                                    (warns != 0 && warns >= warnlimit)) {
                                        xfs_quota_warn(mp, dqp,
                                                       QUOTA_NL_BSOFTLONGWARN);
@@ -662,7 +663,8 @@ xfs_trans_dqresv(
                                goto error_return;
                        }
                        if (softlimit && total_count > softlimit) {
-                               if  ((timer != 0 && get_seconds() > timer) ||
+                               if  ((timer != 0 &&
+                                     ktime_get_real_seconds() > timer) ||
                                     (warns != 0 && warns >= warnlimit)) {
                                        xfs_quota_warn(mp, dqp,
                                                       QUOTA_NL_ISOFTLONGWARN);