]> git.karo-electronics.de Git - linux-beck.git/commitdiff
nfsd: factor out a helper to decode nfstime4 values
authorChristoph Hellwig <hch@lst.de>
Thu, 22 Jan 2015 11:09:50 +0000 (12:09 +0100)
committerJ. Bruce Fields <bfields@redhat.com>
Fri, 23 Jan 2015 15:29:13 +0000 (10:29 -0500)
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/nfsd/nfs4xdr.c

index 91f7a3644ffbc7ab00525cc6f53f74ccf916f777..974533e5a427d04a039a6180cb769ef4247843fd 100644 (file)
@@ -234,6 +234,26 @@ static char *savemem(struct nfsd4_compoundargs *argp, __be32 *p, int nbytes)
        return ret;
 }
 
+/*
+ * We require the high 32 bits of 'seconds' to be 0, and
+ * we ignore all 32 bits of 'nseconds'.
+ */
+static __be32
+nfsd4_decode_time(struct nfsd4_compoundargs *argp, struct timespec *tv)
+{
+       DECODE_HEAD;
+       u64 sec;
+
+       READ_BUF(12);
+       p = xdr_decode_hyper(p, &sec);
+       tv->tv_sec = sec;
+       tv->tv_nsec = be32_to_cpup(p++);
+       if (tv->tv_nsec >= (u32)1000000000)
+               return nfserr_inval;
+
+       DECODE_TAIL;
+}
+
 static __be32
 nfsd4_decode_bitmap(struct nfsd4_compoundargs *argp, u32 *bmval)
 {
@@ -267,7 +287,6 @@ nfsd4_decode_fattr(struct nfsd4_compoundargs *argp, u32 *bmval,
 {
        int expected_len, len = 0;
        u32 dummy32;
-       u64 sec;
        char *buf;
 
        DECODE_HEAD;
@@ -358,15 +377,10 @@ nfsd4_decode_fattr(struct nfsd4_compoundargs *argp, u32 *bmval,
                dummy32 = be32_to_cpup(p++);
                switch (dummy32) {
                case NFS4_SET_TO_CLIENT_TIME:
-                       /* We require the high 32 bits of 'seconds' to be 0, and we ignore
-                          all 32 bits of 'nseconds'. */
-                       READ_BUF(12);
                        len += 12;
-                       p = xdr_decode_hyper(p, &sec);
-                       iattr->ia_atime.tv_sec = (time_t)sec;
-                       iattr->ia_atime.tv_nsec = be32_to_cpup(p++);
-                       if (iattr->ia_atime.tv_nsec >= (u32)1000000000)
-                               return nfserr_inval;
+                       status = nfsd4_decode_time(argp, &iattr->ia_atime);
+                       if (status)
+                               return status;
                        iattr->ia_valid |= (ATTR_ATIME | ATTR_ATIME_SET);
                        break;
                case NFS4_SET_TO_SERVER_TIME:
@@ -382,15 +396,10 @@ nfsd4_decode_fattr(struct nfsd4_compoundargs *argp, u32 *bmval,
                dummy32 = be32_to_cpup(p++);
                switch (dummy32) {
                case NFS4_SET_TO_CLIENT_TIME:
-                       /* We require the high 32 bits of 'seconds' to be 0, and we ignore
-                          all 32 bits of 'nseconds'. */
-                       READ_BUF(12);
                        len += 12;
-                       p = xdr_decode_hyper(p, &sec);
-                       iattr->ia_mtime.tv_sec = sec;
-                       iattr->ia_mtime.tv_nsec = be32_to_cpup(p++);
-                       if (iattr->ia_mtime.tv_nsec >= (u32)1000000000)
-                               return nfserr_inval;
+                       status = nfsd4_decode_time(argp, &iattr->ia_mtime);
+                       if (status)
+                               return status;
                        iattr->ia_valid |= (ATTR_MTIME | ATTR_MTIME_SET);
                        break;
                case NFS4_SET_TO_SERVER_TIME: