summaryrefslogtreecommitdiffstats
path: root/firmware
diff options
context:
space:
mode:
authorJörg Hohensohn <hohensoh@rockbox.org>2005-01-05 00:09:04 +0000
committerJörg Hohensohn <hohensoh@rockbox.org>2005-01-05 00:09:04 +0000
commit7414687c58ed7a1dab4a04687acceaeb5af8314d (patch)
tree409900d3826e6262a562bc41f767b760ea9923ae /firmware
parent93660701e633547dedcd1099501f2ac6d7f44fee (diff)
downloadrockbox-7414687c58ed7a1dab4a04687acceaeb5af8314d.tar.gz
rockbox-7414687c58ed7a1dab4a04687acceaeb5af8314d.tar.bz2
rockbox-7414687c58ed7a1dab4a04687acceaeb5af8314d.zip
unmount function in preparation for MMC hotswap, more mutexing
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@5536 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware')
-rw-r--r--firmware/drivers/fat.c35
-rw-r--r--firmware/export/fat.h1
2 files changed, 35 insertions, 1 deletions
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)
diff --git a/firmware/export/fat.h b/firmware/export/fat.h
index 2f1c7be0a8..d7a5d0ded3 100644
--- a/firmware/export/fat.h
+++ b/firmware/export/fat.h
@@ -76,6 +76,7 @@ struct fat_dir
extern void fat_init(void);
extern int fat_mount(IF_MV2(int volume,) IF_MV2(int drive,) int startsector);
+extern int fat_unmount(int volume, bool flush);
extern void fat_size(IF_MV2(int volume,) unsigned int* size, unsigned int* free); // public for info
extern void fat_recalc_free(IF_MV_NONVOID(int volume)); // public for debug info screen
extern int fat_create_dir(const char* name,