From eb947cdde1a34588de767ea75762269253af487a Mon Sep 17 00:00:00 2001 From: Peter D'Hoye Date: Thu, 13 Dec 2007 23:36:22 +0000 Subject: 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 --- apps/codecs/mp3_enc.c | 3 +++ apps/codecs/wav_enc.c | 8 +++++--- apps/codecs/wavpack_enc.c | 3 +++ 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 2dc9bcb..26cc1dd 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 25d2838..5932fd3 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 70261e7..670a518 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 9290f50..f0437f9 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; } } -- cgit v1.1