
From: Jeff Mahoney <jeffm@suse.com>

Signed-off-by: Jeff Mahoney <jeffm@suse.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 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);
 }
_
