From c42a4390a7a5cc072fdac33099ff4ceb966e2a6a Mon Sep 17 00:00:00 2001 From: Stas Sergeev Date: Wed, 23 Apr 2014 17:49:31 +0400 Subject: [PATCH 2/2] nandmarkblk: erase block before marking bad Signed-off-by: Stas Sergeev --- nandmarkblk.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/nandmarkblk.c b/nandmarkblk.c index 127219c..e5efb26 100644 --- a/nandmarkblk.c +++ b/nandmarkblk.c @@ -29,6 +29,7 @@ static void display_help(int status) "Writes to the specified MTD device.\n" "\n" " -b num, --markbad=num Mark block bad\n" +" -n --noerase Don't erase block before marking it bad\n" " -q, --quiet Don't display progress messages\n" " -h, --help Display this help and exit\n" " --version Output version information and exit\n" @@ -54,6 +55,7 @@ static const char *mtd_device; static bool quiet = false; static int markbad = -1; static int markgood = -1; +static bool noerase = false; static void process_options(int argc, char * const argv[]) { @@ -61,13 +63,14 @@ static void process_options(int argc, char * const argv[]) for (;;) { int option_index = 0; - static const char short_options[] = "vhb:g:q"; + static const char short_options[] = "vhb:g:nq"; static const struct option long_options[] = { /* Order of these args with val==0 matters; see option_index. */ {"version", no_argument, 0, 'v'}, {"help", no_argument, 0, 'h'}, {"markbad", required_argument, 0, 'b'}, {"markgood", required_argument, 0, 'g'}, + {"noerase", no_argument, 0, 'n'}, {"quiet", no_argument, 0, 'q'}, {0, 0, 0, 0}, }; @@ -90,6 +93,9 @@ static void process_options(int argc, char * const argv[]) case 'b': markbad = simple_strtoll(optarg, &error); break; + case 'n': + noerase = true; + break; case 'h': display_help(EXIT_SUCCESS); break; @@ -132,9 +138,15 @@ int main(int argc, char * const argv[]) if (mtd_get_dev_info(mtd_desc, mtd_device, &mtd) < 0) errmsg_die("mtd_get_dev_info failed"); - if (markbad != -1 && mtd_mark_bad(&mtd, fd, markbad)) { - sys_errmsg("%s: MTD Mark bad block failure", mtd_device); - goto closeall; + if (markbad != -1) { + if (!noerase && mtd_erase(mtd_desc, &mtd, fd, markbad) != 0) { + sys_errmsg("%s: MTD Erase failure", mtd_device); + goto closeall; + } + if (mtd_mark_bad(&mtd, fd, markbad)) { + sys_errmsg("%s: MTD Mark bad block failure", mtd_device); + goto closeall; + } } if (markgood != -1) { -- 1.7.11.7