Commit 78315b36 authored by Chuck Lever's avatar Chuck Lever
Browse files

NFSD: Update the NFSv3 CREATE family of encoders to use struct xdr_stream

parent ecb7a085
Loading
Loading
Loading
Loading
+28 −7
Original line number Diff line number Diff line
@@ -121,6 +121,17 @@ svcxdr_encode_nfs_fh3(struct xdr_stream *xdr, const struct svc_fh *fhp)
	return true;
}

static bool
svcxdr_encode_post_op_fh3(struct xdr_stream *xdr, const struct svc_fh *fhp)
{
	if (xdr_stream_encode_item_present(xdr) < 0)
		return false;
	if (!svcxdr_encode_nfs_fh3(xdr, fhp))
		return false;

	return true;
}

static __be32 *
encode_fh(__be32 *p, struct svc_fh *fhp)
{
@@ -1079,16 +1090,26 @@ nfs3svc_encode_writeres(struct svc_rqst *rqstp, __be32 *p)
int
nfs3svc_encode_createres(struct svc_rqst *rqstp, __be32 *p)
{
	struct xdr_stream *xdr = &rqstp->rq_res_stream;
	struct nfsd3_diropres *resp = rqstp->rq_resp;

	*p++ = resp->status;
	if (resp->status == 0) {
		*p++ = xdr_one;
		p = encode_fh(p, &resp->fh);
		p = encode_post_op_attr(rqstp, p, &resp->fh);
	if (!svcxdr_encode_nfsstat3(xdr, resp->status))
		return 0;
	switch (resp->status) {
	case nfs_ok:
		if (!svcxdr_encode_post_op_fh3(xdr, &resp->fh))
			return 0;
		if (!svcxdr_encode_post_op_attr(rqstp, xdr, &resp->fh))
			return 0;
		if (!svcxdr_encode_wcc_data(rqstp, xdr, &resp->dirfh))
			return 0;
		break;
	default:
		if (!svcxdr_encode_wcc_data(rqstp, xdr, &resp->dirfh))
			return 0;
	}
	p = encode_wcc_data(rqstp, p, &resp->dirfh);
	return xdr_ressize_check(rqstp, p);

	return 1;
}

/* RENAME */