NFSD: Update the NFSv3 GETACL result encoder to use struct xdr_stream
authorChuck Lever <chuck.lever@oracle.com>
Wed, 18 Nov 2020 21:11:42 +0000 (16:11 -0500)
committerChuck Lever <chuck.lever@oracle.com>
Mon, 22 Mar 2021 14:19:01 +0000 (10:19 -0400)
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfsd/nfs3acl.c
fs/nfsd/nfs3xdr.c
fs/nfsd/xdr3.h

index 9a6f18d..1199102 100644 (file)
@@ -168,22 +168,25 @@ static int nfs3svc_decode_setaclargs(struct svc_rqst *rqstp, __be32 *p)
 /* GETACL */
 static int nfs3svc_encode_getaclres(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct xdr_stream *xdr = &rqstp->rq_res_stream;
        struct nfsd3_getaclres *resp = rqstp->rq_resp;
        struct dentry *dentry = resp->fh.fh_dentry;
+       struct kvec *head = rqstp->rq_res.head;
+       struct inode *inode = d_inode(dentry);
+       unsigned int base;
+       int n;
+       int w;
 
-       *p++ = resp->status;
-       p = nfs3svc_encode_post_op_attr(rqstp, p, &resp->fh);
-       if (resp->status == 0 && dentry && d_really_is_positive(dentry)) {
-               struct inode *inode = d_inode(dentry);
-               struct kvec *head = rqstp->rq_res.head;
-               unsigned int base;
-               int n;
-               int w;
-
-               *p++ = htonl(resp->mask);
-               if (!xdr_ressize_check(rqstp, p))
+       if (!svcxdr_encode_nfsstat3(xdr, resp->status))
+               return 0;
+       switch (resp->status) {
+       case nfs_ok:
+               if (!svcxdr_encode_post_op_attr(rqstp, xdr, &resp->fh))
                        return 0;
-               base = (char *)p - (char *)head->iov_base;
+               if (xdr_stream_encode_u32(xdr, resp->mask) < 0)
+                       return 0;
+
+               base = (char *)xdr->p - (char *)head->iov_base;
 
                rqstp->rq_res.page_len = w = nfsacl_size(
                        (resp->mask & NFS_ACL)   ? resp->acl_access  : NULL,
@@ -204,9 +207,11 @@ static int nfs3svc_encode_getaclres(struct svc_rqst *rqstp, __be32 *p)
                                          NFS_ACL_DEFAULT);
                if (n <= 0)
                        return 0;
-       } else
-               if (!xdr_ressize_check(rqstp, p))
+               break;
+       default:
+               if (!svcxdr_encode_post_op_attr(rqstp, xdr, &resp->fh))
                        return 0;
+       }
 
        return 1;
 }
index 646bbfc..941740a 100644 (file)
@@ -107,7 +107,16 @@ svcxdr_decode_nfs_fh3(struct xdr_stream *xdr, struct svc_fh *fhp)
        return true;
 }
 
-static bool
+/**
+ * svcxdr_encode_nfsstat3 - Encode an NFSv3 status code
+ * @xdr: XDR stream
+ * @status: status value to encode
+ *
+ * Return values:
+ *   %false: Send buffer space was exhausted
+ *   %true: Success
+ */
+bool
 svcxdr_encode_nfsstat3(struct xdr_stream *xdr, __be32 status)
 {
        __be32 *p;
@@ -464,7 +473,17 @@ svcxdr_encode_pre_op_attr(struct xdr_stream *xdr, const struct svc_fh *fhp)
        return svcxdr_encode_wcc_attr(xdr, fhp);
 }
 
-static bool
+/**
+ * svcxdr_encode_post_op_attr - Encode NFSv3 post-op attributes
+ * @rqstp: Context of a completed RPC transaction
+ * @xdr: XDR stream
+ * @fhp: File handle to encode
+ *
+ * Return values:
+ *   %false: Send buffer space was exhausted
+ *   %true: Success
+ */
+bool
 svcxdr_encode_post_op_attr(struct svc_rqst *rqstp, struct xdr_stream *xdr,
                           const struct svc_fh *fhp)
 {
index b851458..746c5f7 100644 (file)
@@ -308,5 +308,8 @@ int nfs3svc_encode_entryplus3(void *data, const char *name, int namlen,
 __be32 *nfs3svc_encode_post_op_attr(struct svc_rqst *rqstp, __be32 *p,
                                struct svc_fh *fhp);
 bool svcxdr_decode_nfs_fh3(struct xdr_stream *xdr, struct svc_fh *fhp);
+bool svcxdr_encode_nfsstat3(struct xdr_stream *xdr, __be32 status);
+bool svcxdr_encode_post_op_attr(struct svc_rqst *rqstp, struct xdr_stream *xdr,
+                               const struct svc_fh *fhp);
 
 #endif /* _LINUX_NFSD_XDR3_H */