|
@@ -751,3 +751,38 @@ size_t sg_pcopy_to_buffer(struct scatterlist *sgl, unsigned int nents,
|
|
|
return sg_copy_buffer(sgl, nents, buf, buflen, skip, true);
|
|
|
}
|
|
|
EXPORT_SYMBOL(sg_pcopy_to_buffer);
|
|
|
+
|
|
|
+/**
|
|
|
+ * sg_zero_buffer - Zero-out a part of a SG list
|
|
|
+ * @sgl: The SG list
|
|
|
+ * @nents: Number of SG entries
|
|
|
+ * @buflen: The number of bytes to zero out
|
|
|
+ * @skip: Number of bytes to skip before zeroing
|
|
|
+ *
|
|
|
+ * Returns the number of bytes zeroed.
|
|
|
+ **/
|
|
|
+size_t sg_zero_buffer(struct scatterlist *sgl, unsigned int nents,
|
|
|
+ size_t buflen, off_t skip)
|
|
|
+{
|
|
|
+ unsigned int offset = 0;
|
|
|
+ struct sg_mapping_iter miter;
|
|
|
+ unsigned int sg_flags = SG_MITER_ATOMIC | SG_MITER_TO_SG;
|
|
|
+
|
|
|
+ sg_miter_start(&miter, sgl, nents, sg_flags);
|
|
|
+
|
|
|
+ if (!sg_miter_skip(&miter, skip))
|
|
|
+ return false;
|
|
|
+
|
|
|
+ while (offset < buflen && sg_miter_next(&miter)) {
|
|
|
+ unsigned int len;
|
|
|
+
|
|
|
+ len = min(miter.length, buflen - offset);
|
|
|
+ memset(miter.addr, 0, len);
|
|
|
+
|
|
|
+ offset += len;
|
|
|
+ }
|
|
|
+
|
|
|
+ sg_miter_stop(&miter);
|
|
|
+ return offset;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(sg_zero_buffer);
|