nfsd: use 64-bit seconds fields in nfsd v4 code
authorJ. Bruce Fields <bfields@redhat.com>
Wed, 5 Jun 2019 18:17:42 +0000 (14:17 -0400)
committerJ. Bruce Fields <bfields@redhat.com>
Wed, 3 Jul 2019 21:52:09 +0000 (17:52 -0400)
After commit 95582b008388 "vfs: change inode times to use struct
timespec64" there are spots in the NFSv4 decoding where we decode the
protocol into a struct timeval and then convert that into a timeval64.

That's unnecesary in the NFSv4 case since the on-the-wire protocol also
uses 64-bit values.  So just fix up our code to use timeval64 everywhere.

Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/nfsd/blocklayout.c
fs/nfsd/nfs4xdr.c
fs/nfsd/xdr4.h

index 4fb1f72a25fb3de83d2d3c5c8e38dff4ec4eac20..66d4c55eb48e9f1af826c85573b10f4fb55a8fb9 100644 (file)
@@ -121,15 +121,13 @@ nfsd4_block_commit_blocks(struct inode *inode, struct nfsd4_layoutcommit *lcp,
 {
        loff_t new_size = lcp->lc_last_wr + 1;
        struct iattr iattr = { .ia_valid = 0 };
-       struct timespec ts;
        int error;
 
-       ts = timespec64_to_timespec(inode->i_mtime);
        if (lcp->lc_mtime.tv_nsec == UTIME_NOW ||
-           timespec_compare(&lcp->lc_mtime, &ts) < 0)
-               lcp->lc_mtime = timespec64_to_timespec(current_time(inode));
+           timespec64_compare(&lcp->lc_mtime, &inode->i_mtime) < 0)
+               lcp->lc_mtime = current_time(inode);
        iattr.ia_valid |= ATTR_ATIME | ATTR_CTIME | ATTR_MTIME;
-       iattr.ia_atime = iattr.ia_ctime = iattr.ia_mtime = timespec_to_timespec64(lcp->lc_mtime);
+       iattr.ia_atime = iattr.ia_ctime = iattr.ia_mtime = lcp->lc_mtime;
 
        if (new_size > i_size_read(inode)) {
                iattr.ia_valid |= ATTR_SIZE;
index 52c4f6daa649a5f4cdf8562c27457efea712fdbe..73e6753fb213fce2b6c92339d4f1a261e39dac40 100644 (file)
@@ -274,14 +274,12 @@ static char *savemem(struct nfsd4_compoundargs *argp, __be32 *p, int nbytes)
  * we ignore all 32 bits of 'nseconds'.
  */
 static __be32
-nfsd4_decode_time(struct nfsd4_compoundargs *argp, struct timespec *tv)
+nfsd4_decode_time(struct nfsd4_compoundargs *argp, struct timespec64 *tv)
 {
        DECODE_HEAD;
-       u64 sec;
 
        READ_BUF(12);
-       p = xdr_decode_hyper(p, &sec);
-       tv->tv_sec = sec;
+       p = xdr_decode_hyper(p, &tv->tv_sec);
        tv->tv_nsec = be32_to_cpup(p++);
        if (tv->tv_nsec >= (u32)1000000000)
                return nfserr_inval;
@@ -320,7 +318,6 @@ nfsd4_decode_fattr(struct nfsd4_compoundargs *argp, u32 *bmval,
                   struct iattr *iattr, struct nfs4_acl **acl,
                   struct xdr_netobj *label, int *umask)
 {
-       struct timespec ts;
        int expected_len, len = 0;
        u32 dummy32;
        char *buf;
@@ -422,8 +419,7 @@ nfsd4_decode_fattr(struct nfsd4_compoundargs *argp, u32 *bmval,
                switch (dummy32) {
                case NFS4_SET_TO_CLIENT_TIME:
                        len += 12;
-                       status = nfsd4_decode_time(argp, &ts);
-                       iattr->ia_atime = timespec_to_timespec64(ts);
+                       status = nfsd4_decode_time(argp, &iattr->ia_atime);
                        if (status)
                                return status;
                        iattr->ia_valid |= (ATTR_ATIME | ATTR_ATIME_SET);
@@ -442,8 +438,7 @@ nfsd4_decode_fattr(struct nfsd4_compoundargs *argp, u32 *bmval,
                switch (dummy32) {
                case NFS4_SET_TO_CLIENT_TIME:
                        len += 12;
-                       status = nfsd4_decode_time(argp, &ts);
-                       iattr->ia_mtime = timespec_to_timespec64(ts);
+                       status = nfsd4_decode_time(argp, &iattr->ia_mtime);
                        if (status)
                                return status;
                        iattr->ia_valid |= (ATTR_MTIME | ATTR_MTIME_SET);
index feeb6d4bdffda38463bec8f75c6124820a5697ac..c2b631eefc6dc33cb28404e738f0ca395a7833ed 100644 (file)
@@ -472,7 +472,7 @@ struct nfsd4_layoutcommit {
        u32                     lc_reclaim;     /* request */
        u32                     lc_newoffset;   /* request */
        u64                     lc_last_wr;     /* request */
-       struct timespec         lc_mtime;       /* request */
+       struct timespec64       lc_mtime;       /* request */
        u32                     lc_layout_type; /* request */
        u32                     lc_up_len;      /* layout length */
        void                    *lc_up_layout;  /* decoded by callback */