* in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU General Public License
- * version 2 along with this program; If not, see [sun.com URL with a
- * copy of GPLv2].
+ * version 2 along with this program; If not, see
+ * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
#define __LIBCFS_USER_BITOPS_H__
/* test if bit nr is set in bitmap addr; returns previous value of bit nr */
-static __inline__ int set_bit(int nr, unsigned long * addr)
+static __inline__ int set_bit(int nr, unsigned long *addr)
{
- long mask;
+ unsigned long mask;
addr += nr / BITS_PER_LONG;
mask = 1UL << (nr & (BITS_PER_LONG - 1));
}
/* clear bit nr in bitmap addr; returns previous value of bit nr*/
-static __inline__ int clear_bit(int nr, unsigned long * addr)
+static __inline__ int clear_bit(int nr, unsigned long *addr)
{
- long mask;
+ unsigned long mask;
addr += nr / BITS_PER_LONG;
mask = 1UL << (nr & (BITS_PER_LONG - 1));
return nr;
}
-static __inline__ int test_bit(int nr, const unsigned long * addr)
+static __inline__ int test_bit(int nr, const unsigned long *addr)
{
- return ((1UL << (nr & (BITS_PER_LONG - 1))) & ((addr)[nr / BITS_PER_LONG])) != 0;
+ return ((1UL << (nr & (BITS_PER_LONG - 1))) &
+ ((addr)[nr / BITS_PER_LONG])) != 0;
}
/* using binary seach */
+static __inline__ unsigned long __fls(long data)
+{
+ int pos = 32;
+
+ if (!data)
+ return 0;
+
+#if BITS_PER_LONG == 64
+ pos += 32;
+
+ if ((data & 0xFFFFFFFF) == 0) {
+ data <<= 32;
+ pos -= 32;
+ }
+#endif
+
+ if (!(data & 0xFFFF0000u)) {
+ data <<= 16;
+ pos -= 16;
+ }
+ if (!(data & 0xFF000000u)) {
+ data <<= 8;
+ pos -= 8;
+ }
+ if (!(data & 0xF0000000u)) {
+ data <<= 4;
+ pos -= 4;
+ }
+ if (!(data & 0xC0000000u)) {
+ data <<= 2;
+ pos -= 2;
+ }
+ if (!(data & 0x80000000u)) {
+ data <<= 1;
+ pos -= 1;
+ }
+ return pos;
+}
+
static __inline__ unsigned long __ffs(long data)
{
int pos = 0;
}
#define __ffz(x) __ffs(~(x))
+#define __flz(x) __fls(~(x))
unsigned long find_next_bit(unsigned long *addr,
unsigned long size, unsigned long offset);