Skip to content

Commit

Permalink
badblocks: Limit maximum number of bad blocks
Browse files Browse the repository at this point in the history
Currently maximum number of bad blocks is not limited in any way.
However our code can really handle at most INT_MAX/2 bad blocks (for
larger numbers binary search indexes start overflowing). So report
number of bad blocks is just too big instead of plain segfaulting.

It won't be too hard to raise the limit but I don't think there's any
real use for disks with over 1 billion of bad blocks...

Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
  • Loading branch information
jankara authored and tytso committed Dec 15, 2014
1 parent 0462fd6 commit fcc19b4
Showing 1 changed file with 20 additions and 5 deletions.
25 changes: 20 additions & 5 deletions misc/badblocks.c
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,9 @@ extern int optind;
#define O_LARGEFILE 0
#endif

/* Maximum number of bad blocks we support */
#define MAX_BAD_BLOCKS (INT_MAX/2)

static const char * program_name = "badblocks";
static const char * done_string = N_("done \n");

Expand All @@ -78,7 +81,9 @@ static int t_max; /* allocated test patterns */
static unsigned int *t_patts; /* test patterns */
static int use_buffered_io;
static int exclusive_ok;
static unsigned int max_bb; /* Abort test if more than this number of bad blocks has been encountered */
static unsigned int max_bb = MAX_BAD_BLOCKS; /* Abort test if more than this
* number of bad blocks has been
* encountered */
static unsigned int d_flag; /* delay factor between reads */
static struct timeval time_start;

Expand Down Expand Up @@ -526,7 +531,7 @@ static unsigned int test_ro (int dev, blk_t last_block,
alarm_intr(SIGALRM);
while (currently_testing < last_block)
{
if (max_bb && bb_count >= max_bb) {
if (bb_count >= max_bb) {
if (s_flag || v_flag) {
fputs(_("Too many bad blocks, aborting test\n"), stderr);
}
Expand Down Expand Up @@ -633,7 +638,7 @@ static unsigned int test_rw (int dev, blk_t last_block,

try = blocks_at_once;
while (currently_testing < last_block) {
if (max_bb && bb_count >= max_bb) {
if (bb_count >= max_bb) {
if (s_flag || v_flag) {
fputs(_("Too many bad blocks, aborting test\n"), stderr);
}
Expand Down Expand Up @@ -675,7 +680,7 @@ static unsigned int test_rw (int dev, blk_t last_block,

try = blocks_at_once;
while (currently_testing < last_block) {
if (max_bb && bb_count >= max_bb) {
if (bb_count >= max_bb) {
if (s_flag || v_flag) {
fputs(_("Too many bad blocks, aborting test\n"), stderr);
}
Expand Down Expand Up @@ -822,7 +827,7 @@ static unsigned int test_nd (int dev, blk_t last_block,
alarm_intr(SIGALRM);

while (currently_testing < last_block) {
if (max_bb && bb_count >= max_bb) {
if (bb_count >= max_bb) {
if (s_flag || v_flag) {
fputs(_("Too many bad blocks, aborting test\n"), stderr);
}
Expand Down Expand Up @@ -1117,6 +1122,16 @@ int main (int argc, char ** argv)
break;
case 'e':
max_bb = parse_uint(optarg, "max bad block count");
if (max_bb > MAX_BAD_BLOCKS) {
com_err (program_name, 0,
_("Too big max bad blocks count %u - "
"maximum is %u"), max_bb,
MAX_BAD_BLOCKS);
exit (1);
}
/* 0 really means unlimited but we cannot do that much... */
if (max_bb == 0)
max_bb = MAX_BAD_BLOCKS;
break;
case 'd':
d_flag = parse_uint(optarg, "read delay factor");
Expand Down

0 comments on commit fcc19b4

Please sign in to comment.