summaryrefslogtreecommitdiffstats
path: root/firmware/common/file.c
diff options
context:
space:
mode:
authorJens Arnold <amiconn@rockbox.org>2006-12-04 21:37:22 +0000
committerJens Arnold <amiconn@rockbox.org>2006-12-04 21:37:22 +0000
commitef3e129b6530b1694c0fcfa8ee2fbdf3ea95b083 (patch)
tree073e5fe264f0edcfc907254320b4f90e74042672 /firmware/common/file.c
parent74369b4a7b1b91371dc90905dc26e54b919d81a4 (diff)
downloadrockbox-ef3e129b6530b1694c0fcfa8ee2fbdf3ea95b083.tar.gz
rockbox-ef3e129b6530b1694c0fcfa8ee2fbdf3ea95b083.zip
Much simpler implementation of large virtual sector support, not needing larger sector buffers and not touching file.c at all. secmult is simply used to normalize all sector counts to 512-byte physical sectors. * Moved MAX_SECTOR_SIZE definition to config-*.h, and enabled it for iPod Video only. MAX_SECTOR_SIZE now only enables checking for alternate disk layouts due to sector size (as iPod Video G5.5 is presented as having 2048-byte _physical_ sectors to the PC). Large virtual sector support in fat.c is always enabled.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@11659 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/common/file.c')
-rw-r--r--firmware/common/file.c29
1 files changed, 13 insertions, 16 deletions
diff --git a/firmware/common/file.c b/firmware/common/file.c
index d1ba10569a..e24b44ce1f 100644
--- a/firmware/common/file.c
+++ b/firmware/common/file.c
@@ -36,7 +36,7 @@
*/
struct filedesc {
- unsigned char cache[MAX_SECTOR_SIZE];
+ unsigned char cache[SECTOR_SIZE];
int cacheoffset; /* invariant: 0 <= cacheoffset <= SECTOR_SIZE */
long fileoffset;
long size;
@@ -415,10 +415,9 @@ int ftruncate(int fd, off_t size)
{
int rc, sector;
struct filedesc* file = &openfiles[fd];
- int secsize = fat_get_secsize(&(file->fatfile));
- sector = size / secsize;
- if (size % secsize)
+ sector = size / SECTOR_SIZE;
+ if (size % SECTOR_SIZE)
sector++;
rc = fat_seek(&(file->fatfile), sector);
@@ -445,7 +444,7 @@ static int flush_cache(int fd)
{
int rc;
struct filedesc* file = &openfiles[fd];
- long sector = file->fileoffset / fat_get_secsize(&(file->fatfile));
+ long sector = file->fileoffset / SECTOR_SIZE;
DEBUGF("Flushing dirty sector cache\n");
@@ -474,7 +473,6 @@ static int readwrite(int fd, void* buf, long count, bool write)
long sectors;
long nread=0;
struct filedesc* file = &openfiles[fd];
- int secsize = fat_get_secsize(&(file->fatfile));
int rc;
if ( !file->busy ) {
@@ -492,7 +490,7 @@ static int readwrite(int fd, void* buf, long count, bool write)
/* any head bytes? */
if ( file->cacheoffset != -1 ) {
int offs = file->cacheoffset;
- int headbytes = MIN(count, secsize - offs);
+ int headbytes = MIN(count, SECTOR_SIZE - offs);
if (write) {
memcpy( file->cache + offs, buf, headbytes );
@@ -502,7 +500,7 @@ static int readwrite(int fd, void* buf, long count, bool write)
memcpy( buf, file->cache + offs, headbytes );
}
- if (offs + headbytes == secsize) {
+ if (offs + headbytes == SECTOR_SIZE) {
if (file->dirty) {
int rc = flush_cache(fd);
if ( rc < 0 ) {
@@ -525,7 +523,7 @@ static int readwrite(int fd, void* buf, long count, bool write)
* more data to follow in this call). Do NOT flush here. */
/* read/write whole sectors right into/from the supplied buffer */
- sectors = count / secsize;
+ sectors = count / SECTOR_SIZE;
if ( sectors ) {
int rc = fat_readwrite(&(file->fatfile), sectors,
(unsigned char*)buf+nread, write );
@@ -543,8 +541,8 @@ static int readwrite(int fd, void* buf, long count, bool write)
}
else {
if ( rc > 0 ) {
- nread += rc * secsize;
- count -= sectors * secsize;
+ nread += rc * SECTOR_SIZE;
+ count -= sectors * SECTOR_SIZE;
/* if eof, skip tail bytes */
if ( rc < sectors )
@@ -577,7 +575,7 @@ static int readwrite(int fd, void* buf, long count, bool write)
/* seek back one sector to put file position right */
rc = fat_seek(&(file->fatfile),
(file->fileoffset + nread) /
- secsize);
+ SECTOR_SIZE);
if ( rc < 0 ) {
DEBUGF("fat_seek() failed\n");
errno = EIO;
@@ -643,7 +641,6 @@ off_t lseek(int fd, off_t offset, int whence)
int sectoroffset;
int rc;
struct filedesc* file = &openfiles[fd];
- int secsize = fat_get_secsize(&(file->fatfile));
LDEBUGF("lseek(%d,%ld,%d)\n",fd,offset,whence);
@@ -675,9 +672,9 @@ off_t lseek(int fd, off_t offset, int whence)
}
/* new sector? */
- newsector = pos / secsize;
- oldsector = file->fileoffset / secsize;
- sectoroffset = pos % secsize;
+ newsector = pos / SECTOR_SIZE;
+ oldsector = file->fileoffset / SECTOR_SIZE;
+ sectoroffset = pos % SECTOR_SIZE;
if ( (newsector != oldsector) ||
((file->cacheoffset==-1) && sectoroffset) ) {