+2003-08-01 Theodore Ts'o <tytso@mit.edu>
+
+ * badblocks.c (set_o_direct): Add check to make sure the file
+ offset of the device is page aligned. (Addresses Debian
+ Bug #203713)
+
+ * badblocks.c (test_ro, test_rw): Add code to recover after an
+ error so that we continue reading on page-aligned
+ boundaries. (Thanks to Philippe Troin <phil@fifi.org> for
+ the patch.)
+
2003-07-25 Theodore Ts'o <tytso@mit.edu>
* Release of E2fsprogs 1.34
signal (SIGUSR2, SIG_DFL);
}
-static void set_o_direct(int dev, unsigned char *buffer, size_t size)
+static void set_o_direct(int dev, unsigned char *buffer, size_t size,
+ unsigned long current_block)
{
#ifdef O_DIRECT
int new_flag = O_DIRECT;
int flag;
if ((((unsigned long) buffer & (sys_page_size - 1)) != 0) ||
- ((size & (sys_page_size - 1)) != 0))
+ ((size & (sys_page_size - 1)) != 0) ||
+ ((current_block & ((sys_page_size >> 9)-1)) != 0))
new_flag = 0;
if (new_flag != current_O_DIRECT) {
{
long got;
- set_o_direct(dev, buffer, try * block_size);
+ set_o_direct(dev, buffer, try * block_size, current_block);
if (v_flag > 1)
print_status();
{
long got;
- set_o_direct(dev, buffer, try * block_size);
+ set_o_direct(dev, buffer, try * block_size, current_block);
if (v_flag > 1)
print_status();
currently_testing += got;
if (got == try) {
try = blocks_at_once;
+ /* recover page-aligned offset for O_DIRECT */
+ if ( blocks_at_once >= (sys_page_size >> 9)
+ && (currently_testing % (sys_page_size >> 9)!= 0))
+ try -= (sys_page_size >> 9)
+ - (currently_testing
+ % (sys_page_size >> 9));
continue;
}
else
currently_testing += got;
if (got == try) {
try = blocks_at_once;
+ /* recover page-aligned offset for O_DIRECT */
+ if ( blocks_at_once >= (sys_page_size >> 9)
+ && (currently_testing %
+ (sys_page_size >> 9)!= 0))
+ try -= (sys_page_size >> 9)
+ - (currently_testing
+ % (sys_page_size >> 9));
continue;
} else
try = 1;
bb_count += bb_output(currently_testing+i);
}
currently_testing += got;
+ /* recover page-aligned offset for O_DIRECT */
+ if ( blocks_at_once >= (sys_page_size >> 9)
+ && (currently_testing % (sys_page_size >> 9)!= 0))
+ try = blocks_at_once - (sys_page_size >> 9)
+ - (currently_testing
+ % (sys_page_size >> 9));
+ else
+ try = blocks_at_once;
if (v_flag > 1)
print_status();
}