How quickly do we want to merge these upstream?

I can put them in for-next cifs-2.6.git now, presumably these are not
cc:stable so would go in 4.19 - correct?

On Tue, Jun 19, 2018 at 10:27 AM, Arnd Bergmann <[email protected]> wrote:
> In cifs, the timestamps are stored in memory in the cifs_fattr structure,
> which uses the deprecated 'timespec' structure. Now that the VFS code
> has moved on to 'timespec64', the next step is to change over the fattr
> as well.
>
> This also makes 32-bit and 64-bit systems behave the same way, and
> no longer overflow the 32-bit time_t in year 2038.
>
> Signed-off-by: Arnd Bergmann <[email protected]>
> ---
>  fs/cifs/cifsencrypt.c |  4 ++--
>  fs/cifs/cifsglob.h    |  6 +++---
>  fs/cifs/cifsproto.h   |  6 +++---
>  fs/cifs/cifssmb.c     | 12 ++++++------
>  fs/cifs/inode.c       | 34 ++++++++++++++++------------------
>  fs/cifs/netmisc.c     | 19 ++++++++++---------
>  6 files changed, 40 insertions(+), 41 deletions(-)
>
> diff --git a/fs/cifs/cifsencrypt.c b/fs/cifs/cifsencrypt.c
> index ee2a8ec70056..b4672eafc5bf 100644
> --- a/fs/cifs/cifsencrypt.c
> +++ b/fs/cifs/cifsencrypt.c
> @@ -452,7 +452,7 @@ find_timestamp(struct cifs_ses *ses)
>         unsigned char *blobptr;
>         unsigned char *blobend;
>         struct ntlmssp2_name *attrptr;
> -       struct timespec ts;
> +       struct timespec64 ts;
>
>         if (!ses->auth_key.len || !ses->auth_key.response)
>                 return 0;
> @@ -477,7 +477,7 @@ find_timestamp(struct cifs_ses *ses)
>                 blobptr += attrsize; /* advance attr value */
>         }
>
> -       ktime_get_real_ts(&ts);
> +       ktime_get_real_ts64(&ts);
>         return cpu_to_le64(cifs_UnixTimeToNT(ts));
>  }
>
> diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h
> index bd78da59a4fd..0543187fe707 100644
> --- a/fs/cifs/cifsglob.h
> +++ b/fs/cifs/cifsglob.h
> @@ -1543,9 +1543,9 @@ struct cifs_fattr {
>         dev_t           cf_rdev;
>         unsigned int    cf_nlink;
>         unsigned int    cf_dtype;
> -       struct timespec cf_atime;
> -       struct timespec cf_mtime;
> -       struct timespec cf_ctime;
> +       struct timespec64 cf_atime;
> +       struct timespec64 cf_mtime;
> +       struct timespec64 cf_ctime;
>  };
>
>  static inline void free_dfs_info_param(struct dfs_info3_param *param)
> diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h
> index 03018be17283..e23eec5372df 100644
> --- a/fs/cifs/cifsproto.h
> +++ b/fs/cifs/cifsproto.h
> @@ -142,9 +142,9 @@ extern enum securityEnum select_sectype(struct 
> TCP_Server_Info *server,
>                                 enum securityEnum requested);
>  extern int CIFS_SessSetup(const unsigned int xid, struct cifs_ses *ses,
>                           const struct nls_table *nls_cp);
> -extern struct timespec cifs_NTtimeToUnix(__le64 utc_nanoseconds_since_1601);
> -extern u64 cifs_UnixTimeToNT(struct timespec);
> -extern struct timespec cnvrtDosUnixTm(__le16 le_date, __le16 le_time,
> +extern struct timespec64 cifs_NTtimeToUnix(__le64 
> utc_nanoseconds_since_1601);
> +extern u64 cifs_UnixTimeToNT(struct timespec64);
> +extern struct timespec64 cnvrtDosUnixTm(__le16 le_date, __le16 le_time,
>                                       int offset);
>  extern void cifs_set_oplock_level(struct cifsInodeInfo *cinode, __u32 
> oplock);
>  extern int cifs_get_writer(struct cifsInodeInfo *cinode);
> diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c
> index d352da325de3..82bf41265eca 100644
> --- a/fs/cifs/cifssmb.c
> +++ b/fs/cifs/cifssmb.c
> @@ -502,13 +502,13 @@ decode_lanman_negprot_rsp(struct TCP_Server_Info 
> *server, NEGOTIATE_RSP *pSMBr)
>                  * this requirement.
>                  */
>                 int val, seconds, remain, result;
> -               struct timespec ts;
> -               unsigned long utc = ktime_get_real_seconds();
> +               struct timespec64 ts;
> +               time64_t utc = ktime_get_real_seconds();
>                 ts = cnvrtDosUnixTm(rsp->SrvTime.Date,
>                                     rsp->SrvTime.Time, 0);
> -               cifs_dbg(FYI, "SrvTime %d sec since 1970 (utc: %d) diff: 
> %d\n",
> -                        (int)ts.tv_sec, (int)utc,
> -                        (int)(utc - ts.tv_sec));
> +               cifs_dbg(FYI, "SrvTime %lld sec since 1970 (utc: %lld) diff: 
> %lld\n",
> +                        ts.tv_sec, utc,
> +                        utc - ts.tv_sec);
>                 val = (int)(utc - ts.tv_sec);
>                 seconds = abs(val);
>                 result = (seconds / MIN_TZ_ADJ) * MIN_TZ_ADJ;
> @@ -4076,7 +4076,7 @@ SMBQueryInformation(const unsigned int xid, struct 
> cifs_tcon *tcon,
>         if (rc) {
>                 cifs_dbg(FYI, "Send error in QueryInfo = %d\n", rc);
>         } else if (data) {
> -               struct timespec ts;
> +               struct timespec64 ts;
>                 __u32 time = le32_to_cpu(pSMBr->last_write_time);
>
>                 /* decode response */
> diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c
> index a2cfb33e85c1..f6abf18ca492 100644
> --- a/fs/cifs/inode.c
> +++ b/fs/cifs/inode.c
> @@ -95,7 +95,6 @@ static void
>  cifs_revalidate_cache(struct inode *inode, struct cifs_fattr *fattr)
>  {
>         struct cifsInodeInfo *cifs_i = CIFS_I(inode);
> -       struct timespec ts;
>
>         cifs_dbg(FYI, "%s: revalidating inode %llu\n",
>                  __func__, cifs_i->uniqueid);
> @@ -114,8 +113,7 @@ cifs_revalidate_cache(struct inode *inode, struct 
> cifs_fattr *fattr)
>         }
>
>          /* revalidate if mtime or size have changed */
> -       ts = timespec64_to_timespec(inode->i_mtime);
> -       if (timespec_equal(&ts, &fattr->cf_mtime) &&
> +       if (timespec64_equal(&inode->i_mtime, &fattr->cf_mtime) &&
>             cifs_i->server_eof == fattr->cf_eof) {
>                 cifs_dbg(FYI, "%s: inode %llu is unchanged\n",
>                          __func__, cifs_i->uniqueid);
> @@ -164,9 +162,9 @@ cifs_fattr_to_inode(struct inode *inode, struct 
> cifs_fattr *fattr)
>         cifs_revalidate_cache(inode, fattr);
>
>         spin_lock(&inode->i_lock);
> -       inode->i_atime = timespec_to_timespec64(fattr->cf_atime);
> -       inode->i_mtime = timespec_to_timespec64(fattr->cf_mtime);
> -       inode->i_ctime = timespec_to_timespec64(fattr->cf_ctime);
> +       inode->i_atime = fattr->cf_atime;
> +       inode->i_mtime = fattr->cf_mtime;
> +       inode->i_ctime = fattr->cf_ctime;
>         inode->i_rdev = fattr->cf_rdev;
>         cifs_nlink_fattr_to_inode(inode, fattr);
>         inode->i_uid = fattr->cf_uid;
> @@ -327,8 +325,8 @@ cifs_create_dfs_fattr(struct cifs_fattr *fattr, struct 
> super_block *sb)
>         fattr->cf_mode = S_IFDIR | S_IXUGO | S_IRWXU;
>         fattr->cf_uid = cifs_sb->mnt_uid;
>         fattr->cf_gid = cifs_sb->mnt_gid;
> -       ktime_get_real_ts(&fattr->cf_mtime);
> -       fattr->cf_mtime = timespec_trunc(fattr->cf_mtime, sb->s_time_gran);
> +       ktime_get_real_ts64(&fattr->cf_mtime);
> +       fattr->cf_mtime = timespec64_trunc(fattr->cf_mtime, sb->s_time_gran);
>         fattr->cf_atime = fattr->cf_ctime = fattr->cf_mtime;
>         fattr->cf_nlink = 2;
>         fattr->cf_flags |= CIFS_FATTR_DFS_REFERRAL;
> @@ -604,8 +602,8 @@ cifs_all_info_to_fattr(struct cifs_fattr *fattr, 
> FILE_ALL_INFO *info,
>         if (info->LastAccessTime)
>                 fattr->cf_atime = cifs_NTtimeToUnix(info->LastAccessTime);
>         else {
> -               ktime_get_real_ts(&fattr->cf_atime);
> -               fattr->cf_atime = timespec_trunc(fattr->cf_atime, 
> sb->s_time_gran);
> +               ktime_get_real_ts64(&fattr->cf_atime);
> +               fattr->cf_atime = timespec64_trunc(fattr->cf_atime, 
> sb->s_time_gran);
>         }
>
>         fattr->cf_ctime = cifs_NTtimeToUnix(info->ChangeTime);
> @@ -1125,14 +1123,14 @@ cifs_set_file_info(struct inode *inode, struct iattr 
> *attrs, unsigned int xid,
>         if (attrs->ia_valid & ATTR_ATIME) {
>                 set_time = true;
>                 info_buf.LastAccessTime =
> -                       
> cpu_to_le64(cifs_UnixTimeToNT(timespec64_to_timespec(attrs->ia_atime)));
> +                       cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_atime));
>         } else
>                 info_buf.LastAccessTime = 0;
>
>         if (attrs->ia_valid & ATTR_MTIME) {
>                 set_time = true;
>                 info_buf.LastWriteTime =
> -                   
> cpu_to_le64(cifs_UnixTimeToNT(timespec64_to_timespec(attrs->ia_mtime)));
> +                   cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_mtime));
>         } else
>                 info_buf.LastWriteTime = 0;
>
> @@ -1145,7 +1143,7 @@ cifs_set_file_info(struct inode *inode, struct iattr 
> *attrs, unsigned int xid,
>         if (set_time && (attrs->ia_valid & ATTR_CTIME)) {
>                 cifs_dbg(FYI, "CIFS - CTIME changed\n");
>                 info_buf.ChangeTime =
> -                   
> cpu_to_le64(cifs_UnixTimeToNT(timespec64_to_timespec(attrs->ia_ctime)));
> +                   cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_ctime));
>         } else
>                 info_buf.ChangeTime = 0;
>
> @@ -2071,8 +2069,8 @@ int cifs_getattr(const struct path *path, struct kstat 
> *stat,
>         /* old CIFS Unix Extensions doesn't return create time */
>         if (CIFS_I(inode)->createtime) {
>                 stat->result_mask |= STATX_BTIME;
> -               stat->btime = timespec_to_timespec64(
> -                     
> cifs_NTtimeToUnix(cpu_to_le64(CIFS_I(inode)->createtime)));
> +               stat->btime =
> +                     
> cifs_NTtimeToUnix(cpu_to_le64(CIFS_I(inode)->createtime));
>         }
>
>         stat->attributes_mask |= (STATX_ATTR_COMPRESSED | 
> STATX_ATTR_ENCRYPTED);
> @@ -2278,17 +2276,17 @@ cifs_setattr_unix(struct dentry *direntry, struct 
> iattr *attrs)
>                 args->gid = INVALID_GID; /* no change */
>
>         if (attrs->ia_valid & ATTR_ATIME)
> -               args->atime = 
> cifs_UnixTimeToNT(timespec64_to_timespec(attrs->ia_atime));
> +               args->atime = cifs_UnixTimeToNT(attrs->ia_atime);
>         else
>                 args->atime = NO_CHANGE_64;
>
>         if (attrs->ia_valid & ATTR_MTIME)
> -               args->mtime = 
> cifs_UnixTimeToNT(timespec64_to_timespec(attrs->ia_mtime));
> +               args->mtime = cifs_UnixTimeToNT(attrs->ia_mtime);
>         else
>                 args->mtime = NO_CHANGE_64;
>
>         if (attrs->ia_valid & ATTR_CTIME)
> -               args->ctime = 
> cifs_UnixTimeToNT(timespec64_to_timespec(attrs->ia_ctime));
> +               args->ctime = cifs_UnixTimeToNT(attrs->ia_ctime);
>         else
>                 args->ctime = NO_CHANGE_64;
>
> diff --git a/fs/cifs/netmisc.c b/fs/cifs/netmisc.c
> index d7ad0dfe4e68..fdd908e4a26b 100644
> --- a/fs/cifs/netmisc.c
> +++ b/fs/cifs/netmisc.c
> @@ -918,10 +918,10 @@ smbCalcSize(void *buf, struct TCP_Server_Info *server)
>   * Convert the NT UTC (based 1601-01-01, in hundred nanosecond units)
>   * into Unix UTC (based 1970-01-01, in seconds).
>   */
> -struct timespec
> +struct timespec64
>  cifs_NTtimeToUnix(__le64 ntutc)
>  {
> -       struct timespec ts;
> +       struct timespec64 ts;
>         /* BB what about the timezone? BB */
>
>         /* Subtract the NTFS time offset, then convert to 1s intervals. */
> @@ -935,12 +935,12 @@ cifs_NTtimeToUnix(__le64 ntutc)
>          */
>         if (t < 0) {
>                 abs_t = -t;
> -               ts.tv_nsec = (long)(do_div(abs_t, 10000000) * 100);
> +               ts.tv_nsec = (time64_t)(do_div(abs_t, 10000000) * 100);
>                 ts.tv_nsec = -ts.tv_nsec;
>                 ts.tv_sec = -abs_t;
>         } else {
>                 abs_t = t;
> -               ts.tv_nsec = (long)do_div(abs_t, 10000000) * 100;
> +               ts.tv_nsec = (time64_t)do_div(abs_t, 10000000) * 100;
>                 ts.tv_sec = abs_t;
>         }
>
> @@ -949,7 +949,7 @@ cifs_NTtimeToUnix(__le64 ntutc)
>
>  /* Convert the Unix UTC into NT UTC. */
>  u64
> -cifs_UnixTimeToNT(struct timespec t)
> +cifs_UnixTimeToNT(struct timespec64 t)
>  {
>         /* Convert to 100ns intervals and then add the NTFS time offset. */
>         return (u64) t.tv_sec * 10000000 + t.tv_nsec/100 + NTFS_TIME_OFFSET;
> @@ -959,10 +959,11 @@ static const int total_days_of_prev_months[] = {
>         0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334
>  };
>
> -struct timespec cnvrtDosUnixTm(__le16 le_date, __le16 le_time, int offset)
> +struct timespec64 cnvrtDosUnixTm(__le16 le_date, __le16 le_time, int offset)
>  {
> -       struct timespec ts;
> -       int sec, min, days, month, year;
> +       struct timespec64 ts;
> +       time64_t sec;
> +       int min, days, month, year;
>         u16 date = le16_to_cpu(le_date);
>         u16 time = le16_to_cpu(le_time);
>         SMB_TIME *st = (SMB_TIME *)&time;
> @@ -973,7 +974,7 @@ struct timespec cnvrtDosUnixTm(__le16 le_date, __le16 
> le_time, int offset)
>         sec = 2 * st->TwoSeconds;
>         min = st->Minutes;
>         if ((sec > 59) || (min > 59))
> -               cifs_dbg(VFS, "illegal time min %d sec %d\n", min, sec);
> +               cifs_dbg(VFS, "illegal time min %d sec %lld\n", min, sec);
>         sec += (min * 60);
>         sec += 60 * 60 * st->Hours;
>         if (st->Hours > 24)
> --
> 2.9.0
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-cifs" in
> the body of a message to [email protected]
> More majordomo info at  http://vger.kernel.org/majordomo-info.html



-- 
Thanks,

Steve
_______________________________________________
Y2038 mailing list
[email protected]
https://lists.linaro.org/mailman/listinfo/y2038

Reply via email to