diff options
author | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2011-09-15 23:06:41 +0000 |
---|---|---|
committer | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2011-09-15 23:06:41 +0000 |
commit | 7da9d707ebf877eeda8d126a8489997cc32eaa5d (patch) | |
tree | 540eb2a0ff127b4240be66e1daddbc4211a634ec | |
parent | dfcb307e3869a6df376eb0c663e1798235a1c40e (diff) | |
download | nuttx-7da9d707ebf877eeda8d126a8489997cc32eaa5d.tar.gz nuttx-7da9d707ebf877eeda8d126a8489997cc32eaa5d.tar.bz2 nuttx-7da9d707ebf877eeda8d126a8489997cc32eaa5d.zip |
Small improvement in FAT buffering logic on write()
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@3957 42af7a65-404d-4744-a932-0658087f49c3
-rw-r--r-- | nuttx/fs/fat/fs_fat32.c | 27 | ||||
-rw-r--r-- | nuttx/include/fcntl.h | 4 |
2 files changed, 17 insertions, 14 deletions
diff --git a/nuttx/fs/fat/fs_fat32.c b/nuttx/fs/fat/fs_fat32.c index 4dfda324f..8a7f6e29a 100644 --- a/nuttx/fs/fat/fs_fat32.c +++ b/nuttx/fs/fat/fs_fat32.c @@ -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; } diff --git a/nuttx/include/fcntl.h b/nuttx/include/fcntl.h index 69f4fb5a8..b6440d085 100644 --- a/nuttx/include/fcntl.h +++ b/nuttx/include/fcntl.h @@ -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 */ |