NFSD: Replace READ* macros in nfsd4_decode_test_stateid()
authorChuck Lever <chuck.lever@oracle.com>
Tue, 3 Nov 2020 19:57:44 +0000 (14:57 -0500)
committerChuck Lever <chuck.lever@oracle.com>
Mon, 30 Nov 2020 19:46:42 +0000 (14:46 -0500)
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfsd/nfs4xdr.c

index eae416e..3c42e04 100644 (file)
@@ -1738,42 +1738,6 @@ nfsd4_decode_free_stateid(struct nfsd4_compoundargs *argp,
        return nfsd4_decode_stateid4(argp, &free_stateid->fr_stateid);
 }
 
-static __be32
-nfsd4_decode_test_stateid(struct nfsd4_compoundargs *argp, struct nfsd4_test_stateid *test_stateid)
-{
-       int i;
-       __be32 *p, status;
-       struct nfsd4_test_stateid_id *stateid;
-
-       READ_BUF(4);
-       test_stateid->ts_num_ids = ntohl(*p++);
-
-       INIT_LIST_HEAD(&test_stateid->ts_stateid_list);
-
-       for (i = 0; i < test_stateid->ts_num_ids; i++) {
-               stateid = svcxdr_tmpalloc(argp, sizeof(*stateid));
-               if (!stateid) {
-                       status = nfserrno(-ENOMEM);
-                       goto out;
-               }
-
-               INIT_LIST_HEAD(&stateid->ts_id_list);
-               list_add_tail(&stateid->ts_id_list, &test_stateid->ts_stateid_list);
-
-               status = nfsd4_decode_stateid(argp, &stateid->ts_id_stateid);
-               if (status)
-                       goto out;
-       }
-
-       status = 0;
-out:
-       return status;
-xdr_error:
-       dprintk("NFSD: xdr error (%s:%d)\n", __FILE__, __LINE__);
-       status = nfserr_bad_xdr;
-       goto out;
-}
-
 static __be32 nfsd4_decode_destroy_clientid(struct nfsd4_compoundargs *argp, struct nfsd4_destroy_clientid *dc)
 {
        DECODE_HEAD;
@@ -1919,6 +1883,31 @@ nfsd4_decode_sequence(struct nfsd4_compoundargs *argp,
        return nfs_ok;
 }
 
+static __be32
+nfsd4_decode_test_stateid(struct nfsd4_compoundargs *argp, struct nfsd4_test_stateid *test_stateid)
+{
+       struct nfsd4_test_stateid_id *stateid;
+       __be32 status;
+       u32 i;
+
+       if (xdr_stream_decode_u32(argp->xdr, &test_stateid->ts_num_ids) < 0)
+               return nfserr_bad_xdr;
+
+       INIT_LIST_HEAD(&test_stateid->ts_stateid_list);
+       for (i = 0; i < test_stateid->ts_num_ids; i++) {
+               stateid = svcxdr_tmpalloc(argp, sizeof(*stateid));
+               if (!stateid)
+                       return nfserrno(-ENOMEM);       /* XXX: not jukebox? */
+               INIT_LIST_HEAD(&stateid->ts_id_list);
+               list_add_tail(&stateid->ts_id_list, &test_stateid->ts_stateid_list);
+               status = nfsd4_decode_stateid4(argp, &stateid->ts_id_stateid);
+               if (status)
+                       return status;
+       }
+
+       return nfs_ok;
+}
+
 static __be32
 nfsd4_decode_fallocate(struct nfsd4_compoundargs *argp,
                       struct nfsd4_fallocate *fallocate)