logo       

hohensoh: firmware/common dir.c, 1.27, 1.28 disk.c, 1.6, 1.7 file.c, 1.61, : msg#00214

systems.archos.rockbox.cvs

Subject: hohensoh: firmware/common dir.c, 1.27, 1.28 disk.c, 1.6, 1.7 file.c, 1.61, 1.62

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>
Google Custom Search

News | FAQ | advertise