Here is the patch for the bug I reported yesterday (#3302092). It makes badblocks show correct percentages with the -s or -v options when the starting block is not 0.
Since first_block was needed in print_status(), I decided to set both first_block and last_block as global variables, and to remove num_blocks entirely. This simplifies the code a bit, and gets rid of the confusing "num_blocks" which didn't actually contain the number of blocks.
I'm not sure what was the point of setting num_blocks to 0 before calling alarm(0) and checking for that in alarm_intr(). I thought about this a lot and read about alarm() and signals interrupts, and came to the conclusion that it wasn't useful. The worst thing that could happen anyway is for print_status() to get called right before alarm(0) is called (something that could already happen before.)
I also changed the call to ext2fs_get_device_size2() into ext2fs_get_device_size() since the blk64_t last_block was changed into blk_t later anyway in the call to the test function.
I have tested the modified binary for hours on my 1TB drive with the "-s -v -w" options, and briefly with "-s -n" and "-s". No problem that I can see.
The patch applies to git commit 5af9eeaa7d36dd6f3a434697747ba8db3434eced (18 Mar 2011 20:44:37).
Fix progression percentage when starting block is not 0. Applies to git commit 5af9eeaa7d36dd6f3a434697747ba8db3434eced.