Merge tag 'drm-next-2021-04-30' of git://anongit.freedesktop.org/drm/drm
[linux-2.6-microblaze.git] / fs / nfsd / nfs2acl.c
index 855e177..4b43929 100644 (file)
@@ -242,79 +242,61 @@ static int nfsaclsvc_decode_accessargs(struct svc_rqst *rqstp, __be32 *p)
 /* GETACL */
 static int nfsaclsvc_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 inode *inode;
-       struct kvec *head = rqstp->rq_res.head;
-       unsigned int base;
-       int n;
        int w;
 
-       *p++ = resp->status;
-       if (resp->status != nfs_ok)
-               return xdr_ressize_check(rqstp, p);
+       if (!svcxdr_encode_stat(xdr, resp->status))
+               return 0;
 
-       /*
-        * Since this is version 2, the check for nfserr in
-        * nfsd_dispatch actually ensures the following cannot happen.
-        * However, it seems fragile to depend on that.
-        */
        if (dentry == NULL || d_really_is_negative(dentry))
-               return 0;
+               return 1;
        inode = d_inode(dentry);
 
-       p = nfs2svc_encode_fattr(rqstp, p, &resp->fh, &resp->stat);
-       *p++ = htonl(resp->mask);
-       if (!xdr_ressize_check(rqstp, p))
+       if (!svcxdr_encode_fattr(rqstp, xdr, &resp->fh, &resp->stat))
+               return 0;
+       if (xdr_stream_encode_u32(xdr, resp->mask) < 0)
                return 0;
-       base = (char *)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 0;
+                       return 1;
                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);
-       return (n > 0);
-}
-
-static int nfsaclsvc_encode_attrstatres(struct svc_rqst *rqstp, __be32 *p)
-{
-       struct nfsd_attrstat *resp = rqstp->rq_resp;
-
-       *p++ = resp->status;
-       if (resp->status != nfs_ok)
-               goto out;
+       if (!nfs_stream_encode_acl(xdr, inode, resp->acl_access,
+                                  resp->mask & NFS_ACL, 0))
+               return 0;
+       if (!nfs_stream_encode_acl(xdr, inode, resp->acl_default,
+                                  resp->mask & NFS_DFACL, NFS_ACL_DEFAULT))
+               return 0;
 
-       p = nfs2svc_encode_fattr(rqstp, p, &resp->fh, &resp->stat);
-out:
-       return xdr_ressize_check(rqstp, p);
+       return 1;
 }
 
 /* ACCESS */
 static int nfsaclsvc_encode_accessres(struct svc_rqst *rqstp, __be32 *p)
 {
+       struct xdr_stream *xdr = &rqstp->rq_res_stream;
        struct nfsd3_accessres *resp = rqstp->rq_resp;
 
-       *p++ = resp->status;
-       if (resp->status != nfs_ok)
-               goto out;
+       if (!svcxdr_encode_stat(xdr, resp->status))
+               return 0;
+       switch (resp->status) {
+       case nfs_ok:
+               if (!svcxdr_encode_fattr(rqstp, xdr, &resp->fh, &resp->stat))
+                       return 0;
+               if (xdr_stream_encode_u32(xdr, resp->access) < 0)
+                       return 0;
+               break;
+       }
 
-       p = nfs2svc_encode_fattr(rqstp, p, &resp->fh, &resp->stat);
-       *p++ = htonl(resp->access);
-out:
-       return xdr_ressize_check(rqstp, p);
+       return 1;
 }
 
 /*
@@ -329,13 +311,6 @@ static void nfsaclsvc_release_getacl(struct svc_rqst *rqstp)
        posix_acl_release(resp->acl_default);
 }
 
-static void nfsaclsvc_release_attrstat(struct svc_rqst *rqstp)
-{
-       struct nfsd_attrstat *resp = rqstp->rq_resp;
-
-       fh_put(&resp->fh);
-}
-
 static void nfsaclsvc_release_access(struct svc_rqst *rqstp)
 {
        struct nfsd3_accessres *resp = rqstp->rq_resp;
@@ -375,8 +350,8 @@ static const struct svc_procedure nfsd_acl_procedures2[5] = {
        [ACLPROC2_SETACL] = {
                .pc_func = nfsacld_proc_setacl,
                .pc_decode = nfsaclsvc_decode_setaclargs,
-               .pc_encode = nfsaclsvc_encode_attrstatres,
-               .pc_release = nfsaclsvc_release_attrstat,
+               .pc_encode = nfssvc_encode_attrstatres,
+               .pc_release = nfssvc_release_attrstat,
                .pc_argsize = sizeof(struct nfsd3_setaclargs),
                .pc_ressize = sizeof(struct nfsd_attrstat),
                .pc_cachetype = RC_NOCACHE,
@@ -386,8 +361,8 @@ static const struct svc_procedure nfsd_acl_procedures2[5] = {
        [ACLPROC2_GETATTR] = {
                .pc_func = nfsacld_proc_getattr,
                .pc_decode = nfssvc_decode_fhandleargs,
-               .pc_encode = nfsaclsvc_encode_attrstatres,
-               .pc_release = nfsaclsvc_release_attrstat,
+               .pc_encode = nfssvc_encode_attrstatres,
+               .pc_release = nfssvc_release_attrstat,
                .pc_argsize = sizeof(struct nfsd_fhandle),
                .pc_ressize = sizeof(struct nfsd_attrstat),
                .pc_cachetype = RC_NOCACHE,