9
0
Fork 0

Small improvement in FAT buffering logic on write()

git-svn-id: https://nuttx.svn.sourceforge.net/svnroot/nuttx/trunk@3957 7fd9a85b-ad96-42d3-883c-3090e2eb8679
This commit is contained in:
patacongo 2011-09-15 23:06:41 +00:00
parent 9cda00f7f9
commit bf6eea145f
2 changed files with 17 additions and 14 deletions

View File

@ -708,14 +708,6 @@ static ssize_t fat_write(FAR struct file *filep, const char *buffer,
while (buflen > 0)
{
/* Check if there is unwritten data in the file buffer */
ret = fat_ffcacheflush(fs, ff);
if (ret < 0)
{
goto errout_with_semaphore;
}
/* Check if the user has provided a buffer large enough to
* hold one or more complete sectors.
*/
@ -737,7 +729,8 @@ static ssize_t fat_write(FAR struct file *filep, const char *buffer,
}
/* We are not sure of the state of the file buffer so
* the safest thing to do is just invalidate it
* the safest thing to do is write back any dirty, cached sector
* and invalidate the current cache content.
*/
(void)fat_ffcacheinvalidate(fs, ff);
@ -770,6 +763,10 @@ static ssize_t fat_write(FAR struct file *filep, const char *buffer,
if (filep->f_pos < ff->ff_size || sectorindex != 0)
{
/* Read the current sector into memory (perhaps first flushing
* the old, dirty sector to disk).
*/
ret = fat_ffcacheread(fs, ff, ff->ff_currentsector);
if (ret < 0)
{
@ -778,9 +775,15 @@ static ssize_t fat_write(FAR struct file *filep, const char *buffer,
}
else
{
/* But in this rare case, we do have to mark the unused cached
* buffer as the current buffer.
*/
/* Flush unwritten data in the sector cache. */
ret = fat_ffcacheflush(fs, ff);
if (ret < 0)
{
goto errout_with_semaphore;
}
/* Now mark the clean cache buffer as the current sector. */
ff->ff_cachesector = ff->ff_currentsector;
}

View File

@ -75,7 +75,7 @@
#define F_DUPFD 0 /* Duplicate a file descriptor */
#define F_GETFD 1 /* Read the file descriptor flags */
#define F_GETFL 2 /* Read the file status flags */
#define F_GETLEASE 3 /* Indicas what type of lease is held on fd (linux) */
#define F_GETLEASE 3 /* Indicates what type of lease is held on fd (linux) */
#define F_GETLK 4 /* Check if we could place a lock */
#define F_GETOWN 5 /* Get the pid receiving SIGIO and SIGURG signals for fd */
#define F_GETSIG 6 /* Get the signal sent */
@ -90,7 +90,7 @@
/* For posix fcntl() and lockf() */
#define F_RDLCK 0 /* Take out a read lease */
#define F_RDLCK 0 /* Take out a read lease */
#define F_WRLCK 1 /* Take out a write lease */
#define F_UNLCK 2 /* Remove a lease */