SUNRPC: Add a function for zeroing out a portion of an xdr_stream

This will be used during READ_PLUS decoding for handling HOLE segments.

Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
This commit is contained in:
Anna Schumaker 2022-07-21 14:21:33 -04:00 committed by Trond Myklebust
parent 7c4cd5f4d2
commit e1bd87608d
2 changed files with 25 additions and 0 deletions

View File

@ -265,6 +265,8 @@ extern bool xdr_stream_subsegment(struct xdr_stream *xdr, struct xdr_buf *subbuf
unsigned int len);
extern unsigned int xdr_stream_move_subsegment(struct xdr_stream *xdr, unsigned int offset,
unsigned int target, unsigned int length);
extern unsigned int xdr_stream_zero(struct xdr_stream *xdr, unsigned int offset,
unsigned int length);
/**
* xdr_set_scratch_buffer - Attach a scratch buffer for decoding data.

View File

@ -1769,6 +1769,29 @@ unsigned int xdr_stream_move_subsegment(struct xdr_stream *xdr, unsigned int off
}
EXPORT_SYMBOL_GPL(xdr_stream_move_subsegment);
/**
* xdr_stream_zero - zero out a portion of an xdr_stream
* @xdr: an xdr_stream to zero out
* @offset: the starting point in the stream
* @length: the number of bytes to zero
*/
unsigned int xdr_stream_zero(struct xdr_stream *xdr, unsigned int offset,
unsigned int length)
{
struct xdr_buf buf;
if (xdr_buf_subsegment(xdr->buf, &buf, offset, length) < 0)
return 0;
if (buf.head[0].iov_len)
xdr_buf_iov_zero(buf.head, 0, buf.head[0].iov_len);
if (buf.page_len > 0)
xdr_buf_pages_zero(&buf, 0, buf.page_len);
if (buf.tail[0].iov_len)
xdr_buf_iov_zero(buf.tail, 0, buf.tail[0].iov_len);
return length;
}
EXPORT_SYMBOL_GPL(xdr_stream_zero);
/**
* xdr_buf_trim - lop at most "len" bytes off the end of "buf"
* @buf: buf to be trimmed