Re: bitmap loading related reiserfs changes in 2.6.17-mm1 arebroken

From: Andrew Morton
Date: Wed Jun 21 2006 - 23:42:21 EST


On Wed, 21 Jun 2006 23:27:33 -0400
Nick Orlov <bugfixer@xxxxxxx> wrote:

> subj.
>
> I've got a lot of BUG's during the boot and eventually box locked up.
> SYS-RQ worked. Unfortunately none of these errors did make it to log files,
> so I cannot provide the backtraces.
>
> But reverting last 4 patches of reiserfs-changes series, namely
>
> reiserfs-reorganize-bitmap-loading-functions.patch
> reiserfs-on-demand-bitmap-loading.patch
> reiserfs-on-demand-bitmap-loading-fix.patch
> reiserfs-use-generic_file_open-for-open-checks.patch
>
> fixed the problem for me.
>

Yeah, sorry. I've uploaded the below to the hot-fixes directory - it
should repair things.


Jeff, given its track record, I have to say that my confidence in this work
is nanoscopic. Given that, and given the importance of reiserfs and given
the low rate of reiser3 development and given my ignorance of how reiserfs
works, I'm inclined to move very slowly on these patches.

It would really help if Chris or one of the namesys developers could take
the time to review and test these patches closely, please.



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

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/