From 4d3c4606fba914dfa20c490660c913052de3e01c Mon Sep 17 00:00:00 2001 From: wntrmute Date: Tue, 9 Jun 2009 19:42:35 +0000 Subject: [PATCH] prevent caching off end of partition git-svn-id: https://devkitpro.svn.sourceforge.net/svnroot/devkitpro/trunk/libfat@3592 258c5a1a-4f63-435d-9564-e8f6d34ab52c --- source/cache.c | 14 +++++++++----- source/cache.h | 3 ++- source/partition.c | 2 +- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/source/cache.c b/source/cache.c index 97ec2f5..a91656c 100644 --- a/source/cache.c +++ b/source/cache.c @@ -46,7 +46,7 @@ #define CACHE_FREE UINT_MAX -CACHE* _FAT_cache_constructor (unsigned int numberOfPages, unsigned int sectorsPerPage, const DISC_INTERFACE* discInterface) { +CACHE* _FAT_cache_constructor (unsigned int numberOfPages, unsigned int sectorsPerPage, const DISC_INTERFACE* discInterface, sec_t endOfPartition) { CACHE* cache; unsigned int i; CACHE_ENTRY* cacheEntries; @@ -65,6 +65,7 @@ CACHE* _FAT_cache_constructor (unsigned int numberOfPages, unsigned int sectorsP } cache->disc = discInterface; + cache->endOfPartition = endOfPartition; cache->numberOfPages = numberOfPages; cache->sectorsPerPage = sectorsPerPage; @@ -126,7 +127,7 @@ static CACHE_ENTRY* _FAT_cache_getPage(CACHE *cache,sec_t sector) cacheEntries[i].last_access = accessTime(); return &(cacheEntries[i]); } - + if(foundFree==false && (cacheEntries[i].sector==CACHE_FREE || cacheEntries[i].last_accessdisc,sector,sectorsPerPage,cacheEntries[oldUsed].cache)) return NULL; + sector = (sector/sectorsPerPage)*sectorsPerPage; // align base sector to page size + sec_t next_page = sector + sectorsPerPage; + if(next_page > cache->endOfPartition) next_page = cache->endOfPartition; + + if(!_FAT_disc_readSectors(cache->disc,sector,next_page-sector,cacheEntries[oldUsed].cache)) return NULL; cacheEntries[oldUsed].sector = sector; - cacheEntries[oldUsed].count = sectorsPerPage; + cacheEntries[oldUsed].count = next_page-sector; cacheEntries[oldUsed].last_access = accessTime(); return &(cacheEntries[oldUsed]); diff --git a/source/cache.h b/source/cache.h index 3e30550..c6e48d0 100644 --- a/source/cache.h +++ b/source/cache.h @@ -52,6 +52,7 @@ typedef struct { typedef struct { const DISC_INTERFACE* disc; + sec_t endOfPartition; unsigned int numberOfPages; unsigned int sectorsPerPage; CACHE_ENTRY* cacheEntries; @@ -121,7 +122,7 @@ Clear out the contents of the cache without writing any dirty sectors first */ void _FAT_cache_invalidate (CACHE* cache); -CACHE* _FAT_cache_constructor (unsigned int numberOfPages, unsigned int sectorsPerPage, const DISC_INTERFACE* discInterface); +CACHE* _FAT_cache_constructor (unsigned int numberOfPages, unsigned int sectorsPerPage, const DISC_INTERFACE* discInterface, sec_t endOfPartition); void _FAT_cache_destructor (CACHE* cache); diff --git a/source/partition.c b/source/partition.c index 5f0fcc1..6be067c 100644 --- a/source/partition.c +++ b/source/partition.c @@ -220,7 +220,7 @@ PARTITION* _FAT_partition_constructor (const DISC_INTERFACE* disc, uint32_t cach } // Create a cache to use - partition->cache = _FAT_cache_constructor (cacheSize, sectorsPerPage, partition->disc); + partition->cache = _FAT_cache_constructor (cacheSize, sectorsPerPage, partition->disc, startSector+partition->numberOfSectors); // Set current directory to the root partition->cwdCluster = partition->rootDirCluster; -- 2.11.4.GIT