<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">
From: David Howells &lt;dhowells@redhat.com&gt;

The attached patch provides an out-of-line implementation of find_next_bit()
and rearranges linux/bitops.h to avoid a dependency loop between inline
functions in there and in asm/bitops.h trying to include one another.

Signed-Off-By: David Howells &lt;dhowells@redhat.com&gt;
Signed-off-by: Andrew Morton &lt;akpm@osdl.org&gt;
---

 25-akpm/include/linux/bitops.h |    3 +-
 25-akpm/lib/Makefile           |    1 
 25-akpm/lib/find_next_bit.c    |   55 +++++++++++++++++++++++++++++++++++++++++
 3 files changed, 58 insertions(+), 1 deletion(-)

diff -puN include/linux/bitops.h~out-of-line-implementation-of-find_next_bit include/linux/bitops.h
--- 25/include/linux/bitops.h~out-of-line-implementation-of-find_next_bit	Mon Nov  8 14:48:51 2004
+++ 25-akpm/include/linux/bitops.h	Mon Nov  8 14:48:51 2004
@@ -1,7 +1,6 @@
 #ifndef _LINUX_BITOPS_H
 #define _LINUX_BITOPS_H
 #include &lt;asm/types.h&gt;
-#include &lt;asm/bitops.h&gt;
 
 /*
  * ffs: find first bit set. This is defined the same way as
@@ -71,6 +70,8 @@ extern __inline__ int generic_fls(int x)
 	return r;
 }
 
+#include &lt;asm/bitops.h&gt;
+
 extern __inline__ int get_bitmask_order(unsigned int count)
 {
 	int order;
diff -puN /dev/null lib/find_next_bit.c
--- /dev/null	Thu Apr 11 07:25:15 2002
+++ 25-akpm/lib/find_next_bit.c	Mon Nov  8 14:48:51 2004
@@ -0,0 +1,55 @@
+/* find_next_bit.c: fallback find next bit implementation
+ *
+ * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
+ * Written by David Howells (dhowells@redhat.com)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ */
+
+#include &lt;linux/bitops.h&gt;
+
+int find_next_bit(const unsigned long *addr, int size, int offset)
+{
+	const unsigned long *base;
+	const int NBITS = sizeof(*addr) * 8;
+	unsigned long tmp;
+
+	base = addr;
+	if (offset) {
+		int suboffset;
+
+		addr += offset / NBITS;
+
+		suboffset = offset % NBITS;
+		if (suboffset) {
+			tmp = *addr;
+			tmp &gt;&gt;= suboffset;
+			if (tmp)
+				goto finish;
+		}
+
+		addr++;
+	}
+
+	while ((tmp = *addr) == 0)
+		addr++;
+
+	offset = (addr - base) * NBITS;
+
+ finish:
+	/* count the remaining bits without using __ffs() since that takes a 32-bit arg */
+	while (!(tmp &amp; 0xff)) {
+		offset += 8;
+		tmp &gt;&gt;= 8;
+	}
+
+	while (!(tmp &amp; 1)) {
+		offset++;
+		tmp &gt;&gt;= 1;
+	}
+
+	return offset;
+}
diff -puN lib/Makefile~out-of-line-implementation-of-find_next_bit lib/Makefile
--- 25/lib/Makefile~out-of-line-implementation-of-find_next_bit	Mon Nov  8 14:48:51 2004
+++ 25-akpm/lib/Makefile	Mon Nov  8 14:48:51 2004
@@ -14,6 +14,7 @@ endif
 
 lib-$(CONFIG_RWSEM_GENERIC_SPINLOCK) += rwsem-spinlock.o
 lib-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem.o
+lib-$(CONFIG_GENERIC_FIND_NEXT_BIT) += find_next_bit.o
 obj-$(CONFIG_LOCK_KERNEL) += kernel_lock.o
 
 ifneq ($(CONFIG_HAVE_DEC_LOCK),y) 
_
</pre></body></html>