* Return: the block number (bitmap buffer scope) that was found
  */
 
-static u32 gfs2_bitfit(struct gfs2_rgrpd *rgd, unsigned char *buffer,
-                           unsigned int buflen, u32 goal,
-                           unsigned char old_state)
+static u32 gfs2_bitfit(unsigned char *buffer, unsigned int buflen, u32 goal,
+                      unsigned char old_state)
 {
-       unsigned char *byte, *end, alloc;
+       unsigned char *byte;
        u32 blk = goal;
-       unsigned int bit;
+       unsigned int bit, bitlong;
+       unsigned long *plong, plong55;
+       static int c = 0;
 
        byte = buffer + (goal / GFS2_NBBY);
+       plong = buffer + (goal / GFS2_NBBY);
        bit = (goal % GFS2_NBBY) * GFS2_BIT_SIZE;
-       end = buffer + buflen;
-       alloc = (old_state == GFS2_BLKST_FREE) ? 0x55 : 0;
-
-       while (byte < end) {
-               /* If we're looking for a free block we can eliminate all
-                  bitmap settings with 0x55, which represents four data
-                  blocks in a row.  If we're looking for a data block, we can
-                  eliminate 0x00 which corresponds to four free blocks. */
-               if ((*byte & 0x55) == alloc) {
-                       blk += (8 - bit) >> 1;
-
-                       bit = 0;
-                       byte++;
-
+       bitlong = bit;
+#if BITS_PER_LONG == 32
+       plong55 = 0x55555555;
+#else
+       plong55 = 0x5555555555555555;
+#endif
+       while (byte < buffer + buflen) {
+
+               if (bitlong == 0 && old_state == 0 && *plong == plong55) {
+                       plong++;
+                       byte += sizeof(unsigned long);
+                       blk += sizeof(unsigned long) * GFS2_NBBY;
                        continue;
                }
-
-               if (((*byte >> bit) & GFS2_BIT_MASK) == old_state)
+               if (((*byte >> bit) & GFS2_BIT_MASK) == old_state) {
+                       c++;
                        return blk;
-
+               }
                bit += GFS2_BIT_SIZE;
                if (bit >= 8) {
                        bit = 0;
                        byte++;
                }
+               bitlong += GFS2_BIT_SIZE;
+               if (bitlong >= sizeof(unsigned long) * 8) {
+                       bitlong = 0;
+                       plong++;
+               }
 
                blk++;
        }
                /* The GFS2_BLKST_UNLINKED state doesn't apply to the clone
                   bitmaps, so we must search the originals for that. */
                if (old_state != GFS2_BLKST_UNLINKED && bi->bi_clone)
-                       blk = gfs2_bitfit(rgd, bi->bi_clone + bi->bi_offset,
+                       blk = gfs2_bitfit(bi->bi_clone + bi->bi_offset,
                                          bi->bi_len, goal, old_state);
                else
-                       blk = gfs2_bitfit(rgd,
-                                         bi->bi_bh->b_data + bi->bi_offset,
+                       blk = gfs2_bitfit(bi->bi_bh->b_data + bi->bi_offset,
                                          bi->bi_len, goal, old_state);
                if (blk != BFITNOENT)
                        break;