From: Jeff Mahoney Signed-off-by: Jeff Mahoney Signed-off-by: Andrew Morton --- fs/reiserfs/bitmap.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff -puN fs/reiserfs/bitmap.c~reiserfs-reorganize-bitmap-loading-functions-fix fs/reiserfs/bitmap.c --- a/fs/reiserfs/bitmap.c~reiserfs-reorganize-bitmap-loading-functions-fix +++ a/fs/reiserfs/bitmap.c @@ -1292,25 +1292,25 @@ void reiserfs_cache_bitmap_metadata(stru struct buffer_head *bh, struct reiserfs_bitmap_info *info) { - unsigned long *cur = (unsigned long *)bh->b_data; - int i; + unsigned long *cur = (unsigned long *)(bh->b_data + bh->b_size); + + while (--cur >= (unsigned long *)bh->b_data) { + int base = ((char *)cur - bh->b_data) << 3; - for (i = sb->s_blocksize / sizeof (*cur); i > 0; i--, cur++) { /* 0 and ~0 are special, we can optimize for them */ if (*cur == 0) { - info->first_zero_hint = i << 3; - info->free_count += sizeof (*cur) << 3; + info->first_zero_hint = base; + info->free_count += BITS_PER_LONG; } else if (*cur != ~0L) { /* A mix, investigate */ int b; - for (b = sizeof (*cur) << 3; b >= 0; b--) { + for (b = BITS_PER_LONG - 1; b >= 0; b--) { if (!reiserfs_test_le_bit(b, cur)) { - info->first_zero_hint = (i << 3) + b; + info->first_zero_hint = base + b; info->free_count++; } } } } - /* The first bit must ALWAYS be 1 */ BUG_ON(info->first_zero_hint == 0); } _