NFSD: Finish converting the NFSv3 GETACL result encoder
authorChuck Lever <chuck.lever@oracle.com>
Sun, 16 Oct 2022 15:47:08 +0000 (11:47 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 31 Dec 2022 12:31:58 +0000 (13:31 +0100)
[ Upstream commit 841fd0a3cb490eae5dfd262eccb8c8b11d57f8b8 ]

For some reason, the NFSv2 GETACL result encoder was fully converted
to use the new nfs_stream_encode_acl(), but the NFSv3 equivalent was
not similarly converted.

Fixes: 20798dfe249a ("NFSD: Update the NFSv3 GETACL result encoder to use struct xdr_stream")
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/nfsd/nfs3acl.c

index 2fb9ee3..a34a22e 100644 (file)
@@ -171,11 +171,7 @@ nfs3svc_encode_getaclres(struct svc_rqst *rqstp, struct xdr_stream *xdr)
 {
        struct nfsd3_getaclres *resp = rqstp->rq_resp;
        struct dentry *dentry = resp->fh.fh_dentry;
-       struct kvec *head = rqstp->rq_res.head;
        struct inode *inode;
-       unsigned int base;
-       int n;
-       int w;
 
        if (!svcxdr_encode_nfsstat3(xdr, resp->status))
                return false;
@@ -187,26 +183,12 @@ nfs3svc_encode_getaclres(struct svc_rqst *rqstp, struct xdr_stream *xdr)
                if (xdr_stream_encode_u32(xdr, resp->mask) < 0)
                        return false;
 
-               base = (char *)xdr->p - (char *)head->iov_base;
-
-               rqstp->rq_res.page_len = w = nfsacl_size(
-                       (resp->mask & NFS_ACL)   ? resp->acl_access  : NULL,
-                       (resp->mask & NFS_DFACL) ? resp->acl_default : NULL);
-               while (w > 0) {
-                       if (!*(rqstp->rq_next_page++))
-                               return false;
-                       w -= PAGE_SIZE;
-               }
-
-               n = nfsacl_encode(&rqstp->rq_res, base, inode,
-                                 resp->acl_access,
-                                 resp->mask & NFS_ACL, 0);
-               if (n > 0)
-                       n = nfsacl_encode(&rqstp->rq_res, base + n, inode,
-                                         resp->acl_default,
-                                         resp->mask & NFS_DFACL,
-                                         NFS_ACL_DEFAULT);
-               if (n <= 0)
+               if (!nfs_stream_encode_acl(xdr, inode, resp->acl_access,
+                                          resp->mask & NFS_ACL, 0))
+                       return false;
+               if (!nfs_stream_encode_acl(xdr, inode, resp->acl_default,
+                                          resp->mask & NFS_DFACL,
+                                          NFS_ACL_DEFAULT))
                        return false;
                break;
        default: