Skip to content

Commit

Permalink
NFSD: Save location of NFSv4 COMPOUND status
Browse files Browse the repository at this point in the history
Refactor: Currently nfs4svc_encode_compoundres() relies on the NFS
dispatcher to pass in the buffer location of the COMPOUND status.
Instead, save that buffer location in struct nfsd4_compoundres.

The compound tag follows immediately after.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
  • Loading branch information
Chuck Lever authored and J. Bruce Fields committed Oct 13, 2021
1 parent c44b31c commit 3b0ebb2
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 4 deletions.
2 changes: 1 addition & 1 deletion fs/nfsd/nfs4proc.c
Original file line number Diff line number Diff line change
Expand Up @@ -2461,11 +2461,11 @@ nfsd4_proc_compound(struct svc_rqst *rqstp)
__be32 status;

resp->xdr = &rqstp->rq_res_stream;
resp->statusp = resp->xdr->p;

/* reserve space for: NFS status code */
xdr_reserve_space(resp->xdr, XDR_UNIT);

resp->tagp = resp->xdr->p;
/* reserve space for: taglen, tag, and opcnt */
xdr_reserve_space(resp->xdr, XDR_UNIT * 2 + args->taglen);
resp->taglen = args->taglen;
Expand Down
9 changes: 7 additions & 2 deletions fs/nfsd/nfs4xdr.c
Original file line number Diff line number Diff line change
Expand Up @@ -5435,11 +5435,16 @@ nfs4svc_encode_compoundres(struct svc_rqst *rqstp, __be32 *p)
WARN_ON_ONCE(buf->len != buf->head[0].iov_len + buf->page_len +
buf->tail[0].iov_len);

*p = resp->cstate.status;
/*
* Send buffer space for the following items is reserved
* at the top of nfsd4_proc_compound().
*/
p = resp->statusp;

*p++ = resp->cstate.status;

rqstp->rq_next_page = resp->xdr->page_ptr + 1;

p = resp->tagp;
*p++ = htonl(resp->taglen);
memcpy(p, resp->tag, resp->taglen);
p += XDR_QUADLEN(resp->taglen);
Expand Down
3 changes: 2 additions & 1 deletion fs/nfsd/xdr4.h
Original file line number Diff line number Diff line change
Expand Up @@ -702,10 +702,11 @@ struct nfsd4_compoundres {
struct xdr_stream *xdr;
struct svc_rqst * rqstp;

__be32 *statusp;
u32 taglen;
char * tag;
u32 opcnt;
__be32 * tagp; /* tag, opcount encode location */

struct nfsd4_compound_state cstate;
};

Expand Down

0 comments on commit 3b0ebb2

Please sign in to comment.