OSDN Git Service

SUNRPC: Add a function for zeroing out a portion of an xdr_stream
authorAnna Schumaker <Anna.Schumaker@Netapp.com>
Thu, 21 Jul 2022 18:21:33 +0000 (14:21 -0400)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Sat, 23 Jul 2022 19:38:29 +0000 (15:38 -0400)
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>
include/linux/sunrpc/xdr.h
net/sunrpc/xdr.c

index 8cd38a9..f0ab06a 100644 (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.
index e4ac700..f09a7ab 100644 (file)
@@ -1770,6 +1770,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
  * @len: number of bytes to reduce "buf" by