On Thu, Jan 02, 2020 at 09:40:46PM +0100, Arnd Bergmann wrote:
> 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 <a...@arndb.de>
> ---
> This has a small conflict against the series at
> https://www.spinics.net/lists/linux-xfs/msg35409.html
> ("xfs: widen timestamps to deal with y2038") which needs
> to be rebased on top of this.
> 
> All other changes to remove time_t and get_seconds()
> are now in linux-next, this is one of the last patches
> needed to remove their definitions for v5.6.
> 
> If the widened timestamps make it into v5.6, this patch
> can be dropped.

Not likely. :)

I'll give this series a spin,
Reviewed-by: Darrick J. Wong <darrick.w...@oracle.com>

--D

> ---
>  fs/xfs/xfs_dquot.c       | 6 +++---
>  fs/xfs/xfs_qm.h          | 6 +++---
>  fs/xfs/xfs_quotaops.c    | 6 +++---
>  fs/xfs/xfs_trans_dquot.c | 8 +++++---
>  4 files changed, 14 insertions(+), 12 deletions(-)
> 
> diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c
> index 2bff21ca9d78..9cfd3209f52b 100644
> --- a/fs/xfs/xfs_dquot.c
> +++ b/fs/xfs/xfs_dquot.c
> @@ -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;
> diff --git a/fs/xfs/xfs_qm.h b/fs/xfs/xfs_qm.h
> index 7823af39008b..4e57edca8bce 100644
> --- a/fs/xfs/xfs_qm.h
> +++ b/fs/xfs/xfs_qm.h
> @@ -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 */
> diff --git a/fs/xfs/xfs_quotaops.c b/fs/xfs/xfs_quotaops.c
> index c7de17deeae6..38669e827206 100644
> --- a/fs/xfs/xfs_quotaops.c
> +++ b/fs/xfs/xfs_quotaops.c
> @@ -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;
> diff --git a/fs/xfs/xfs_trans_dquot.c b/fs/xfs/xfs_trans_dquot.c
> index a6fe2d8dc40f..d1b9869bc5fa 100644
> --- a/fs/xfs/xfs_trans_dquot.c
> +++ b/fs/xfs/xfs_trans_dquot.c
> @@ -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);
> -- 
> 2.20.0
> 
_______________________________________________
Y2038 mailing list
Y2038@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/y2038

Reply via email to