Re: bitmap loading related reiserfs changes in 2.6.17-mm1 are broken

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, 21 Jun 2006 23:27:33 -0400
Nick Orlov <[email protected]> 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 [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux