Commit dae9a6ca authored by Chuck Lever's avatar Chuck Lever Committed by J. Bruce Fields
Browse files

NFSD: Have legacy NFSD WRITE decoders use xdr_stream_subsegment()



Refactor.

Now that the NFSv2 and NFSv3 XDR decoders have been converted to
use xdr_streams, the WRITE decoder functions can use
xdr_stream_subsegment() to extract the WRITE payload into its own
xdr_buf, just as the NFSv4 WRITE XDR decoder currently does.

That makes it possible to pass the first kvec, pages array + length,
page_base, and total payload length via a single function parameter.

The payload's page_base is not yet assigned or used, but will be in
subsequent patches.

Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
Signed-off-by: default avatarJ. Bruce Fields <bfields@redhat.com>
parent f49b68dd
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -201,8 +201,7 @@ nfsd3_proc_write(struct svc_rqst *rqstp)

	fh_copy(&resp->fh, &argp->fh);
	resp->committed = argp->stable;
	nvecs = svc_fill_write_vector(rqstp, rqstp->rq_arg.pages,
				      &argp->first, cnt);
	nvecs = svc_fill_write_vector(rqstp, &argp->payload);
	if (!nvecs) {
		resp->status = nfserr_io;
		goto out;
+2 −10
Original line number Diff line number Diff line
@@ -621,9 +621,6 @@ nfs3svc_decode_writeargs(struct svc_rqst *rqstp, __be32 *p)
	struct xdr_stream *xdr = &rqstp->rq_arg_stream;
	struct nfsd3_writeargs *args = rqstp->rq_argp;
	u32 max_blocksize = svc_max_payload(rqstp);
	struct kvec *head = rqstp->rq_arg.head;
	struct kvec *tail = rqstp->rq_arg.tail;
	size_t remaining;

	if (!svcxdr_decode_nfs_fh3(xdr, &args->fh))
		return 0;
@@ -641,17 +638,12 @@ nfs3svc_decode_writeargs(struct svc_rqst *rqstp, __be32 *p)
	/* request sanity */
	if (args->count != args->len)
		return 0;
	remaining = head->iov_len + rqstp->rq_arg.page_len + tail->iov_len;
	remaining -= xdr_stream_pos(xdr);
	if (remaining < xdr_align_size(args->len))
		return 0;
	if (args->count > max_blocksize) {
		args->count = max_blocksize;
		args->len = max_blocksize;
	}

	args->first.iov_base = xdr->p;
	args->first.iov_len = head->iov_len - xdr_stream_pos(xdr);
	if (!xdr_stream_subsegment(xdr, &args->payload, args->count))
		return 0;

	return 1;
}
+1 −2
Original line number Diff line number Diff line
@@ -1033,8 +1033,7 @@ nfsd4_write(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,

	write->wr_how_written = write->wr_stable_how;

	nvecs = svc_fill_write_vector(rqstp, write->wr_payload.pages,
				      write->wr_payload.head, write->wr_buflen);
	nvecs = svc_fill_write_vector(rqstp, &write->wr_payload);
	WARN_ON_ONCE(nvecs > ARRAY_SIZE(rqstp->rq_vec));

	status = nfsd_vfs_write(rqstp, &cstate->current_fh, nf,
+1 −2
Original line number Diff line number Diff line
@@ -234,8 +234,7 @@ nfsd_proc_write(struct svc_rqst *rqstp)
		SVCFH_fmt(&argp->fh),
		argp->len, argp->offset);

	nvecs = svc_fill_write_vector(rqstp, rqstp->rq_arg.pages,
				      &argp->first, cnt);
	nvecs = svc_fill_write_vector(rqstp, &argp->payload);
	if (!nvecs) {
		resp->status = nfserr_io;
		goto out;
+1 −8
Original line number Diff line number Diff line
@@ -325,10 +325,7 @@ nfssvc_decode_writeargs(struct svc_rqst *rqstp, __be32 *p)
{
	struct xdr_stream *xdr = &rqstp->rq_arg_stream;
	struct nfsd_writeargs *args = rqstp->rq_argp;
	struct kvec *head = rqstp->rq_arg.head;
	struct kvec *tail = rqstp->rq_arg.tail;
	u32 beginoffset, totalcount;
	size_t remaining;

	if (!svcxdr_decode_fhandle(xdr, &args->fh))
		return 0;
@@ -346,12 +343,8 @@ nfssvc_decode_writeargs(struct svc_rqst *rqstp, __be32 *p)
		return 0;
	if (args->len > NFSSVC_MAXBLKSIZE_V2)
		return 0;
	remaining = head->iov_len + rqstp->rq_arg.page_len + tail->iov_len;
	remaining -= xdr_stream_pos(xdr);
	if (remaining < xdr_align_size(args->len))
	if (!xdr_stream_subsegment(xdr, &args->payload, args->len))
		return 0;
	args->first.iov_base = xdr->p;
	args->first.iov_len = head->iov_len - xdr_stream_pos(xdr);

	return 1;
}
Loading