]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - fs/xfs/xfs_bit.h
Merge branch 'core-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-2.6-omap-h63xx.git] / fs / xfs / xfs_bit.h
index 325a007dec91de7942df66db18afc0be2199a61c..8e0e463dae2d7c0f55268c46683110a01a42405b 100644 (file)
@@ -61,15 +61,24 @@ static inline int xfs_highbit64(__uint64_t v)
 /* Get low bit set out of 32-bit argument, -1 if none set */
 static inline int xfs_lowbit32(__uint32_t v)
 {
-       __uint32_t t = v;
-       return (t) ? find_first_bit((unsigned long *)&t, 32) : -1;
+       unsigned long   t = v;
+       return (v) ? find_first_bit(&t, 32) : -1;
 }
 
 /* Get low bit set out of 64-bit argument, -1 if none set */
 static inline int xfs_lowbit64(__uint64_t v)
 {
-       __uint64_t t = v;
-       return (t) ? find_first_bit((unsigned long *)&t, 64) : -1;
+       __uint32_t      w = (__uint32_t)v;
+       int             n = 0;
+
+       if (w) {        /* lower bits */
+               n = ffs(w);
+       } else {        /* upper bits */
+               w = (__uint32_t)(v >> 32);
+               if (w && (n = ffs(w)))
+               n += 32;
+       }
+       return n - 1;
 }
 
 /* Return whether bitmap is empty (1 == empty) */