Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ba8e452a authored by Trond Myklebust's avatar Trond Myklebust
Browse files

SUNRPC: Add a helper function xdr_inline_peek



We sometimes need to be able to read ahead in an xdr_stream without
incrementing the current pointer position.

Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 0715dc63
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -201,6 +201,7 @@ extern __be32 *xdr_reserve_space(struct xdr_stream *xdr, size_t nbytes);
extern void xdr_write_pages(struct xdr_stream *xdr, struct page **pages,
		unsigned int base, unsigned int len);
extern void xdr_init_decode(struct xdr_stream *xdr, struct xdr_buf *buf, __be32 *p);
extern __be32 *xdr_inline_peek(struct xdr_stream *xdr, size_t nbytes);
extern __be32 *xdr_inline_decode(struct xdr_stream *xdr, size_t nbytes);
extern void xdr_read_pages(struct xdr_stream *xdr, unsigned int len);
extern void xdr_enter_page(struct xdr_stream *xdr, unsigned int len);
+21 −0
Original line number Diff line number Diff line
@@ -572,6 +572,27 @@ void xdr_init_decode(struct xdr_stream *xdr, struct xdr_buf *buf, __be32 *p)
}
EXPORT_SYMBOL_GPL(xdr_init_decode);

/**
 * xdr_inline_peek - Allow read-ahead in the XDR data stream
 * @xdr: pointer to xdr_stream struct
 * @nbytes: number of bytes of data to decode
 *
 * Check if the input buffer is long enough to enable us to decode
 * 'nbytes' more bytes of data starting at the current position.
 * If so return the current pointer without updating the current
 * pointer position.
 */
__be32 * xdr_inline_peek(struct xdr_stream *xdr, size_t nbytes)
{
	__be32 *p = xdr->p;
	__be32 *q = p + XDR_QUADLEN(nbytes);

	if (unlikely(q > xdr->end || q < p))
		return NULL;
	return p;
}
EXPORT_SYMBOL_GPL(xdr_inline_peek);

/**
 * xdr_inline_decode - Retrieve non-page XDR data to decode
 * @xdr: pointer to xdr_stream struct