The attached patch against 2.6.5-udm4 fixes persistant mirror reactivation: - count_bits() fxn was broken. It went into an infinite loop because n was never incremented. - the size parameter passed into the find_*_bit fxns from count_bits() was also wrong - it needs to be in bits, not bytes. Regards, -- AJ Lewis Voice: 612-638-0500 Red Hat Inc. E-Mail: alewis@xxxxxxxxxx 720 Washington Ave. SE, Suite 200 Minneapolis, MN 55414 Current GPG fingerprint = FE77 4B43 6A9B F982 A731 02FA 2BF5 7574 294A AA5A Grab the key at: http://people.redhat.com/alewis/gpg.html or one of the many keyservers out there... -----Begin Obligatory Humorous Quote---------------------------------------- Sticks and stones may break my bones, and so would an 80 lb. carrot. -----End Obligatory Humorous Quote------------------------------------------
Fix persistant mirror reactivation - count_bits() fxn was broken. It went into an infinite loop because n was never incremented. - the size parameter passed into the find_*_bit fxns from count_bits() was also wrong - it needs to be in bits, not bytes. --- diff/drivers/md/dm-log.c 2004-04-14 16:22:54.111484595 -0500 +++ source/drivers/md/dm-log.c 2004-04-15 13:06:31.323250244 -0500 @@ -426,23 +426,16 @@ static int count_bits(unsigned long *addr, unsigned size) { - /* FIXME: test this */ -#if 1 int n, count = 0; + unsigned long bitsize = size << 3; - n = find_first_bit(addr, size); - while (n < size) { + n = find_first_bit(addr, bitsize); + while (n < bitsize) { count++; - find_next_bit(addr, size, n + 1); + n = find_next_bit(addr, bitsize, n + 1); } return count; -#else - int count = 0; - for (i = 0; i < lc->region_count; i++) - count += log_test_bit(lc->sync_bits, i); - return count; -#endif } static int disk_resume(struct dirty_log *log)
Attachment:
pgppYalvA7EiD.pgp
Description: PGP signature