Hi,

fs/gfs2/rgrp.c: In function ‘gfs2_bitfit’:
fs/gfs2/rgrp.c:139: warning: assignment from incompatible pointer type

Please can you send me a fix for the above. Thanks,

Steve.


On Tue, 2007-12-11 at 19:00 -0600, Bob Peterson wrote:
> Hi,
> 
> I eliminated the passing of an unused parameter into gfs2_bitfit called rgd.
> 
> This also changes the gfs2_bitfit code that searches for free (or used) 
> blocks.
> Before, the code was trying to check for bytes that indicated 4 blocks in
> the undesired state.  The problem is, it was spending more time trying to
> do this than it actually was saving.  This version only optimizes the case
> where we're looking for free blocks, and it checks a machine word at a time.
> So on 32-bit machines, it will check 32-bits (16 blocks) and on 64-bit
> machines, it will check 64-bits (32 blocks) at a time.  The compiler
> optimizes that quite well and we save some time, especially when running
> through full bitmaps (like the bitmaps allocated for the journals).
> 
> There's probably a more elegant or optimized way to do this, but I haven't
> thought of it yet.  I'm open to suggestions.
> 
> Regards,
> 
> Bob Peterson
> Red Hat GFS
> 
> Signed-off-by: Bob Peterson <[EMAIL PROTECTED]> 
> --
>  .../fs/gfs2/rgrp.c                                 |   54 
> +++++++++++---------
>  70 files changed, 29 insertions(+), 25 deletions(-)
> 
> diff --git a/gfs2-2.6.git.patch2/fs/gfs2/rgrp.c 
> b/gfs2-2.6.git.patch3/fs/gfs2/rgrp.c
> index e0ee195..d7ff9cf 100644
> --- a/gfs2-2.6.git.patch2/fs/gfs2/rgrp.c
> +++ b/gfs2-2.6.git.patch3/fs/gfs2/rgrp.c
> @@ -126,41 +126,46 @@ static unsigned char gfs2_testbit(struct gfs2_rgrpd 
> *rgd, unsigned char *buffer,
>   * 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++;
>       }
> @@ -1318,11 +1323,10 @@ static u32 rgblk_search(struct gfs2_rgrpd *rgd, u32 
> goal,
>               /* 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;
> 
> 

Reply via email to