[PATCH 1/2] libfrog: add memchr_inv

Darrick J. Wong
2024-10-11T01:24:19Z

Add this kernel function so we can use it in userspace.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
[hch: split from a larger patch]
Signed-off-by: Christoph Hellwig <hch@lst.de>
---
libfrog/util.c | 14 ++++++++++++++
libfrog/util.h | 4 ++++
2 files changed, 18 insertions(+)

diff --git a/libfrog/util.c b/libfrog/util.c
index 8fb10cf82f5ca4..46047571a5531f 100644
--- a/libfrog/util.c
+++ b/libfrog/util.c
@@ -22,3 +22,17 @@ log2_roundup(unsigned int i)
}
return rval;
}
+
+void *
+memchr_inv(const void *start, int c, size_t bytes)
+{
+ const unsigned char *p = start;
+
+ while (bytes > 0) {
+ if (*p != (unsigned char)c)
+ return (void *)p;
+ bytes--;
+ }
+
+ return NULL;
+}
diff --git a/libfrog/util.h b/libfrog/util.h
index 5df95e69cd11da..8b4ee7c1333b6b 100644
--- a/libfrog/util.h
+++ b/libfrog/util.h
@@ -6,6 +6,8 @@
#ifndef __LIBFROG_UTIL_H__
#define __LIBFROG_UTIL_H__

+#include <sys/types.h>
+
unsigned int log2_roundup(unsigned int i);

#define min_t(type,x,y) \
@@ -13,4 +15,6 @@ unsigned int log2_roundup(unsigned int i);
#define max_t(type,x,y) \
({ type __x = (x); type __y = (y); __x > __y ? __x: __y; })

+void *memchr_inv(const void *start, int c, size_t bytes);
+
#endif /* __LIBFROG_UTIL_H__ */