Fixed critical FAT bugs
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@894 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
parent
cd1ddef34a
commit
34cfa3ead5
@ -449,11 +449,14 @@
|
|||||||
* NSH: Add ping command
|
* NSH: Add ping command
|
||||||
* Correct IP checksum calculation in ICMP and UDP message send logic.
|
* Correct IP checksum calculation in ICMP and UDP message send logic.
|
||||||
* NSH: Created an HTML document and a more detailed README file describing NSH.
|
* NSH: Created an HTML document and a more detailed README file describing NSH.
|
||||||
* Added basic TFTP client logic (netutils/tftpc). Untested as of initial check-in.
|
* Added basic TFTP client logic (netutils/tftpc).
|
||||||
* NSH: Add get and put commands to support TFTP get and put operations.
|
* NSH: Add get and put commands to support TFTP get and put operations.
|
||||||
* NSH: Added a mkrd command that will create a RAMDISK that can be formatted
|
* NSH: Added a mkrd command that will create a RAMDISK that can be formatted
|
||||||
and mounted.
|
and mounted.
|
||||||
* Corrected a critical bug that prevent recvfrom from receiving packets from
|
* Corrected a critical bug that prevent recvfrom from receiving packets from
|
||||||
any remote UDP port.
|
any remote UDP port.
|
||||||
* NSH: Add hexadecimal dump command (xd)
|
* NSH: Add hexadecimal dump command (xd)
|
||||||
|
* Fixed several critical bugs with regard to fat reading and writing and FAT12
|
||||||
|
accesses. Basically the FAT FS only worked with my tiny test files and test
|
||||||
|
cases. A lot of stronger FAT tested is needed!!
|
||||||
|
|
||||||
|
@ -1083,6 +1083,9 @@ nuttx-0.3.14 2008-xx-xx Gregory Nutt <spudmonkey@racsa.co.cr>
|
|||||||
* Corrected a critical bug that prevent recvfrom from receiving packets from
|
* Corrected a critical bug that prevent recvfrom from receiving packets from
|
||||||
any remote UDP port.
|
any remote UDP port.
|
||||||
* NSH: Add hexadecimal dump command (xd)
|
* NSH: Add hexadecimal dump command (xd)
|
||||||
|
* Fixed several critical bugs with regard to fat reading and writing and FAT12
|
||||||
|
accesses. Basically the FAT FS only worked with my tiny test files and test
|
||||||
|
cases. A lot of stronger FAT tested is needed!!
|
||||||
|
|
||||||
pascal-0.1.3 2008-xx-xx Gregory Nutt <spudmonkey@racsa.co.cr>
|
pascal-0.1.3 2008-xx-xx Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
|
|
||||||
|
@ -579,7 +579,7 @@ static ssize_t fat_read(FAR struct file *filep, char *buffer, size_t buflen)
|
|||||||
{
|
{
|
||||||
/* Find the next cluster in the FAT. */
|
/* Find the next cluster in the FAT. */
|
||||||
|
|
||||||
cluster = fat_getcluster(fs, cluster);
|
cluster = fat_getcluster(fs, ff->ff_currentcluster);
|
||||||
if (cluster < 2 || cluster >= fs->fs_nclusters)
|
if (cluster < 2 || cluster >= fs->fs_nclusters)
|
||||||
{
|
{
|
||||||
ret = -EINVAL; /* Not the right error */
|
ret = -EINVAL; /* Not the right error */
|
||||||
|
@ -986,11 +986,11 @@ ssize_t fat_getcluster(struct fat_mountpt_s *fs, uint32 clusterno)
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: fat_putcluster
|
* Name: fat_putcluster
|
||||||
*
|
*
|
||||||
* Desciption: Write a new cluster start sector into the FAT
|
* Desciption: Write a new cluster into the FAT
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
int fat_putcluster(struct fat_mountpt_s *fs, uint32 clusterno, size_t startsector)
|
int fat_putcluster(struct fat_mountpt_s *fs, uint32 clusterno, size_t nextcluster)
|
||||||
{
|
{
|
||||||
/* Verify that the cluster number is within range. Zero erases the cluster. */
|
/* Verify that the cluster number is within range. Zero erases the cluster. */
|
||||||
|
|
||||||
@ -1021,21 +1021,26 @@ int fat_putcluster(struct fat_mountpt_s *fs, uint32 clusterno, size_t startsecto
|
|||||||
if (fat_fscacheread(fs, fatsector)< 0)
|
if (fat_fscacheread(fs, fatsector)< 0)
|
||||||
{
|
{
|
||||||
/* Read error */
|
/* Read error */
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Output the LS byte first handling the 12-bit alignment within
|
/* Get the LS byte first handling the 12-bit alignment within
|
||||||
* the 16-bits
|
* the 16-bits
|
||||||
*/
|
*/
|
||||||
|
|
||||||
fatindex = fatoffset & SEC_NDXMASK(fs);
|
fatindex = fatoffset & SEC_NDXMASK(fs);
|
||||||
if ((clusterno & 1) != 0)
|
if ((clusterno & 1) != 0)
|
||||||
{
|
{
|
||||||
value = (fs->fs_buffer[fatindex] & 0x0f) | startsector << 4;
|
/* Save the LS four bits of the next cluster */
|
||||||
|
|
||||||
|
value = (fs->fs_buffer[fatindex] & 0x0f) | nextcluster << 4;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
value = (ubyte)startsector;
|
/* Save the LS eight bits of the next cluster */
|
||||||
|
|
||||||
|
value = (ubyte)nextcluster;
|
||||||
}
|
}
|
||||||
fs->fs_buffer[fatindex] = value;
|
fs->fs_buffer[fatindex] = value;
|
||||||
|
|
||||||
@ -1069,11 +1074,15 @@ int fat_putcluster(struct fat_mountpt_s *fs, uint32 clusterno, size_t startsecto
|
|||||||
|
|
||||||
if ((clusterno & 1) != 0)
|
if ((clusterno & 1) != 0)
|
||||||
{
|
{
|
||||||
value = (ubyte)(startsector >> 4);
|
/* Save the MS eight bits of the next cluster */
|
||||||
|
|
||||||
|
value = (ubyte)(nextcluster >> 4);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
value = (fs->fs_buffer[fatindex] & 0xf0) | (startsector & 0x0f);
|
/* Save the MS four bits of the next cluster */
|
||||||
|
|
||||||
|
value = (fs->fs_buffer[fatindex] & 0xf0) | ((nextcluster >> 8) & 0x0f);
|
||||||
}
|
}
|
||||||
fs->fs_buffer[fatindex] = value;
|
fs->fs_buffer[fatindex] = value;
|
||||||
}
|
}
|
||||||
@ -1090,7 +1099,7 @@ int fat_putcluster(struct fat_mountpt_s *fs, uint32 clusterno, size_t startsecto
|
|||||||
/* Read error */
|
/* Read error */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
FAT_PUTFAT16(fs->fs_buffer, fatindex, startsector & 0xffff);
|
FAT_PUTFAT16(fs->fs_buffer, fatindex, nextcluster & 0xffff);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -1105,7 +1114,7 @@ int fat_putcluster(struct fat_mountpt_s *fs, uint32 clusterno, size_t startsecto
|
|||||||
/* Read error */
|
/* Read error */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
FAT_PUTFAT32(fs->fs_buffer, fatindex, startsector & 0x0fffffff);
|
FAT_PUTFAT32(fs->fs_buffer, fatindex, nextcluster & 0x0fffffff);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -1213,16 +1222,19 @@ sint32 fat_extendchain(struct fat_mountpt_s *fs, uint32 cluster)
|
|||||||
if (startsector < 0)
|
if (startsector < 0)
|
||||||
{
|
{
|
||||||
/* An error occurred, return the error value */
|
/* An error occurred, return the error value */
|
||||||
|
|
||||||
return startsector;
|
return startsector;
|
||||||
}
|
}
|
||||||
else if (startsector < 2)
|
else if (startsector < 2)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Oops.. this cluster does not exist. */
|
/* Oops.. this cluster does not exist. */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else if (startsector < fs->fs_nclusters)
|
else if (startsector < fs->fs_nclusters)
|
||||||
{
|
{
|
||||||
/* It is already followed by next cluster */
|
/* It is already followed by next cluster */
|
||||||
|
|
||||||
return startsector;
|
return startsector;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user