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: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
0715dc632a
commit
ba8e452a4f
|
@ -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,
|
extern void xdr_write_pages(struct xdr_stream *xdr, struct page **pages,
|
||||||
unsigned int base, unsigned int len);
|
unsigned int base, unsigned int len);
|
||||||
extern void xdr_init_decode(struct xdr_stream *xdr, struct xdr_buf *buf, __be32 *p);
|
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 __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_read_pages(struct xdr_stream *xdr, unsigned int len);
|
||||||
extern void xdr_enter_page(struct xdr_stream *xdr, unsigned int len);
|
extern void xdr_enter_page(struct xdr_stream *xdr, unsigned int len);
|
||||||
|
|
|
@ -572,6 +572,27 @@ void xdr_init_decode(struct xdr_stream *xdr, struct xdr_buf *buf, __be32 *p)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(xdr_init_decode);
|
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_inline_decode - Retrieve non-page XDR data to decode
|
||||||
* @xdr: pointer to xdr_stream struct
|
* @xdr: pointer to xdr_stream struct
|
||||||
|
|
Reference in New Issue