summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiika Pekkarinen <miipekk@ihme.org>2005-12-13 16:11:00 +0000
committerMiika Pekkarinen <miipekk@ihme.org>2005-12-13 16:11:00 +0000
commitd9dcb0fbcfa85a312e0796c98abfe24f88422849 (patch)
treeec4ac072d7b916ed2561438eb810b0fa619837f7
parent6dd24bfbcc893d05ebba9412158ff54313252fd8 (diff)
downloadrockbox-d9dcb0fbcfa85a312e0796c98abfe24f88422849.zip
rockbox-d9dcb0fbcfa85a312e0796c98abfe24f88422849.tar.gz
rockbox-d9dcb0fbcfa85a312e0796c98abfe24f88422849.tar.bz2
rockbox-d9dcb0fbcfa85a312e0796c98abfe24f88422849.tar.xz
Fixed a file system driver caching bug corrupting files on certain situations
(when reading and writing the same file). git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8231 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/common/file.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/firmware/common/file.c b/firmware/common/file.c
index 01ae172..c44f7af 100644
--- a/firmware/common/file.c
+++ b/firmware/common/file.c
@@ -543,6 +543,17 @@ static int readwrite(int fd, void* buf, long count, bool write)
file->dirty = true;
}
else {
+ /* Flush the cache first if it's dirty. */
+ if (file->dirty)
+ {
+ rc = flush_cache(fd);
+ if ( rc < 0 ) {
+ errno = EIO;
+ return rc * 10 - 8;
+ }
+ file->cacheoffset = -1;
+ }
+
rc = fat_readwrite(&(file->fatfile), 1, &(file->cache),false);
if (rc < 1 ) {
DEBUGF("Failed caching sector\n");