static int nfs3svc_decode_setaclargs(struct svc_rqst *rqstp, __be32 *p, struct nfsd3_setaclargs *args) { struct kvec *head = rqstp->rq_arg.head; unsigned int base; int n; p = nfs3svc_decode_fh(p, &args->fh); if (!p) return 0; args->mask = ntohl(*p++); if (args->mask & ~NFS_ACL_MASK || !xdr_argsize_check(rqstp, p)) return 0; base = (char *)p - (char *)head->iov_base; n = nfsacl_decode(&rqstp->rq_arg, base, NULL, (args->mask & NFS_ACL) ? &args->acl_access : NULL); if (n > 0) n = nfsacl_decode(&rqstp->rq_arg, base + n, NULL, (args->mask & NFS_DFACL) ? &args->acl_default : NULL); return (n > 0); }
static inline int decode_getacl3resok(struct xdr_stream *xdr, struct nfs3_getaclres *result) { struct posix_acl **acl; unsigned int *aclcnt; size_t hdrlen; int error; error = decode_post_op_attr(xdr, result->fattr); if (unlikely(error)) goto out; error = decode_uint32(xdr, &result->mask); if (unlikely(error)) goto out; error = -EINVAL; if (result->mask & ~(NFS_ACL|NFS_ACLCNT|NFS_DFACL|NFS_DFACLCNT)) goto out; hdrlen = (u8 *)xdr->p - (u8 *)xdr->iov->iov_base; acl = NULL; if (result->mask & NFS_ACL) acl = &result->acl_access; aclcnt = NULL; if (result->mask & NFS_ACLCNT) aclcnt = &result->acl_access_count; error = nfsacl_decode(xdr->buf, hdrlen, aclcnt, acl); if (unlikely(error <= 0)) goto out; acl = NULL; if (result->mask & NFS_DFACL) acl = &result->acl_default; aclcnt = NULL; if (result->mask & NFS_DFACLCNT) aclcnt = &result->acl_default_count; error = nfsacl_decode(xdr->buf, hdrlen + error, aclcnt, acl); if (unlikely(error <= 0)) return error; error = 0; out: return error; }