0001-flashcp-Use-llu-to-print-filestat.st_size.patch

Fabien Proriol Fabien.Proriol at jdsu.com
Thu Nov 6 07:13:08 PST 2014


Hello,

There is a display bug in flashcp.
In fact the problem is filestat.st_size can be 64 bits (in my case, Zynq 
ARM platform).

With command:
flashcp -v IMG.img /dev/mtd0

Results lines are:

Erasing blocks: 40/40 (100%)
Writing data: 1670k/0k (2544%)

......
and at the end:

Erasing blocks: 40/40 (100%)
Writing data: 2544k/0k (100%))   <----- double parenthesis
Verifying data: 2544k/0k (100%))


I wrote a patch to solve this problem...
But I have another question about "written" and "size" variables...
The size_t type is potentially not the good type to store 
filestat.st_size, off_t should be better...


Fabien Proriol

_______________________________________________________________________________

 From e65a012df12fa39ed0a6c5a71b5dc952b4c982fc Mon Sep 17 00:00:00 2001
From: Fabien Proriol <fabien.proriol at jdsu.com>
Date: Thu, 6 Nov 2014 15:54:20 +0100
Subject: [PATCH] flashcp: Use %llu to print filestat.st_size

filestat.st_size type is off_t.
For some paltforms, off_t can be 32 or 64bit but there is no C99 format 
specifier for off_t.
The best way to print it with printf is to cast it to long long and 
print with %llu

Signed-off-by: Fabien Proriol <fabien.proriol at jdsu.com>
---
  flashcp.c | 32 ++++++++++++++++----------------
  1 file changed, 16 insertions(+), 16 deletions(-)

diff --git a/flashcp.c b/flashcp.c
index d58c81b..04495bd 100644
--- a/flashcp.c
+++ b/flashcp.c
@@ -296,7 +296,7 @@ int main (int argc,char *argv[])
          * write the entire file to flash *
          **********************************/

-       if (flags & FLAG_VERBOSE) log_printf (LOG_NORMAL,"Writing data: 
0k/%luk (0%%)",KB (filestat.st_size));
+       if (flags & FLAG_VERBOSE) log_printf (LOG_NORMAL,"Writing data: 
0k/%lluk (0%%)",KB ((unsigned long long)filestat.st_size));
         size = filestat.st_size;
         i = BUFSIZE;
         written = 0;
@@ -304,10 +304,10 @@ int main (int argc,char *argv[])
         {
                 if (size < BUFSIZE) i = size;
                 if (flags & FLAG_VERBOSE)
-                       log_printf (LOG_NORMAL,"\rWriting data: %dk/%luk 
(%lu%%)",
+                       log_printf (LOG_NORMAL,"\rWriting data: 
%dk/%lluk (%llu%%)",
                                         KB (written + i),
-                                       KB (filestat.st_size),
-                                       PERCENTAGE (written + 
i,filestat.st_size));
+                                       KB ((unsigned long 
long)filestat.st_size),
+                                       PERCENTAGE (written + 
i,(unsigned long long)filestat.st_size));

                 /* read from filename */
                 safe_read (fil_fd,filename,src,i,flags & FLAG_VERBOSE);
@@ -325,8 +325,8 @@ int main (int argc,char *argv[])
                                 exit (EXIT_FAILURE);
                         }
                         log_printf (LOG_ERROR,
-                                       "Short write count returned 
while writing to x%.8x-0x%.8x on %s: %d/%lu bytes written to flash\n",
-                                       written,written + 
i,device,written + result,filestat.st_size);
+                                       "Short write count returned 
while writing to x%.8x-0x%.8x on %s: %d/%llu bytes written to flash\n",
+                                       written,written + 
i,device,written + result,(unsigned long long)filestat.st_size);
                         exit (EXIT_FAILURE);
                 }

@@ -335,10 +335,10 @@ int main (int argc,char *argv[])
         }
         if (flags & FLAG_VERBOSE)
                 log_printf (LOG_NORMAL,
-                               "\rWriting data: %luk/%luk (100%%)\n",
-                               KB (filestat.st_size),
-                               KB (filestat.st_size));
-       DEBUG("Wrote %d / %luk bytes\n",written,filestat.st_size);
+                               "\rWriting data: %lluk/%lluk (100%%)\n",
+                               KB ((unsigned long long)filestat.st_size),
+                               KB ((unsigned long long)filestat.st_size));
+       DEBUG("Wrote %d / %lluk bytes\n",written,(unsigned long 
long)filestat.st_size);

         /**********************************
          * verify that flash == file data *
@@ -349,16 +349,16 @@ int main (int argc,char *argv[])
         size = filestat.st_size;
         i = BUFSIZE;
         written = 0;
-       if (flags & FLAG_VERBOSE) log_printf (LOG_NORMAL,"Verifying 
data: 0k/%luk (0%%)",KB (filestat.st_size));
+       if (flags & FLAG_VERBOSE) log_printf (LOG_NORMAL,"Verifying 
data: 0k/%lluk (0%%)",KB ((unsigned long long)filestat.st_size));
         while (size)
         {
                 if (size < BUFSIZE) i = size;
                 if (flags & FLAG_VERBOSE)
                         log_printf (LOG_NORMAL,
-                                       "\rVerifying data: %dk/%luk 
(%lu%%)",
+                                       "\rVerifying data: %dk/%lluk 
(%lu%%)",
                                         KB (written + i),
-                                       KB (filestat.st_size),
-                                       PERCENTAGE (written + 
i,filestat.st_size));
+                                       KB ((unsigned long 
long)filestat.st_size),
+                                       PERCENTAGE (written + 
i,(unsigned long long)filestat.st_size));

                 /* read from filename */
                 safe_read (fil_fd,filename,src,i,flags & FLAG_VERBOSE);
@@ -380,10 +380,10 @@ int main (int argc,char *argv[])
         }
         if (flags & FLAG_VERBOSE)
                 log_printf (LOG_NORMAL,
-                               "\rVerifying data: %luk/%luk (100%%)\n",
+                               "\rVerifying data: %lluk/%lluk (100%%)\n",
                                 KB (filestat.st_size),
                                 KB (filestat.st_size));
-       DEBUG("Verified %d / %luk bytes\n",written,filestat.st_size);
+       DEBUG("Verified %d / %lluk bytes\n",written,(unsigned long 
long)filestat.st_size);

         exit (EXIT_SUCCESS);
  }
-- 
2.0.4



More information about the linux-mtd mailing list