From 7414687c58ed7a1dab4a04687acceaeb5af8314d Mon Sep 17 00:00:00 2001 From: Jörg Hohensohn Date: Wed, 5 Jan 2005 00:09:04 +0000 Subject: unmount function in preparation for MMC hotswap, more mutexing git-svn-id: svn://svn.rockbox.org/rockbox/trunk@5536 a1c6a512-1295-4272-9138-f99709370657 --- firmware/drivers/fat.c | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) (limited to 'firmware/drivers/fat.c') diff --git a/firmware/drivers/fat.c b/firmware/drivers/fat.c index 85bd525eff..c989c86f84 100644 --- a/firmware/drivers/fat.c +++ b/firmware/drivers/fat.c @@ -480,6 +480,33 @@ int fat_mount(IF_MV2(int volume,) IF_MV2(int drive,) int startsector) return 0; } +#ifdef HAVE_MULTIVOLUME +int fat_unmount(int volume, bool flush) +{ + struct bpb* fat_bpb = &fat_bpbs[volume]; + if(flush) + { + flush_fat(fat_bpb); /* the clean way, while still alive */ + } + else + { /* volume is not accessible any more, e.g. MMC removed */ + int i; + mutex_lock(&cache_mutex); + for(i = 0;i < FAT_CACHE_SIZE;i++) + { + struct fat_cache_entry *fce = &fat_cache[i]; + if(fce->inuse && fce->fat_vol == fat_bpb) + { + fce->inuse = false; /* discard all from that volume */ + fce->dirty = false; + } + } + mutex_unlock(&cache_mutex); + } + fat_bpb->mounted = false; +} +#endif + void fat_recalc_free(IF_MV_NONVOID(int volume)) { #ifndef HAVE_MULTIVOLUME @@ -946,15 +973,21 @@ static int flush_fat(IF_MV_NONVOID(struct bpb* fat_bpb)) unsigned char *sec; LDEBUGF("flush_fat()\n"); + mutex_lock(&cache_mutex); for(i = 0;i < FAT_CACHE_SIZE;i++) { struct fat_cache_entry *fce = &fat_cache[i]; - if(fce->inuse && fce->dirty) + if(fce->inuse +#ifdef HAVE_MULTIVOLUME + && fce->fat_vol == fat_bpb +#endif + && fce->dirty) { sec = fat_cache_sectors[i]; flush_fat_sector(fce, sec); } } + mutex_unlock(&cache_mutex); rc = update_fsinfo(IF_MV(fat_bpb)); if (rc < 0) -- cgit v1.2.3