linux-ext4.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] badblocks: Limit maximum number of bad blocks
@ 2014-09-11 10:03 Jan Kara
  2014-12-02 13:45 ` Jan Kara
  2014-12-15  1:55 ` Theodore Ts'o
  0 siblings, 2 replies; 3+ messages in thread
From: Jan Kara @ 2014-09-11 10:03 UTC (permalink / raw)
  To: Ted Tso; +Cc: linux-ext4, Jan Kara

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 plaing segfault.

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>
---
 misc/badblocks.c | 25 ++++++++++++++++++++-----
 1 file changed, 20 insertions(+), 5 deletions(-)

diff --git a/misc/badblocks.c b/misc/badblocks.c
index e5024f6c67d1..2c28ee00ec15 100644
--- a/misc/badblocks.c
+++ b/misc/badblocks.c
@@ -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");
-- 
1.8.1.4


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] badblocks: Limit maximum number of bad blocks
  2014-09-11 10:03 [PATCH] badblocks: Limit maximum number of bad blocks Jan Kara
@ 2014-12-02 13:45 ` Jan Kara
  2014-12-15  1:55 ` Theodore Ts'o
  1 sibling, 0 replies; 3+ messages in thread
From: Jan Kara @ 2014-12-02 13:45 UTC (permalink / raw)
  To: Ted Tso; +Cc: linux-ext4, Jan Kara

On Thu 11-09-14 12:03:24, Jan Kara wrote:
> 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 plaing segfault.
> 
> 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...
  Ted, what did happen to this patch? I don't see it in e2fsprogs
master branch... Thanks.

								Honza

> Signed-off-by: Jan Kara <jack@suse.cz>
> ---
>  misc/badblocks.c | 25 ++++++++++++++++++++-----
>  1 file changed, 20 insertions(+), 5 deletions(-)
> 
> diff --git a/misc/badblocks.c b/misc/badblocks.c
> index e5024f6c67d1..2c28ee00ec15 100644
> --- a/misc/badblocks.c
> +++ b/misc/badblocks.c
> @@ -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");
> -- 
> 1.8.1.4
> 
-- 
Jan Kara <jack@suse.cz>
SUSE Labs, CR

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: badblocks: Limit maximum number of bad blocks
  2014-09-11 10:03 [PATCH] badblocks: Limit maximum number of bad blocks Jan Kara
  2014-12-02 13:45 ` Jan Kara
@ 2014-12-15  1:55 ` Theodore Ts'o
  1 sibling, 0 replies; 3+ messages in thread
From: Theodore Ts'o @ 2014-12-15  1:55 UTC (permalink / raw)
  To: Jan Kara; +Cc: linux-ext4

On Thu, Sep 11, 2014 at 12:03:24PM +0200, Jan Kara wrote:
> 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>

Thanks, applied.

						- Ted

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2014-12-15  1:58 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-09-11 10:03 [PATCH] badblocks: Limit maximum number of bad blocks Jan Kara
2014-12-02 13:45 ` Jan Kara
2014-12-15  1:55 ` Theodore Ts'o

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).