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. Signed-off-by: Anatolij Gustschin <agust@denx.de> Cc: Donggeun Kim <dg77.kim@samsung.com> Cc: Aaron Williams <Aaron.Williams@cavium.com> Acked-by: Donggeun Kim <dg77.kim@samsung.com>
This commit is contained in:
parent
e27334212c
commit
8506eb8d6a
|
@ -323,7 +323,7 @@ static void
|
||||||
fill_dir_slot(fsdata *mydata, dir_entry **dentptr, const char *l_name)
|
fill_dir_slot(fsdata *mydata, dir_entry **dentptr, const char *l_name)
|
||||||
{
|
{
|
||||||
dir_slot *slotptr = (dir_slot *)get_vfatname_block;
|
dir_slot *slotptr = (dir_slot *)get_vfatname_block;
|
||||||
__u8 counter, checksum;
|
__u8 counter = 0, checksum;
|
||||||
int idx = 0, ret;
|
int idx = 0, ret;
|
||||||
char s_name[16];
|
char s_name[16];
|
||||||
|
|
||||||
|
@ -926,6 +926,7 @@ static int do_fat_write(const char *filename, void *buffer,
|
||||||
int cursect;
|
int cursect;
|
||||||
int root_cluster, ret = -1, name_len;
|
int root_cluster, ret = -1, name_len;
|
||||||
char l_filename[VFAT_MAXLEN_BYTES];
|
char l_filename[VFAT_MAXLEN_BYTES];
|
||||||
|
int write_size = size;
|
||||||
|
|
||||||
dir_curclust = 0;
|
dir_curclust = 0;
|
||||||
|
|
||||||
|
@ -985,7 +986,11 @@ static int do_fat_write(const char *filename, void *buffer,
|
||||||
dentptr = (dir_entry *) do_fat_read_block;
|
dentptr = (dir_entry *) do_fat_read_block;
|
||||||
|
|
||||||
name_len = strlen(filename);
|
name_len = strlen(filename);
|
||||||
|
if (name_len >= VFAT_MAXLEN_BYTES)
|
||||||
|
name_len = VFAT_MAXLEN_BYTES - 1;
|
||||||
|
|
||||||
memcpy(l_filename, filename, name_len);
|
memcpy(l_filename, filename, name_len);
|
||||||
|
l_filename[name_len] = 0; /* terminate the string */
|
||||||
downcase(l_filename);
|
downcase(l_filename);
|
||||||
|
|
||||||
startsect = mydata->rootdir_sect;
|
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);
|
ret = set_contents(mydata, retdent, buffer, size);
|
||||||
if (ret) {
|
if (ret < 0) {
|
||||||
printf("Error: writing contents\n");
|
printf("Error: writing contents\n");
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
write_size = ret;
|
||||||
|
debug("attempt to write 0x%x bytes\n", write_size);
|
||||||
|
|
||||||
/* Flush fat buffer */
|
/* Flush fat buffer */
|
||||||
ret = flush_fat_buffer(mydata);
|
ret = flush_fat_buffer(mydata);
|
||||||
|
@ -1029,7 +1036,7 @@ static int do_fat_write(const char *filename, void *buffer,
|
||||||
get_dentfromdir_block,
|
get_dentfromdir_block,
|
||||||
mydata->clust_size * mydata->sect_size);
|
mydata->clust_size * mydata->sect_size);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
printf("Error: wrinting directory entry\n");
|
printf("Error: writing directory entry\n");
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -1056,10 +1063,12 @@ static int do_fat_write(const char *filename, void *buffer,
|
||||||
start_cluster, size, 0x20);
|
start_cluster, size, 0x20);
|
||||||
|
|
||||||
ret = set_contents(mydata, empty_dentptr, buffer, size);
|
ret = set_contents(mydata, empty_dentptr, buffer, size);
|
||||||
if (ret) {
|
if (ret < 0) {
|
||||||
printf("Error: writing contents\n");
|
printf("Error: writing contents\n");
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
write_size = ret;
|
||||||
|
debug("attempt to write 0x%x bytes\n", write_size);
|
||||||
|
|
||||||
/* Flush fat buffer */
|
/* Flush fat buffer */
|
||||||
ret = flush_fat_buffer(mydata);
|
ret = flush_fat_buffer(mydata);
|
||||||
|
@ -1080,7 +1089,7 @@ static int do_fat_write(const char *filename, void *buffer,
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
free(mydata->fatbuf);
|
free(mydata->fatbuf);
|
||||||
return ret;
|
return ret < 0 ? ret : write_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
int file_fat_write(const char *filename, void *buffer, unsigned long maxsize)
|
int file_fat_write(const char *filename, void *buffer, unsigned long maxsize)
|
||||||
|
|
Loading…
Reference in New Issue