diff options
-rw-r--r-- | include/sys/sysmacros.h | 4 | ||||
-rw-r--r-- | module/spl/spl-generic.c | 30 |
2 files changed, 34 insertions, 0 deletions
diff --git a/include/sys/sysmacros.h b/include/sys/sysmacros.h index e73c7fd1e..565fc5600 100644 --- a/include/sys/sysmacros.h +++ b/include/sys/sysmacros.h @@ -150,6 +150,7 @@ extern unsigned long spl_hostid; /* Missing misc functions */ extern int highbit(unsigned long i); +extern int highbit64(uint64_t i); extern uint32_t zone_get_hostid(void *zone); extern void spl_setup(void); extern void spl_cleanup(void); @@ -172,6 +173,9 @@ extern void spl_cleanup(void); #ifndef roundup #define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y)) #endif +#ifndef howmany +#define howmany(x, y) (((x) + ((y) - 1)) / (y)) +#endif /* * Compatibility macros/typedefs needed for Solaris -> Linux port diff --git a/module/spl/spl-generic.c b/module/spl/spl-generic.c index 4f0842b1a..6cb73ddb7 100644 --- a/module/spl/spl-generic.c +++ b/module/spl/spl-generic.c @@ -97,6 +97,36 @@ highbit(unsigned long i) } EXPORT_SYMBOL(highbit); +int +highbit64(uint64_t i) +{ + register int h = 1; + SENTRY; + + if (i == 0) + SRETURN(0); + if (i & 0xffffffff00000000ull) { + h += 32; i >>= 32; + } + if (i & 0xffff0000) { + h += 16; i >>= 16; + } + if (i & 0xff00) { + h += 8; i >>= 8; + } + if (i & 0xf0) { + h += 4; i >>= 4; + } + if (i & 0xc) { + h += 2; i >>= 2; + } + if (i & 0x2) { + h += 1; + } + SRETURN(h); +} +EXPORT_SYMBOL(highbit64); + #if BITS_PER_LONG == 32 /* * Support 64/64 => 64 division on a 32-bit platform. While the kernel |