diff options
author | Peter D'Hoye <peter.dhoye@gmail.com> | 2007-12-13 23:36:22 +0000 |
---|---|---|
committer | Peter D'Hoye <peter.dhoye@gmail.com> | 2007-12-13 23:36:22 +0000 |
commit | eb947cdde1a34588de767ea75762269253af487a (patch) | |
tree | 742ba8891394103004bf37666829c2ba128bc603 | |
parent | 10d0344e296eeb9259e9b609bb9b656ba1d7e42a (diff) | |
download | rockbox-eb947cdde1a34588de767ea75762269253af487a.tar.gz rockbox-eb947cdde1a34588de767ea75762269253af487a.zip |
Another fix for file system issues when encountering disk full (like when recording)
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15920 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r-- | apps/codecs/mp3_enc.c | 3 | ||||
-rw-r--r-- | apps/codecs/wav_enc.c | 8 | ||||
-rw-r--r-- | apps/codecs/wavpack_enc.c | 3 | ||||
-rw-r--r-- | firmware/common/file.c | 24 |
4 files changed, 35 insertions, 3 deletions
diff --git a/apps/codecs/mp3_enc.c b/apps/codecs/mp3_enc.c index 2dc9bcbb3d..26cc1dd73f 100644 --- a/apps/codecs/mp3_enc.c +++ b/apps/codecs/mp3_enc.c @@ -2329,6 +2329,9 @@ static bool on_start_file(struct enc_file_event_data *data) static bool on_end_file(struct enc_file_event_data *data) { + if (data->rec_file < 0) + return false; /* file already closed, nothing more we can do */ + /* always _try_ to write the file header, even on error */ if (ci->close(data->rec_file) != 0) return false; diff --git a/apps/codecs/wav_enc.c b/apps/codecs/wav_enc.c index 25d2838e7d..5932fd319d 100644 --- a/apps/codecs/wav_enc.c +++ b/apps/codecs/wav_enc.c @@ -144,10 +144,12 @@ static bool on_end_file(struct enc_file_event_data *data) struct riff_header hdr; uint32_t data_size; - /* always _try_ to write the file header, even on error */ + if (data->rec_file < 0) + return false; /* file already closed, nothing more we can do */ - if (ci->lseek(data->rec_file, 0, SEEK_SET) != 0 || - ci->read(data->rec_file, &hdr, sizeof (hdr)) != sizeof (hdr)) + /* always _try_ to write the file header, even on error */ + if ((ci->lseek(data->rec_file, 0, SEEK_SET)) || + (ci->read(data->rec_file, &hdr, sizeof (hdr)) != sizeof (hdr))) { return false; } diff --git a/apps/codecs/wavpack_enc.c b/apps/codecs/wavpack_enc.c index 70261e70e2..670a518d64 100644 --- a/apps/codecs/wavpack_enc.c +++ b/apps/codecs/wavpack_enc.c @@ -257,6 +257,9 @@ static bool on_end_file(struct enc_file_event_data *data) uint32_t data_size; + if (data->rec_file < 0) + return false; /* file already closed, nothing more we can do */ + /* always _try_ to write the file header, even on error */ /* read template headers at start */ diff --git a/firmware/common/file.c b/firmware/common/file.c index 9290f508b8..f0437f9e68 100644 --- a/firmware/common/file.c +++ b/firmware/common/file.c @@ -548,6 +548,14 @@ static int readwrite(int fd, void* buf, long count, bool write) file->fileoffset += nread; } file->cacheoffset = -1; + /* adjust file size to length written */ + if ( write && file->fileoffset > file->size ) + { + file->size = file->fileoffset; +#ifdef HAVE_DIRCACHE + dircache_update_filesize(fd, file->size, file->fatfile.firstcluster); +#endif + } return nread ? nread : rc * 10 - 4; } else { @@ -580,6 +588,14 @@ static int readwrite(int fd, void* buf, long count, bool write) errno = EIO; file->fileoffset += nread; file->cacheoffset = -1; + /* adjust file size to length written */ + if ( file->fileoffset > file->size ) + { + file->size = file->fileoffset; +#ifdef HAVE_DIRCACHE + dircache_update_filesize(fd, file->size, file->fatfile.firstcluster); +#endif + } return nread ? nread : rc * 10 - 5; } /* seek back one sector to put file position right */ @@ -591,6 +607,14 @@ static int readwrite(int fd, void* buf, long count, bool write) errno = EIO; file->fileoffset += nread; file->cacheoffset = -1; + /* adjust file size to length written */ + if ( file->fileoffset > file->size ) + { + file->size = file->fileoffset; +#ifdef HAVE_DIRCACHE + dircache_update_filesize(fd, file->size, file->fatfile.firstcluster); +#endif + } return nread ? nread : rc * 10 - 6; } } |