FAT: fix some issues in FAT write support code
PATCH 1/1 FAT: fix some issues in FAT write support code
Writing a file to the FAT partition didn't work while a test using a CF card. The test was done on mpc5200 based board (powerpc). There is a number of problems in FAT write code:
Compiler warning:fat_write.c: In function 'file_fat_write':
fat_write.c:326: warning: 'counter' may be used uninitialized in this function
fat_write.c:326: note: 'counter' was declared here
'l_filename' string is not terminated, so a file name with garbage at the end is used as a file name as shown by debug code.
Return value of set_contents() is not checked properly so actually a file won't be written at all (as checked using 'fatls' after a write attempt with 'fatwrite' command).
do_fat_write() doesn't return the number of written bytes if no error happened. However the return value of this function is used to show the number of written bytes in do_fat_fswrite().
The patch adds some debug code and fixes above mentioned problems and also fixes a typo in error output.
NOTE: after a successful write to the FAT partition (under U-Boot) the partition was checked under Linux using fsck. The partition needed fixing FATs:
-bash-3.2# fsck -a /dev/sda1
fsck 1.39 (29-May-2006)
dosfsck 2.11, 12 Mar 2005, FAT32, LFN
FATs differ but appear to be intact. Using first FAT. Performing changes.
--- fs/fat/fat_write.c | 19 ++++++++++++++----- 1 files changed, 14 insertions(+), 5 deletions(-)
fs/fat/fat_write.c +14 -5
@@ -323,7 +323,7 @@ static void fill_dir_slot(fsdata *mydata, dir_entry **dentptr, const char *l_name) {dir_slot *slotptr = (dir_slot *)get_vfatname_block; -__u8 counter, checksum; +__u8 counter =0 , checksum;int idx =0 , ret;char s_name[16 ];
@@ -926,6 +926,7 @@ static int do_fat_write(const char *filename, void *buffer,int cursect;int root_cluster, ret =-1 , name_len;char l_filename[VFAT_MAXLEN_BYTES ]; +int write_size = size; dir_curclust =0 ;
@@ -985,7 +986,11 @@ static int do_fat_write(const char *filename, void *buffer, dentptr = (dir_entry *) do_fat_read_block; name_len =strlen (filename); +if (name_len >=VFAT_MAXLEN_BYTES ) + name_len =VFAT_MAXLEN_BYTES -1 ; +memcpy (l_filename, filename, name_len); + l_filename[name_len] =0 ;/* terminate the string */ downcase (l_filename); startsect = mydata->rootdir_sect;
@@ -1012,10 +1017,12 @@ static int do_fat_write(const char *filename, void *buffer, } ret =set_contents (mydata, retdent, buffer, size); -if (ret) { +if (ret <0 ) {printf ("Error: writing contents\n" ); goto exit; } + write_size = ret; +debug ("attempt to write 0x%x bytes\n" , write_size);/* Flush fat buffer */ ret =flush_fat_buffer (mydata);
@@ -1029,7 +1036,7 @@ static int do_fat_write(const char *filename, void *buffer, get_dentfromdir_block, mydata->clust_size * mydata->sect_size);if (ret) { -printf ("Error: wrinting directory entry\n" ); +printf ("Error: writing directory entry\n" ); goto exit; } }else {
@@ -1056,10 +1063,12 @@ static int do_fat_write(const char *filename, void *buffer, start_cluster, size, 0x20); ret =set_contents (mydata, empty_dentptr, buffer, size); -if (ret) { +if (ret <0 ) {printf ("Error: writing contents\n" ); goto exit; } + write_size = ret; +debug ("attempt to write 0x%x bytes\n" , write_size);/* Flush fat buffer */ ret =flush_fat_buffer (mydata);
@@ -1080,7 +1089,7 @@ static int do_fat_write(const char *filename, void *buffer, exit:free (mydata->fatbuf); -return ret; +return ret <0 ? ret : write_size; }int file_fat_write (const char *filename,void *buffer,unsigned long maxsize)
Signature · 1 line
1.7.1
PATCH 1/1 FAT: fix some issues in FAT write support code
Quoted 37 lines · Anatolij Gustschin
Writing a file to the FAT partition didn't work while a test using a CF card. The test was done on mpc5200 based board (powerpc). There is a number of problems in FAT write code:
Compiler warning:
fat_write.c: In function 'file_fat_write':
fat_write.c:326: warning: 'counter' may be used uninitialized in this function
fat_write.c:326: note: 'counter' was declared here'
l_filename' string is not terminated, so a file name with garbage at the end is used as a file name as shown by debug code.Return value of
set_contents()is not checked properly so actually a file won't be written at all (as checked using 'fatls' after a write attempt with 'fatwrite' command).
do_fat_write()doesn't return the number of written bytes if no error happened. However the return value of this function is used to show the number of written bytes indo_fat_fswrite().The patch adds some debug code and fixes above mentioned problems and also fixes a typo in error output.
NOTE: after a successful write to the FAT partition (under U-Boot) the partition was checked under Linux using fsck. The partition needed fixing FATs:
-bash-3.2# fsck -a/dev/sda1
fsck 1.39 (29-May-2006)
dosfsck 2.11, 12 Mar 2005, FAT32, LFN
FATs differ but appear to be intact. Using first FAT. Performing changes.
Quoted 3 lines
Signed-off-by Anatolij Gustschin <[email protected]>Cc Donggeun Kim <[email protected]>Cc Aaron Williams <[email protected]>
Thanks.
-Donggeun
Wolfgang Denk
AppliedPATCH 1/1 FAT: fix some issues in FAT write support code
In reply to Anatolij GustschinDear Anatolij Gustschin,
Quoted 37 lines · In message <[email protected]> you wrote:
Writing a file to the FAT partition didn't work while a test using a CF card. The test was done on mpc5200 based board (powerpc). There is a number of problems in FAT write code:
Compiler warning:
fat_write.c: In function 'file_fat_write':
fat_write.c:326: warning: 'counter' may be used uninitialized in this function
fat_write.c:326: note: 'counter' was declared here'
l_filename' string is not terminated, so a file name with garbage at the end is used as a file name as shown by debug code.Return value of
set_contents()is not checked properly so actually a file won't be written at all (as checked using 'fatls' after a write attempt with 'fatwrite' command).
do_fat_write()doesn't return the number of written bytes if no error happened. However the return value of this function is used to show the number of written bytes indo_fat_fswrite().The patch adds some debug code and fixes above mentioned problems and also fixes a typo in error output.
NOTE: after a successful write to the FAT partition (under U-Boot) the partition was checked under Linux using fsck. The partition needed fixing FATs:
-bash-3.2# fsck -a/dev/sda1
fsck 1.39 (29-May-2006)
dosfsck 2.11, 12 Mar 2005, FAT32, LFN
FATs differ but appear to be intact. Using first FAT. Performing changes.
Quoted 6 lines
Signed-off-by Anatolij Gustschin <[email protected]>Cc Donggeun Kim <[email protected]>Cc Aaron Williams <[email protected]>--- fs/fat/fat_write.c | 19 ++++++++++++++----- 1 files changed, 14 insertions(+), 5 deletions(-)
Applied, thanks.
Best regards,
Wolfgang Denk
Signature · 5 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de Emotions are alien to me. I'm a scientist. -- Spock, "This Side of Paradise", stardate 3417.3