diff options
| author | Miika Pekkarinen <miipekk@ihme.org> | 2005-12-13 16:11:00 +0000 |
|---|---|---|
| committer | Miika Pekkarinen <miipekk@ihme.org> | 2005-12-13 16:11:00 +0000 |
| commit | d9dcb0fbcfa85a312e0796c98abfe24f88422849 (patch) | |
| tree | ec4ac072d7b916ed2561438eb810b0fa619837f7 | |
| parent | 6dd24bfbcc893d05ebba9412158ff54313252fd8 (diff) | |
| download | rockbox-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.c | 11 |
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"); |