Loading fs/nfsd/nfs3acl.c +19 −14 Original line number Diff line number Diff line Loading @@ -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; *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; struct inode *inode = d_inode(dentry); 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; if (xdr_stream_encode_u32(xdr, resp->mask) < 0) return 0; base = (char *)p - (char *)head->iov_base; base = (char *)xdr->p - (char *)head->iov_base; rqstp->rq_res.page_len = w = nfsacl_size( (resp->mask & NFS_ACL) ? resp->acl_access : NULL, Loading @@ -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; } Loading fs/nfsd/nfs3xdr.c +21 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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) { Loading fs/nfsd/xdr3.h +3 −0 Original line number Diff line number Diff line Loading @@ -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 */ Loading
fs/nfsd/nfs3acl.c +19 −14 Original line number Diff line number Diff line Loading @@ -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; *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; struct inode *inode = d_inode(dentry); 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; if (xdr_stream_encode_u32(xdr, resp->mask) < 0) return 0; base = (char *)p - (char *)head->iov_base; base = (char *)xdr->p - (char *)head->iov_base; rqstp->rq_res.page_len = w = nfsacl_size( (resp->mask & NFS_ACL) ? resp->acl_access : NULL, Loading @@ -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; } Loading
fs/nfsd/nfs3xdr.c +21 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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) { Loading
fs/nfsd/xdr3.h +3 −0 Original line number Diff line number Diff line Loading @@ -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 */