[PATCH] nandwrite - handle situation when read returns less bytes the expected
Hai Zaar
haizaar at haizaar.com
Tue Dec 16 03:40:16 EST 2008
On Tue, Dec 16, 2008 at 8:28 AM, Artem Bityutskiy
<dedekind at infradead.org> wrote:
>
> Your patch does not apply. It looks like it is not against the latest
> mtd-utils. How about this patch?
Yes, my patch is against mtd-utils-1.2.0. Yours is surely better since
it covers oob reading as well.
>
> From: Artem Bityutskiy <Artem.Bityutskiy at nokia.com>
> Date: Tue, 16 Dec 2008 10:02:16 +0200
> Subject: [PATCH] nandwrite: correct data reading
>
> The "read" syscall does not necessarily return all the requested
> data, in which case the caller has to try again and read more.
> Take this into account when reading input data.
>
> Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy at nokia.com>
> ---
> nandwrite.c | 31 +++++++++++++++++++++++--------
> 1 files changed, 23 insertions(+), 8 deletions(-)
>
> diff --git a/nandwrite.c b/nandwrite.c
> index fc23e85..0b2a9ee 100644
> --- a/nandwrite.c
> +++ b/nandwrite.c
> @@ -260,6 +260,7 @@ int main(int argc, char * const argv[])
> int ret, readlen;
> int oobinfochanged = 0;
> struct nand_oobinfo old_oobinfo;
> + int readcnt = 0;
>
> process_options(argc, argv);
>
> @@ -477,6 +478,8 @@ int main(int argc, char * const argv[])
> readlen = meminfo.writesize;
>
> if (ifd != STDIN_FILENO) {
> + int tinycnt = 0;
> +
> if (pad && (imglen < readlen))
> {
> readlen = imglen;
> @@ -484,11 +487,15 @@ int main(int argc, char * const argv[])
> }
>
> /* Read Page Data from input file */
> - if ((cnt = read(ifd, writebuf, readlen)) != readlen) {
> - if (cnt == 0) // EOF
> + while(tinycnt < readlen) {
> + cnt = read(ifd, writebuf + tinycnt, readlen - tinycnt);
> + if (cnt == 0) { // EOF
> break;
> - perror ("File I/O error on input file");
> - goto closeall;
> + } else if (cnt < 0) {
> + perror ("File I/O error on input file");
> + goto closeall;
> + }
> + tinycnt += cnt;
> }
> } else {
> int tinycnt = 0;
> @@ -522,11 +529,19 @@ int main(int argc, char * const argv[])
> }
>
> if (writeoob) {
> - /* Read OOB data from input file, exit on failure */
> - if ((cnt = read(ifd, oobreadbuf, meminfo.oobsize)) != meminfo.oobsize) {
> - perror ("File I/O error on input file");
> - goto closeall;
> + int tinycnt = 0;
> +
> + while(tinycnt < readlen) {
> + cnt = read(ifd, oobreadbuf + tinycnt, meminfo.oobsize - tinycnt);
> + if (cnt == 0) { // EOF
> + break;
> + } else if (cnt < 0) {
> + perror ("File I/O error on input file");
> + goto closeall;
> + }
> + tinycnt += cnt;
> }
> +
> if (!noecc) {
> int i, start, len;
> /*
> --
> 1.5.4.3
>
> --
> Best regards,
> Artem Bityutskiy (Битюцкий Артём)
>
>
--
Zaar
More information about the linux-mtd
mailing list