|
hohensoh: firmware/common dir.c, 1.27, 1.28 disk.c, 1.6, 1.7 file.c, 1.61, : msg#00214systems.archos.rockbox.cvs
Update of /cvsroot/rockbox/firmware/common In directory labb:/tmp/cvs-serv2934/rockbox/firmware/common Modified Files: dir.c disk.c file.c Log Message: preparations for hotswapping MMC Index: disk.c =================================================================== RCS file: /cvsroot/rockbox/firmware/common/disk.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- disk.c 23 Jan 2005 23:29:35 -0000 1.6 +++ disk.c 28 Jan 2005 21:32:16 -0000 1.7 @@ -23,6 +23,8 @@ #ifdef HAVE_MMC #include "ata_mmc.h" #endif +#include "file.h" /* for release_dirs() */ +#include "dir.h" /* for release_files() */ #include "disk.h" /* Partition table entry layout: @@ -44,6 +46,7 @@ ((long)array[pos+2] << 16 ) | ((long)array[pos+3] << 24 )) static struct partinfo part[8]; /* space for 4 partitions on 2 drives */ +static int vol_drive[NUM_VOLUMES]; /* mounted to which drive (-1 if none) */ struct partinfo* disk_init(IF_MV_NONVOID(int drive)) { @@ -95,46 +98,86 @@ int disk_mount_all(void) { - struct partinfo* pinfo; - int i,j; - int mounted = 0; - bool found; - int drives = 1; + int mounted; + int i; + + fat_init(); /* reset all mounted partitions */ + for (i=0; i<NUM_VOLUMES; i++) + vol_drive[i] = -1; /* mark all as unassigned */ + + mounted = disk_mount(0); #ifdef HAVE_MMC if (mmc_detect()) /* for Ondio, only if card detected */ { - drives = 2; /* in such case we have two drives to try */ + mounted += disk_mount(1); /* try 2nd "drive", too */ } #endif - fat_init(); /* reset all mounted partitions */ - for (j=0; j<drives; j++) + return mounted; +} + +static int get_free_volume(void) +{ + int i; + for (i=0; i<NUM_VOLUMES; i++) { - found = false; /* reset partition-on-drive flag */ - pinfo = disk_init(IF_MV(j)); - if (pinfo == NULL) + if (vol_drive[i] == -1) /* unassigned? */ + return i; + } + + return -1; /* none found */ +} + +int disk_mount(int drive) +{ + int i; + int mounted = 0; /* reset partition-on-drive flag */ + int volume = get_free_volume(); + struct partinfo* pinfo = disk_init(IF_MV(drive)); + + if (pinfo == NULL) + { + return 0; + } + for (i=0; volume != -1 && i<4; i++) + { + if (!fat_mount(IF_MV2(volume,) IF_MV2(drive,) pinfo[i].start)) { - continue; + mounted++; + vol_drive[volume] = drive; /* remember the drive for this volume */ + volume = get_free_volume(); /* prepare next entry */ } - for (i=0; mounted<NUM_VOLUMES && i<4; i++) + } + + if (mounted == 0 && volume != -1) /* none of the 4 entries worked? */ + { /* try "superfloppy" mode */ + DEBUGF("No partition found, trying to mount sector 0.\n"); + if (!fat_mount(IF_MV2(volume,) IF_MV2(drive,) 0)) { - if (!fat_mount(IF_MV2(mounted,) IF_MV2(j,) pinfo[i].start)) - { - mounted++; - found = true; /* at least one valid entry */ - } + mounted = 1; + vol_drive[volume] = drive; /* remember the drive for this volume */ } + } + return mounted; +} - if (!found && mounted<NUM_VOLUMES) /* none of the 4 entries worked? */ - { /* try "superfloppy" mode */ - DEBUGF("No partition found, trying to mount sector 0.\n"); - if (!fat_mount(IF_MV2(mounted,) IF_MV2(j,) 0)) - { - mounted++; - } +#ifdef HAVE_HOTSWAP +int disk_unmount(int drive) +{ + int unmounted = 0; + int i; + for (i=0; i<NUM_VOLUMES; i++) + { + if (vol_drive[i] == drive) + { /* force releasing resources */ + vol_drive[i] = -1; /* mark unused */ + unmounted++; + release_files(i); + release_dirs(i); + fat_unmount(i, false); } } - return mounted; + return unmounted; } - +#endif /* #ifdef HAVE_HOTSWAP */ Index: file.c =================================================================== RCS file: /cvsroot/rockbox/firmware/common/file.c,v retrieving revision 1.61 retrieving revision 1.62 diff -u -d -r1.61 -r1.62 --- file.c 23 Jan 2005 23:27:53 -0000 1.61 +++ file.c 28 Jan 2005 21:32:16 -0000 1.62 @@ -660,3 +660,23 @@ return file->size; } + + +#ifdef HAVE_HOTSWAP +// release all file handles on a given volume "by force", to avoid leaks +int release_files(int volume) +{ + struct filedesc* pfile = openfiles; + int fd; + int closed = 0; + for ( fd=0; fd<MAX_OPEN_FILES; fd++, pfile++) + { + if (pfile->fatfile.volume == volume) + { + pfile->busy = false; /* mark as available, no further action */ + closed++; + } + } + return closed; /* return how many we did */ +} +#endif /* #ifdef HAVE_HOTSWAP */ Index: dir.c =================================================================== RCS file: /cvsroot/rockbox/firmware/common/dir.c,v retrieving revision 1.27 retrieving revision 1.28 diff -u -d -r1.27 -r1.28 --- dir.c 23 Jan 2005 23:29:35 -0000 1.27 +++ dir.c 28 Jan 2005 21:32:16 -0000 1.28 @@ -67,6 +67,26 @@ #endif /* #ifdef HAVE_MULTIVOLUME */ +#ifdef HAVE_HOTSWAP +// release all dir handles on a given volume "by force", to avoid leaks +int release_dirs(int volume) +{ + DIR* pdir = opendirs; + int dd; + int closed = 0; + for ( dd=0; dd<MAX_OPEN_DIRS; dd++, pdir++) + { + if (pdir->fatdir.file.volume == volume) + { + pdir->busy = false; /* mark as available, no further action */ + closed++; + } + } + return closed; /* return how many we did */ +} +#endif /* #ifdef HAVE_HOTSWAP */ + + DIR* opendir(const char* name) { char namecopy[MAX_PATH]; @@ -154,6 +174,10 @@ { struct fat_direntry entry; struct dirent* theent = &(dir->theent); + + if (!dir->busy) + return NULL; + #ifdef HAVE_MULTIVOLUME /* Volumes (secondary file systems) get inserted into the root directory of the first volume, since we have no separate top level. */ _______________________________________________ http://cool.haxx.se/mailman/listinfo/rockbox-cvs |
|
| <Prev in Thread] | Current Thread | [Next in Thread> |
|---|---|---|
| Previous by Date: | hohensoh: firmware/include dir.h,1.8,1.9 file.h,1.10,1.11: 00214, cvs |
|---|---|
| Next by Date: | hohensoh: firmware/export kernel.h,1.9,1.10: 00214, cvs |
| Previous by Thread: | hohensoh: firmware/include dir.h,1.8,1.9 file.h,1.10,1.11i: 00214, cvs |
| Next by Thread: | hohensoh: firmware/export kernel.h,1.9,1.10: 00214, cvs |
| Indexes: | [Date] [Thread] [Top] [All Lists] |
| News | FAQ | advertise |