Merge branch 'maint' into next

crypto
Theodore Ts'o 2014-12-14 20:57:09 -05:00
commit 0698ecc1e2
2 changed files with 44 additions and 9 deletions

View File

@ -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");
@ -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;
@ -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);
}
@ -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);
}
@ -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);
}
@ -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);
}
@ -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");

View File

@ -321,10 +321,30 @@ int main (int argc, char ** argv)
}
fs->default_bitmap_type = EXT2FS_BMAP64_RBTREE;
if (!(mount_flags & EXT2_MF_MOUNTED)) {
if (!force && ((fs->super->s_lastcheck < fs->super->s_mtime) ||
(fs->super->s_state & EXT2_ERROR_FS) ||
((fs->super->s_state & EXT2_VALID_FS) == 0))) {
/*
* Before acting on an unmounted filesystem, make sure it's ok,
* unless the user is forcing it.
*
* We do ERROR and VALID checks even if we're only printing the
* minimimum size, because traversal of a badly damaged filesystem
* can cause issues as well. We don't require it to be fscked after
* the last mount time in this case, though, as this is a bit less
* risky.
*/
if (!force && !(mount_flags & EXT2_MF_MOUNTED)) {
int checkit = 0;
if (fs->super->s_state & EXT2_ERROR_FS)
checkit = 1;
if ((fs->super->s_state & EXT2_VALID_FS) == 0)
checkit = 1;
if ((fs->super->s_lastcheck < fs->super->s_mtime) &&
!print_min_size)
checkit = 1;
if (checkit) {
fprintf(stderr,
_("Please run 'e2fsck -f %s' first.\n\n"),
device_name);