diff --git a/ChangeLog b/ChangeLog index 6216f38e49..03942b0f73 100644 --- a/ChangeLog +++ b/ChangeLog @@ -121,7 +121,7 @@ arch/c5471 and arch/dm320 are deprecated and will be removed when the new c5471 and dm320 logic is verified. -0.2.5 2007-xx-xx Gregory Nutt +0.2.5 2007-05-19 Gregory Nutt * Corrected some build/configuration issues introduced with the last release. @@ -129,7 +129,7 @@ development board (untested) * Added support for block devices. * Simulated target now exports a VFAT filesystem - * Begin support for VFAT filesystem (not yet functional) + * Begin support for VFAT filesystem (missing functionalit) * Added mount() and umount() * Fix bug in memcmp return value * Fix errors in timeslice calculation (several places) @@ -137,5 +137,8 @@ * close() was not closing the underlying device. * Added fsync() * Added strspn() and strcspn() + +0.2.6 2007-xx-xx Gregory Nutt + * Started m68322 diff --git a/Documentation/NuttX.html b/Documentation/NuttX.html index 4050e7258c..965b575e75 100644 --- a/Documentation/NuttX.html +++ b/Documentation/NuttX.html @@ -183,7 +183,7 @@

- The seventh release of NuttX (nuttx-0.2.4) is available for download + The 8th release of NuttX (nuttx-0.2.5) is available for download from the SourceForge website.

@@ -248,7 +248,7 @@

STATUS: - This port is in progress and should be available in the nuttx-0.2.5 release. + This port is in progress and should be available in the nuttx-0.2.6 release.

@@ -500,7 +500,7 @@ Other memory: arch/c5471 and arch/dm320 are deprecated and will be removed when the new c5471 and dm320 logic is verified. -0.2.5 2007-xx-xx Gregory Nutt +0.2.5 2007-05-19 Gregory Nutt * Corrected some build/configuration issues introduced with the last release. @@ -508,7 +508,7 @@ Other memory: development board (untested) * Added support for block devices. * Simulated target now exports a VFAT filesystem - * Begin support for VFAT filesystem (not yet functional) + * Begin support for VFAT filesystem (missing functionalit) * Added mount() and umount() * Fix bug in memcmp return value * Fix errors in timeslice calculation (several places) @@ -516,6 +516,9 @@ Other memory: * close() was not closing the underlying device. * Added fsync() * Added strspn() and strcspn() + +0.2.6 2007-xx-xx Gregory Nutt + * Started m68322 diff --git a/ReleaseNotes b/ReleaseNotes index 57ed2aab00..7010da6737 100644 --- a/ReleaseNotes +++ b/ReleaseNotes @@ -1,20 +1,18 @@ -nuttx-0.2.4 +nuttx-0.2.5 ^^^^^^^^^^^^ -This is the 7th release of NuttX. This release is only to roll out -build changes to better support different SoC's that use the same -processor architecture. In particular, the two existing ARM architectures, -c5471 and DM320 were combined into a single ARM directory. This was done -in preparation for an LPC2148 port that is currently in progress. There -is NO new functionality or significant bufixes in this release. +This is the 8th release of NuttX. This release includes: + +(1) Several bug fixes +(2) Initial support for FAT filesystems. Testing has not been + exhaustive and some functionality is missing (mkdir, stat, unlink + chmod, and rename functionality is not yet implemented). +(3) Support for the NXP lpc2148 processor is included but is + untested as of this writing. The current implementation includes + only support for serial console and timer interrupt. See the ChangeLog for a complete list of changes. -This release has been verified on the Linux user-mode platform -and the Neuros OSD using the test program under examples/ostest. -The results of the testing is available in the source tree under -configs/ntosd-dm320/doc/test-results and under configs/sim/doc/test-results. -There are no known, critical defects but the project development status -remains at 'beta' status pending further test and evaluation. +This release has been verified only on the Linux user-mode platform. -This tarball contains a complete CVS snapshot from April 28, 2007. +This tarball contains a complete CVS snapshot from May 19, 2007. diff --git a/fs/fs_fat32.c b/fs/fs_fat32.c index a5b68831f9..f6c0ec421b 100644 --- a/fs/fs_fat32.c +++ b/fs/fs_fat32.c @@ -46,6 +46,7 @@ #include #include #include +#include #include #include #include @@ -829,6 +830,10 @@ static off_t fat_seek(FAR struct file *filp, off_t offset, int whence) struct inode *inode; struct fat_mountpt_s *fs; struct fat_file_s *ff; + sint32 cluster; + ssize_t position; + unsigned int clustersize; + unsigned int sectoroffset; int ret; /* Sanity checks */ @@ -843,18 +848,208 @@ static off_t fat_seek(FAR struct file *filp, off_t offset, int whence) DEBUGASSERT(fs != NULL); + /* Map the offset according to the whence option */ + switch (whence) + { + case SEEK_SET: /* The offset is set to offset bytes. */ + position = offset; + break; + + case SEEK_CUR: /* The offset is set to its current location plus + * offset bytes. */ + + position = offset + ff->ff_position; + break; + + case SEEK_END: /* The offset is set to the size of the file plus + * offset bytes. */ + + position = offset + ff->ff_size; + break; + + default: + return -EINVAL; + } + /* Make sure that the mount is still healthy */ fat_semtake(fs); ret = fat_checkmount(fs); if (ret != OK) { - fat_semgive(fs); - return ret; + goto errout_with_semaphore; + } + + /* Check if there is unwritten data in the file buffer */ + + ret = fat_ffcacheflush(fs, ff); + if (ret < 0) + { + goto errout_with_semaphore; + } + + /* Attempts to set the position beyound the end of file will + * work if the file is open for write access. + */ + + if (position > ff->ff_size && (ff->ff_oflags & O_WROK) == 0) + { + /* Otherwise, the position is limited to the file size */ + position = ff->ff_size; + } + + /* Set file position to the beginning of the file */ + + ff->ff_position = 0; + ff->ff_sectorsincluster = 1; + + /* Move file position if necessary */ + + if (position) + { + /* Get the start cluster of the file */ + + cluster = ff->ff_startcluster; + if (!cluster) + { + /* Create a new cluster chain if the file does not have one */ + + cluster = fat_createchain(fs); + if (cluster < 0) + { + ret = cluster; + goto errout_with_semaphore; + } + ff->ff_startcluster = cluster; + } + + if (cluster) + { + /* If the file has a cluster chain, follow it to the + * requested position. + */ + + clustersize = fs->fs_fatsecperclus * fs->fs_hwsectorsize; + for (;;) + { + /* Skip over clusters prior to the one containing + * the requested position. + */ + + ff->ff_currentcluster = cluster; + if (position <= clustersize) + { + break; + } + + /* Extend the cluster chain if write in enabled. NOTE: + * this is not consistent with the lseek description: + * "The lseek() function allows the file offset to be + * set beyond the end of the file (but this does not + * change the size of the file). If data is later written + * at this point, subsequent reads of the data in the + * gap (a "hole") return null bytes ('\0') until data + * is actually written into the gap." + */ + + if ((ff->ff_oflags & O_WROK) != 0) + { + /* Extend the cluster chain (fat_extendchain + * will follow the existing chain or add new + * clusters as needed. + */ + + cluster = fat_extendchain(fs, cluster); + } + else + { + /* Other we can only follong the existing chain */ + + cluster = fat_getcluster(fs, cluster); + } + + if (cluster < 0) + { + /* An error occurred getting the cluster */ + + ret = cluster; + goto errout_with_semaphore; + } + + /* Zero means that there is no further clusters available + * in the chain. + */ + + if (cluster == 0) + { + /* At the position to the current locaiton and + * break out. + */ + + position = clustersize; + break; + } + + if (cluster >= fs->fs_nclusters) + { + ret = -ENOSPC; + goto errout_with_semaphore; + } + + /* Otherwise, update the position and continue looking */ + + ff->ff_position += clustersize; + position -= clustersize; + } + + /* We get here after we have found the sector containing + * the requested position. + */ + + sectoroffset = (position - 1) / fs->fs_hwsectorsize; + + /* And get the current sector from the cluster and + * the sectoroffset into the cluster. + */ + + ff->ff_currentsector = + fat_cluster2sector(fs, cluster) + sectoroffset; + + /* Load the sector corresponding to the position */ + + if ((position & SEC_NDXMASK(fs)) != 0) + { + ret = fat_ffcacheread(fs, ff, ff->ff_currentsector); + if (ret < 0) + { + goto errout_with_semaphore; + } + } + + /* Save the number of sectors left in the cluster */ + + ff->ff_sectorsincluster = fs->fs_fatsecperclus - sectoroffset; + + /* And save the new file position */ + + ff->ff_position += position; + } + } + + /* If we extended the size of the file, then mark the file as modified. */ + + if ((ff->ff_oflags & O_WROK) != 0 && ff->ff_position > ff->ff_size) + { + ff->ff_size = ff->ff_position; + ff->ff_bflags |= FFBUFF_MODIFIED; } fat_semgive(fs); - return -ENOSYS; + return OK; + + errout_with_semaphore: + fat_semgive(fs); + return ret; } /**************************************************************************** @@ -959,7 +1154,7 @@ static int fat_sync(FAR struct file *filp) * in the sector using the saved directory index. */ - direntry = &fs->fs_buffer[ff->ff_dirindex]; + direntry = &fs->fs_buffer[ff->ff_dirindex * 32]; /* Set the archive bit, set the write time, and update * anything that may have* changed in the directory