]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - fs/xfs/xfs_bit.c
x86_64: support poll() on /dev/mcelog
[linux-2.6-omap-h63xx.git] / fs / xfs / xfs_bit.c
index 76c9ad3875ef8aeb6574475676fca2cf257cf329..fab0b6d5a41be3916ac8893a2f82f142cd4443f4 100644 (file)
@@ -1,51 +1,35 @@
 /*
- * Copyright (c) 2000-2004 Silicon Graphics, Inc.  All Rights Reserved.
+ * Copyright (c) 2000-2005 Silicon Graphics, Inc.
+ * All Rights Reserved.
  *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of version 2 of the GNU General Public License as
+ * 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.
  *
- * This program is distributed in the hope that it would be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * This program is distributed in the hope that it would be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
  *
- * Further, this software is distributed without any warranty that it is
- * free of the rightful claim of any third person regarding infringement
- * or the like.  Any license provided herein, whether implied or
- * otherwise, applies only to this software file.  Patent licenses, if
- * any, provided herein do not apply to combinations of this program with
- * other software, or any other product whatsoever.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write the Free Software Foundation, Inc., 59
- * Temple Place - Suite 330, Boston MA 02111-1307, USA.
- *
- * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
- * Mountain View, CA  94043, or:
- *
- * http://www.sgi.com
- *
- * For further information regarding this notice, see:
- *
- * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/
- */
-
-/*
- * XFS bit manipulation routines, used in non-realtime code.
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write the Free Software Foundation,
+ * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  */
-
 #include "xfs.h"
 #include "xfs_bit.h"
 #include "xfs_log.h"
 #include "xfs_trans.h"
 #include "xfs_buf_item.h"
 
+/*
+ * XFS bit manipulation routines, used in non-realtime code.
+ */
 
 #ifndef HAVE_ARCH_HIGHBIT
 /*
  * Index of high bit number in byte, -1 for none set, 0..7 otherwise.
  */
-STATIC const char xfs_highbit[256] = {
+static const char xfs_highbit[256] = {
        -1, 0, 1, 1, 2, 2, 2, 2,                        /* 00 .. 07 */
        3, 3, 3, 3, 3, 3, 3, 3,                 /* 08 .. 0f */
        4, 4, 4, 4, 4, 4, 4, 4,                 /* 10 .. 17 */
@@ -81,44 +65,6 @@ STATIC const char xfs_highbit[256] = {
 };
 #endif
 
-/*
- * Count of bits set in byte, 0..8.
- */
-static const char xfs_countbit[256] = {
-       0, 1, 1, 2, 1, 2, 2, 3,                 /* 00 .. 07 */
-       1, 2, 2, 3, 2, 3, 3, 4,                 /* 08 .. 0f */
-       1, 2, 2, 3, 2, 3, 3, 4,                 /* 10 .. 17 */
-       2, 3, 3, 4, 3, 4, 4, 5,                 /* 18 .. 1f */
-       1, 2, 2, 3, 2, 3, 3, 4,                 /* 20 .. 27 */
-       2, 3, 3, 4, 3, 4, 4, 5,                 /* 28 .. 2f */
-       2, 3, 3, 4, 3, 4, 4, 5,                 /* 30 .. 37 */
-       3, 4, 4, 5, 4, 5, 5, 6,                 /* 38 .. 3f */
-       1, 2, 2, 3, 2, 3, 3, 4,                 /* 40 .. 47 */
-       2, 3, 3, 4, 3, 4, 4, 5,                 /* 48 .. 4f */
-       2, 3, 3, 4, 3, 4, 4, 5,                 /* 50 .. 57 */
-       3, 4, 4, 5, 4, 5, 5, 6,                 /* 58 .. 5f */
-       2, 3, 3, 4, 3, 4, 4, 5,                 /* 60 .. 67 */
-       3, 4, 4, 5, 4, 5, 5, 6,                 /* 68 .. 6f */
-       3, 4, 4, 5, 4, 5, 5, 6,                 /* 70 .. 77 */
-       4, 5, 5, 6, 5, 6, 6, 7,                 /* 78 .. 7f */
-       1, 2, 2, 3, 2, 3, 3, 4,                 /* 80 .. 87 */
-       2, 3, 3, 4, 3, 4, 4, 5,                 /* 88 .. 8f */
-       2, 3, 3, 4, 3, 4, 4, 5,                 /* 90 .. 97 */
-       3, 4, 4, 5, 4, 5, 5, 6,                 /* 98 .. 9f */
-       2, 3, 3, 4, 3, 4, 4, 5,                 /* a0 .. a7 */
-       3, 4, 4, 5, 4, 5, 5, 6,                 /* a8 .. af */
-       3, 4, 4, 5, 4, 5, 5, 6,                 /* b0 .. b7 */
-       4, 5, 5, 6, 5, 6, 6, 7,                 /* b8 .. bf */
-       2, 3, 3, 4, 3, 4, 4, 5,                 /* c0 .. c7 */
-       3, 4, 4, 5, 4, 5, 5, 6,                 /* c8 .. cf */
-       3, 4, 4, 5, 4, 5, 5, 6,                 /* d0 .. d7 */
-       4, 5, 5, 6, 5, 6, 6, 7,                 /* d8 .. df */
-       3, 4, 4, 5, 4, 5, 5, 6,                 /* e0 .. e7 */
-       4, 5, 5, 6, 5, 6, 6, 7,                 /* e8 .. ef */
-       4, 5, 5, 6, 5, 6, 6, 7,                 /* f0 .. f7 */
-       5, 6, 6, 7, 6, 7, 7, 8,                 /* f8 .. ff */
-};
-
 /*
  * xfs_highbit32: get high bit set out of 32-bit argument, -1 if none set.
  */
@@ -183,56 +129,21 @@ xfs_highbit64(
 
 
 /*
- * Count the number of bits set in the bitmap starting with bit
- * start_bit.  Size is the size of the bitmap in words.
- *
- * Do the counting by mapping a byte value to the number of set
- * bits for that value using the xfs_countbit array, i.e.
- * xfs_countbit[0] == 0, xfs_countbit[1] == 1, xfs_countbit[2] == 1,
- * xfs_countbit[3] == 2, etc.
+ * Return whether bitmap is empty.
+ * Size is number of words in the bitmap, which is padded to word boundary
+ * Returns 1 for empty, 0 for non-empty.
  */
 int
-xfs_count_bits(uint *map, uint size, uint start_bit)
+xfs_bitmap_empty(uint *map, uint size)
 {
-       register int    bits;
-       register unsigned char  *bytep;
-       register unsigned char  *end_map;
-       int             byte_bit;
-
-       bits = 0;
-       end_map = (char*)(map + size);
-       bytep = (char*)(map + (start_bit & ~0x7));
-       byte_bit = start_bit & 0x7;
-
-       /*
-        * If the caller fell off the end of the map, return 0.
-        */
-       if (bytep >= end_map) {
-               return (0);
-       }
-
-       /*
-        * If start_bit is not byte aligned, then process the
-        * first byte separately.
-        */
-       if (byte_bit != 0) {
-               /*
-                * Shift off the bits we don't want to look at,
-                * before indexing into xfs_countbit.
-                */
-               bits += xfs_countbit[(*bytep >> byte_bit)];
-               bytep++;
-       }
+       uint i;
+       uint ret = 0;
 
-       /*
-        * Count the bits in each byte until the end of the bitmap.
-        */
-       while (bytep < end_map) {
-               bits += xfs_countbit[*bytep];
-               bytep++;
+       for (i = 0; i < size; i++) {
+               ret |= map[i];
        }
 
-       return (bits);
+       return (ret == 0);
 }
 
 /*