NFSD: Update the NFSv3 GETACL result encoder to use struct xdr_stream
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
This commit is contained in:
parent
83d0b84572
commit
20798dfe24
@ -168,22 +168,25 @@ static int nfs3svc_decode_setaclargs(struct svc_rqst *rqstp, __be32 *p)
|
|||||||
/* GETACL */
|
/* GETACL */
|
||||||
static int nfs3svc_encode_getaclres(struct svc_rqst *rqstp, __be32 *p)
|
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 nfsd3_getaclres *resp = rqstp->rq_resp;
|
||||||
struct dentry *dentry = resp->fh.fh_dentry;
|
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;
|
if (!svcxdr_encode_nfsstat3(xdr, resp->status))
|
||||||
p = nfs3svc_encode_post_op_attr(rqstp, p, &resp->fh);
|
return 0;
|
||||||
if (resp->status == 0 && dentry && d_really_is_positive(dentry)) {
|
switch (resp->status) {
|
||||||
struct inode *inode = d_inode(dentry);
|
case nfs_ok:
|
||||||
struct kvec *head = rqstp->rq_res.head;
|
if (!svcxdr_encode_post_op_attr(rqstp, xdr, &resp->fh))
|
||||||
unsigned int base;
|
|
||||||
int n;
|
|
||||||
int w;
|
|
||||||
|
|
||||||
*p++ = htonl(resp->mask);
|
|
||||||
if (!xdr_ressize_check(rqstp, p))
|
|
||||||
return 0;
|
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(
|
rqstp->rq_res.page_len = w = nfsacl_size(
|
||||||
(resp->mask & NFS_ACL) ? resp->acl_access : NULL,
|
(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);
|
NFS_ACL_DEFAULT);
|
||||||
if (n <= 0)
|
if (n <= 0)
|
||||||
return 0;
|
return 0;
|
||||||
} else
|
break;
|
||||||
if (!xdr_ressize_check(rqstp, p))
|
default:
|
||||||
|
if (!svcxdr_encode_post_op_attr(rqstp, xdr, &resp->fh))
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -107,7 +107,16 @@ svcxdr_decode_nfs_fh3(struct xdr_stream *xdr, struct svc_fh *fhp)
|
|||||||
return true;
|
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)
|
svcxdr_encode_nfsstat3(struct xdr_stream *xdr, __be32 status)
|
||||||
{
|
{
|
||||||
__be32 *p;
|
__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);
|
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,
|
svcxdr_encode_post_op_attr(struct svc_rqst *rqstp, struct xdr_stream *xdr,
|
||||||
const struct svc_fh *fhp)
|
const struct svc_fh *fhp)
|
||||||
{
|
{
|
||||||
|
@ -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,
|
__be32 *nfs3svc_encode_post_op_attr(struct svc_rqst *rqstp, __be32 *p,
|
||||||
struct svc_fh *fhp);
|
struct svc_fh *fhp);
|
||||||
bool svcxdr_decode_nfs_fh3(struct xdr_stream *xdr, 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 */
|
#endif /* _LINUX_NFSD_XDR3_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user