diff --git a/autoconf/spl-build.m4 b/autoconf/spl-build.m4 index 2f09fa87e5..b311902e93 100644 --- a/autoconf/spl-build.m4 +++ b/autoconf/spl-build.m4 @@ -439,3 +439,21 @@ AC_DEFUN([SPL_AC_CTL_UNNUMBERED], AC_MSG_RESULT(no) ]) ]) + +dnl # +dnl # 2.6.16 API change. +dnl # Check if 'fls64()' is available +dnl # +AC_DEFUN([SPL_AC_FLS64], + [AC_MSG_CHECKING([whether fls64() is available]) + SPL_LINUX_TRY_COMPILE([ + #include + ],[ + return fls64(0); + ],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_FLS64, 1, [fls64() is available]) + ],[ + AC_MSG_RESULT(no) + ]) +]) diff --git a/configure.ac b/configure.ac index c4d424ea02..99d341a661 100644 --- a/configure.ac +++ b/configure.ac @@ -51,6 +51,7 @@ SPL_AC_SET_SHRINKER SPL_AC_PATH_IN_NAMEIDATA SPL_AC_TASK_CURR SPL_AC_CTL_UNNUMBERED +SPL_AC_FLS64 TOPDIR=`/bin/pwd` diff --git a/include/linux/bitops_compat.c b/include/linux/bitops_compat.c new file mode 100644 index 0000000000..8e1e25809a --- /dev/null +++ b/include/linux/bitops_compat.c @@ -0,0 +1,19 @@ +#ifndef _SPL_BITOPS_COMPAT_H +#define _SPL_BITOPS_COMPAT_H + +#include + +#ifndef HAVE_FLS64 + +static inline int fls64(__u64 x) +{ + __u32 h = x >> 32; + if (h) + return fls(h) + 32; + return fls(x); +} + +#endif /* HAVE_FLS64 */ + +#endif /* _SPL_BITOPS_COMPAT_H */ +