diff options
author | Jörg Hohensohn <hohensoh@rockbox.org> | 2005-01-05 00:09:04 +0000 |
---|---|---|
committer | Jörg Hohensohn <hohensoh@rockbox.org> | 2005-01-05 00:09:04 +0000 |
commit | 7414687c58ed7a1dab4a04687acceaeb5af8314d (patch) | |
tree | 409900d3826e6262a562bc41f767b760ea9923ae /firmware/drivers/fat.c | |
parent | 93660701e633547dedcd1099501f2ac6d7f44fee (diff) |
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/drivers/fat.c')
-rw-r--r-- | firmware/drivers/fat.c | 35 |
1 files changed, 34 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) |