[PATCH mtd-utils] nandwrite: warn about writing 0xff blocks

Miquel Raynal miquel.raynal at bootlin.com
Mon Mar 28 01:45:57 PDT 2022


Hi Rafał,

zajec5 at gmail.com wrote on Mon, 28 Mar 2022 10:29:15 +0200:

> On 28.03.2022 09:27, Richard Weinberger wrote:
> > ----- Ursprüngliche Mail -----  
> >> Von: "Rafał Miłecki" <zajec5 at gmail.com>
> >> An: "Miquel Raynal" <miquel.raynal at bootlin.com>, "richard" <richard at nod.at>
> >> CC: "linux-mtd" <linux-mtd at lists.infradead.org>, "Rafał Miłecki" <rafal at milecki.pl>
> >> Gesendet: Freitag, 25. März 2022 13:00:25
> >> Betreff: [PATCH mtd-utils] nandwrite: warn about writing 0xff blocks  
> >   
> >> From: Rafał Miłecki <rafal at milecki.pl>
> >>
> >> Such blocks may be incorrectly treated as empty (even though they may
> >> have non-erase OOB). Warn about it so people may start suing
> >> --skip-all-ffs .
> >>
> >> Signed-off-by: Rafał Miłecki <rafal at milecki.pl>
> >> ---
> >> nand-utils/nandwrite.c | 13 ++++++++++++-
> >> 1 file changed, 12 insertions(+), 1 deletion(-)
> >>
> >> diff --git a/nand-utils/nandwrite.c b/nand-utils/nandwrite.c
> >> index e8a210c..cd53a17 100644
> >> --- a/nand-utils/nandwrite.c
> >> +++ b/nand-utils/nandwrite.c
> >> @@ -280,6 +280,7 @@ int main(int argc, char * const argv[])
> >> 	libmtd_t mtd_desc;
> >> 	int ebsize_aligned;
> >> 	uint8_t write_mode;
> >> +	size_t all_ffs_cnt = 0;
> >>
> >> 	process_options(argc, argv);
> >>
> >> @@ -417,6 +418,8 @@ int main(int argc, char * const argv[])
> >> 	 */
> >> 	while ((imglen > 0 || writebuf < filebuf + filebuf_len)
> >> 		&& mtdoffset < mtd.size) {
> >> +		bool allffs;
> >> +
> >> 		/*
> >> 		 * New eraseblock, check for bad block(s)
> >> 		 * Stay in the loop to be sure that, if mtdoffset changes because
> >> @@ -555,7 +558,8 @@ int main(int argc, char * const argv[])
> >> 		}
> >>
> >> 		ret = 0;
> >> -		if (!skipallffs || !buffer_check_pattern(writebuf, mtd.min_io_size, 0xff)) {
> >> +		allffs = buffer_check_pattern(writebuf, mtd.min_io_size, 0xff);
> >> +		if (!allffs || !skipallffs) {  
> > 
> > Why is checking for allffs needed here?  
> 
> With --skip-all-ffs we want to write block if it contains data.
> 
> In other words this check is equal to:
> if (contains_data || write_all_block)
> 
> 
> >> 			/* Write out data */
> >> 			ret = mtd_write(mtd_desc, &mtd, fd, mtdoffset / mtd.eb_size,
> >> 					mtdoffset % mtd.eb_size,
> >> @@ -564,6 +568,8 @@ int main(int argc, char * const argv[])
> >> 					writeoob ? oobbuf : NULL,
> >> 					writeoob ? mtd.oob_size : 0,
> >> 					write_mode);
> >> +			if (!ret && allffs)  
> > 
> > Why checking for !ret?  
> 
> If mtd_write() returns error we didn't actualy write anything.
> 
> 
> >> +				all_ffs_cnt++;
> >> 		}
> >>
> >> 		if (ret) {
> >> @@ -615,6 +621,11 @@ closeall:
> >> 		   || (writebuf < filebuf + filebuf_len))
> >> 		sys_errmsg_die("Data was only partially written due to error");
> >>
> >> +	if (all_ffs_cnt) {
> >> +		fprintf(stderr, "Written %zu blocks containing only 0xff bytes\n",
> >> all_ffs_cnt);
> >> +		fprintf(stderr, "Those block may be incorrectly treated as empty!\n");
> >> +	}
> >> +  
> > 
> > While I like the patch I'm still not so convinced why we can't make skipallffs=true by default.  
> 
> I thought it's about changing / breaking user interface:
> 
> [2022-03-25] [11:40:53 CET] <derRichard> mraynal: i think we should make --skip-all-ffs default in nandwrite
> [2022-03-25] [11:40:56 CET] <derRichard> what do you think?
> [2022-03-25] [11:42:00 CET] <rmilecki> i was preparing a patch with warning if any 0xff block has been written
> [2022-03-25] [11:42:33 CET] <rmilecki> i didn't know defaulting to --skip-all-ffs can be done
> [2022-03-25] [11:47:05 CET] <mraynal> well, that would break the user interface

Indeed I raised this issue but I am not opposed to this change if
everybody agrees that it's a good move. In particular, the NAND
sublayer will give the same "empty" data to userspace whether it
programmed empty pages or skipped them. So I guess we are fine against
direct regressions (but we might break clever scripts doing strange
things).

I would go for this solution:
- Bring support for the double flag -[no-]skip-ffs
- Make the use of -skip-ffs the default
So that it is easy for scripting people to ensure their way is fine?

Thanks,
Miquèl



More information about the linux-mtd mailing list