summaryrefslogtreecommitdiff
path: root/nandwrite.c
diff options
context:
space:
mode:
authorArtem Bityutskiy <Artem.Bityutskiy@nokia.com>2008-12-16 10:02:16 +0200
committerArtem Bityutskiy <Artem.Bityutskiy@nokia.com>2008-12-26 16:14:12 +0200
commitf1076eedef167ae28740a6844985a064a474fdfa (patch)
tree6cf8004c5f3c667e80f93bfb89066aa3b6db6d3d /nandwrite.c
parent96a4f76f2e9dad7fdbd6fd7740de44bc90d5769e (diff)
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. This patch is an improved vestion of the original patch sent by Hai Zaar. Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com> Tested-by: Hai Zaar <haizaar@codefidence.com>
Diffstat (limited to 'nandwrite.c')
-rw-r--r--nandwrite.c31
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;
/*