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 /firmware | |
parent | 6dd24bfbcc893d05ebba9412158ff54313252fd8 (diff) | |
download | rockbox-d9dcb0fbcfa85a312e0796c98abfe24f88422849.tar.gz rockbox-d9dcb0fbcfa85a312e0796c98abfe24f88422849.zip |
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
Diffstat (limited to 'firmware')
-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 01ae17224d..c44f7af809 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) | |||
543 | file->dirty = true; | 543 | file->dirty = true; |
544 | } | 544 | } |
545 | else { | 545 | else { |
546 | /* Flush the cache first if it's dirty. */ | ||
547 | if (file->dirty) | ||
548 | { | ||
549 | rc = flush_cache(fd); | ||
550 | if ( rc < 0 ) { | ||
551 | errno = EIO; | ||
552 | return rc * 10 - 8; | ||
553 | } | ||
554 | file->cacheoffset = -1; | ||
555 | } | ||
556 | |||
546 | rc = fat_readwrite(&(file->fatfile), 1, &(file->cache),false); | 557 | rc = fat_readwrite(&(file->fatfile), 1, &(file->cache),false); |
547 | if (rc < 1 ) { | 558 | if (rc < 1 ) { |
548 | DEBUGF("Failed caching sector\n"); | 559 | DEBUGF("Failed caching sector\n"); |