Take the opportunity to wrap the string to be more readable,
and sort the options somewhat alphabetically.
Signed-off-by: Benno Schulenberg <bensberg@justemail.net>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Use consistent and standard terminology for the starting and ending
blocks for the badblocks test in the man page and in the messages
printed by the program.
Addresses-Debian-Bug: #440983, #440981
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
With more than 8 -t patterns given, badblocks will overwrite the
t_patts array boundary due to realloc not taking into account the size
of an int. Oops.
Addresses-Debian-Bug: 487298
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
The previous patch was missing an #include and thus the compiler didn't
catch the (now obvious) error.
Signed-off-by: Iustin Pop <iustin@google.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Currently, badblocks will read as fast as it can from the drive. While
this is what one wants usually, if badblocks is run in read-only mode on
a drive that is in use, it will greatly degrade the other users of this
disk.
This patch adds a throttling mode for reads where each read will be
delayed by a percentage of the time the previous read took; i.e., an
invocation of '-d 100' will cause the sleep to be the same as the read
took, a value of 200 will cause the sleep to be twice as high, and a
value of 50 will cause it to be half. This will not be done if the
previous read had errors, since then the hardware will possibly have
timeouts and that would decrease the speed too much.
This algorithm helps when the disk is used by other processes as then,
due to the increased load, the time spent doing the reads will be
higher, and correspondingly badblocks will sleep even more and thus it
will use less of the drive's bandwidth. This is different from using
ionice, as it is a voluntary (and partial) throttling.
Signed-off-by: Iustin Pop <iustin@google.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Currently, the parse_uint() function checks errno after the strtoul()
call. But, according to the man page of strtoul():
Since strtoul() can legitimately return 0 or LONG_MAX (LLONG_MAX for
strtoull()) on both success and failure, the calling program
should set errno to 0 before the call, and then determine if an error
occurred by checking whether errno has a nonzero value after the call.
When using locales, it can happen that looking for the locale files is
not successful, and therefore errno will have a nonzero value from this.
And since the argument parsing is one of the first things done after
startup, parse_uint() will wrongly report errors.
The fix is to simply reset errno to zero before calling strtoul().
Signed-off-by: Iustin Pop <iustin@google.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Currently, badblocks will continue scanning the device until it reaches
last_block, even though it might be that the drive is not responding
at all anymore.
This patch introduces a new parameter ('-e') that allows one to specify
the maximum bad block count; if badblocks sees more than this number, it
will abort the test.
While this is not useful for testing a device that will need to be used
as a filesystem (because we don't get an exhaustive list of bad blocks),
it is useful for testing if a device has bad blocks at all: for example,
with a count of 1, it will finish after the first error thus not needing
to test the whole device if the only purpose of the test is to check for
any bad blocks.
Signed-off-by: Iustin Pop <iustin@google.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
The strtoul() function has a lot of messy error checking that needs to
be done; by factoring it out into one place we can make sure it's done
right in all of the places where it is called.
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
This will make it easier for us to support 64-bit block numbers when
the time comes. Not that running badblocks on a > 4TB machine is
anything I want to contemplate!
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
The exlcusive device safety check that was added inadvertently broke
e2fsck -cc and mke2fs -cc since e2fsck and mke2fs hold the device
in exclusive access when badblocks is run. So we add a private option
to badblocks, -X, which is passed by e2fsck and mke2fs to badblocks
to indicate that it is OK to skip the EXT2_MF_BUSY checks.
Addresses Debian Bug: #366017
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Add extra spaces when printing the "done" message to clear out the
block number to fix a display corruption when the -s option is used to
display the progress of the test. (Addresses Debian Bug #322231)
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
and changes "bad" to "invalid" in some messages to avoid confusion with
"bad blocks" in the e2fsck, mke2fs, and badblocks programs. Thanks to
Benno Schulenberg. (Addresses Sourceforge Bug: #1189803)
fixing up gcc -Wall nits. badblocks -t random was not
getting handled properly because ~0 needed to be cast to
an unsigned long instead of an unsigned char. (Addresses
Debian bug #234828)
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.)
test to honor the -c option (number of blocks at a time).
do_read and do_write will try to turn on the O_DIRECT flag
if it appears that it is possible to use it. (Addresses
Debian bug #198006)
by Thayne Harbaugh. These patches allow the -t option to
control the test pattern(s) used when checking the disk.
Test patterns may be specified in all modes (r/w, r/o and
non-destructive).
called for multiple passes.
(test_nd): Fix bug in chosing randomness for the
non-destructive test. We were only using 1 bit of
randomness per byte instead of 8 due to a bit-shift bug.
Also, initialize the random number generator from the time
in main(). Thanks to Thayne Harbaugh for pointing out
these bugs.
badblocks.c, chattr.c, dumpe2fs.c, e2image.c, findsuper.c, lsattr.c,
mke2fs.c, mklost+found.c, tune2fs.c, util.c: Change location of
ext2_fs.h to be ext2fs/ext2_fs.h
ChangeLog, Makefile.in, resize2fs.h:
resize2fs.h: Change location of ext2_fs.h to be ext2fs/ext2_fs.h
ChangeLog, Makefile.in, debugfs.h:
debugfs.h: Change location of ext2_fs.h to be ext2fs/ext2_fs.h
ChangeLog, Makefile.in, e2fsck.h, scantest.c:
e2fsck.h, scantest.c: Change location of ext2_fs.h to be
ext2fs/ext2_fs.h
ChangeLog, Makefile.in, tst_uuid.c, uuid_time.c:
tst_uuid.c, uuid_time.c: Remove unneeded #include of ext2_fs.h
ChangeLog, Makefile.in, e2p.h:
e2p.h: Change location of ext2_fs.h to be ext2fs/ext2_fs.h
ChangeLog, Makefile.in, test_icount.c, test_rel.c:
test_icount.c, test_rel.c: Change location of ext2_fs.h to be
ext2fs/ext2_fs.h
badblocks.8.in: Fixed man page to describe the first optional
parameter to badblocks as last_block, instead of num_blocks. (Debian
nbug #87216)
badblocks.c: Change the blocks_count variable to be last_count, which
is a more accurate description of the variable.
get_device_by_label.h (get_volume_label_by_spec): Add function prototype.
get_device_by_label.c: Use string_copy() instead of strdup() for
portability's sake. Fix a few other gcc -Wall complaints.
fsck.h, fsck.c (string_copy): Export string_copy() extern.
badblocks.c: Fix various gcc -Wall complaints, including an incorrect
reference to sync in flush_bufs().
ChangeLog, configure, configure.in:
configure.in: Add checks for the header files sys/mkdev.h and
sys/sysmacros.h.
badblocks.8.in: Added text explaining that the -n and -w options are
mutually exclusive.
badblocks.c (usage): Fix usage message to make it clear that the block
count must be specified if the starting block is to be specified.
(The starting block should be a option, in the long run.)
badblocks.c (test_nd): Save and restore the currently_testing variable
before going into the write verification loop. This avoids a loop
termination problem if the last block on the disk is bad. Also, turn
off the SIGALRM signal while restoring blocks after the user types ^C.
The num_saved variable is now static so that it won't get clobbered by
a longjmp. buf_used and bb_count are no longer static, since they
aren't used by the cleanup routines anymore.
badblocks.c (main): Removed an unsued varaible (buf_size). Fixed bad
getopt argument that didn't allow the 'b' option to take an argument.
Added error checking when parsing the starting block number. Fixed
lint warning in fscanf format string.
badblocks.c (check_mount, main): Check to see if the filesystem is
mounted before doing a read/write or non-destructive test. This can
be overriden using the new -f option.
badblocks.8.in: Added documentation for the -f option.
badblocks.8.in: Update manual page to reflect that the blocks-count
parameter is now optional. Also properly document the start-block
parameter.
badblocks.c (main): Allow the blocks-count parameter to be optional.
If it's not specified, use the size of the device as a default.
badblocks.c (test_nd): Significantly simplify the logic so that it's
more obviously what's going on. Fixed a few potential cases which
weren't handled correctly in the old, overly complicated logic.
(flush_bufs): Now doesn't take a second argument, and always forces a
sync; this is required before it's really safe to call BLKFLSBUF, at
least for some kernels.
Makefile.in (uuid_time): Compile uuid_time in two steps (first create
.o, then link it against the libraries) to work around bug in a.out
linker.
dll/jump.funcs, dll/jump.import, dll/jump.params: Update a.out shared
library control files to reflect new added files.
ChangeLog, feature.c, jump.funcs:
feature.c: Make feature_list static; it shouldn't be exported.
dll/jump.funcs: Update a.out shared library control file.
ChangeLog, badblocks.c:
badblocks.c (flush_bufs): Use fsync() if the system doesn't support
fdatasync().
badblocks.c, dumpe2fs.c, e2label.c, mke2fs.c, tune2fs.c, uuidgen.c:
For platforms that don't define optarg.h, manually define optarg and
optind.
ChangeLog, main.c:
main.c: For platforms that don't define optarg.h, manually define
optarg and optind.
ChangeLog, unix.c:
unix.c: For platforms that don't define optarg.h, manually define
optarg and optind.