Browse Source

Merge pull request #215 from prife/master

fix dfs_unmount bug
prife 11 years ago
parent
commit
95006bb503

+ 6 - 9
components/dfs/filesystems/elmfat/ff.c

@@ -108,12 +108,8 @@
 #if _MAX_SS != 512 && _MAX_SS != 1024 && _MAX_SS != 2048 && _MAX_SS != 4096
 #if _MAX_SS != 512 && _MAX_SS != 1024 && _MAX_SS != 2048 && _MAX_SS != 4096
 #error Wrong sector size.
 #error Wrong sector size.
 #endif
 #endif
-#if _MAX_SS != 512
-#define	SS(fs)	((fs)->ssize)	/* Multiple sector size */
-#else
-#define	SS(fs)	512U			/* Fixed sector size */
-#endif
 
 
+#define	SS(fs)	((fs)->ssize)	/* sector size */
 
 
 /* Reentrancy related */
 /* Reentrancy related */
 #if _FS_REENTRANT
 #if _FS_REENTRANT
@@ -2058,10 +2054,11 @@ FRESULT chk_mounted (	/* FR_OK(0): successful, !=0: any error occurred */
 	stat = disk_initialize(fs->drv);	/* Initialize low level disk I/O layer */
 	stat = disk_initialize(fs->drv);	/* Initialize low level disk I/O layer */
 	if (stat & STA_NOINIT)				/* Check if the initialization succeeded */
 	if (stat & STA_NOINIT)				/* Check if the initialization succeeded */
 		return FR_NOT_READY;			/* Failed to initialize due to no media or hard error */
 		return FR_NOT_READY;			/* Failed to initialize due to no media or hard error */
-#if _MAX_SS != 512						/* Get disk sector size (variable sector size cfg only) */
+
+	/* Get disk sector size (variable sector size cfg only) */
 	if (disk_ioctl(fs->drv, GET_SECTOR_SIZE, &fs->ssize) != RES_OK)
 	if (disk_ioctl(fs->drv, GET_SECTOR_SIZE, &fs->ssize) != RES_OK)
 		return FR_DISK_ERR;
 		return FR_DISK_ERR;
-#endif
+
 #if !_FS_READONLY
 #if !_FS_READONLY
 	if (chk_wp && (stat & STA_PROTECT))	/* Check disk write protection if needed */
 	if (chk_wp && (stat & STA_PROTECT))	/* Check disk write protection if needed */
 		return FR_WRITE_PROTECTED;
 		return FR_WRITE_PROTECTED;
@@ -3601,10 +3598,10 @@ FRESULT f_mkfs (
 	stat = disk_initialize(drv);
 	stat = disk_initialize(drv);
 	if (stat & STA_NOINIT) return FR_NOT_READY;
 	if (stat & STA_NOINIT) return FR_NOT_READY;
 	if (stat & STA_PROTECT) return FR_WRITE_PROTECTED;
 	if (stat & STA_PROTECT) return FR_WRITE_PROTECTED;
-#if _MAX_SS != 512					/* Get disk sector size */
+	/* Get disk sector size */
 	if (disk_ioctl(drv, GET_SECTOR_SIZE, &SS(fs)) != RES_OK)
 	if (disk_ioctl(drv, GET_SECTOR_SIZE, &SS(fs)) != RES_OK)
 		return FR_DISK_ERR;
 		return FR_DISK_ERR;
-#endif
+
 	if (disk_ioctl(drv, GET_SECTOR_COUNT, &n_vol) != RES_OK || n_vol < 128)
 	if (disk_ioctl(drv, GET_SECTOR_COUNT, &n_vol) != RES_OK || n_vol < 128)
 		return FR_DISK_ERR;
 		return FR_DISK_ERR;
 	b_vol = (sfd) ? 0 : 63;	/* Volume start sector */
 	b_vol = (sfd) ? 0 : 63;	/* Volume start sector */

+ 0 - 2
components/dfs/filesystems/elmfat/ff.h

@@ -84,9 +84,7 @@ typedef struct {
 	BYTE	fsi_flag;		/* fsinfo dirty flag (1:must be written back) */
 	BYTE	fsi_flag;		/* fsinfo dirty flag (1:must be written back) */
 	WORD	id;				/* File system mount ID */
 	WORD	id;				/* File system mount ID */
 	WORD	n_rootdir;		/* Number of root directory entries (FAT12/16) */
 	WORD	n_rootdir;		/* Number of root directory entries (FAT12/16) */
-#if _MAX_SS != 512
 	WORD	ssize;			/* Bytes per sector (512,1024,2048,4096) */
 	WORD	ssize;			/* Bytes per sector (512,1024,2048,4096) */
-#endif
 #if _FS_REENTRANT
 #if _FS_REENTRANT
 	_SYNC_t	sobj;			/* Identifier of sync object */
 	_SYNC_t	sobj;			/* Identifier of sync object */
 #endif
 #endif

+ 15 - 4
components/dfs/src/dfs_fs.c

@@ -80,7 +80,7 @@ int dfs_register(const struct dfs_filesystem_operation *ops)
 struct dfs_filesystem *dfs_filesystem_lookup(const char *path)
 struct dfs_filesystem *dfs_filesystem_lookup(const char *path)
 {
 {
     struct dfs_filesystem *iter;
     struct dfs_filesystem *iter;
-    struct dfs_filesystem *empty = RT_NULL;
+    struct dfs_filesystem *fs = RT_NULL;
     rt_uint32_t fspath, prefixlen;
     rt_uint32_t fspath, prefixlen;
 
 
     prefixlen = 0;
     prefixlen = 0;
@@ -104,13 +104,13 @@ struct dfs_filesystem *dfs_filesystem_lookup(const char *path)
         if (fspath > 1 && (strlen(path) > fspath) && (path[fspath] != '/'))
         if (fspath > 1 && (strlen(path) > fspath) && (path[fspath] != '/'))
             continue;
             continue;
 
 
-        empty = iter;
+        fs = iter;
         prefixlen = fspath;
         prefixlen = fspath;
     }
     }
 
 
     dfs_unlock();
     dfs_unlock();
 
 
-    return empty;
+    return fs;
 }
 }
 
 
 /**
 /**
@@ -329,6 +329,7 @@ err1:
 int dfs_unmount(const char *specialfile)
 int dfs_unmount(const char *specialfile)
 {
 {
     char *fullpath;
     char *fullpath;
+    struct dfs_filesystem *iter;
     struct dfs_filesystem *fs = RT_NULL;
     struct dfs_filesystem *fs = RT_NULL;
 
 
     fullpath = dfs_normalize_path(RT_NULL, specialfile);
     fullpath = dfs_normalize_path(RT_NULL, specialfile);
@@ -342,7 +343,17 @@ int dfs_unmount(const char *specialfile)
     /* lock filesystem */
     /* lock filesystem */
     dfs_lock();
     dfs_lock();
 
 
-    fs = dfs_filesystem_lookup(fullpath);
+    for (iter = &filesystem_table[0];
+            iter < &filesystem_table[DFS_FILESYSTEMS_MAX]; iter++)
+    {
+        /* check if the PATH is mounted */
+        if ((iter->path != NULL) && (strcmp(iter->path, fullpath) == 0))
+        {
+            fs = iter;
+            break;
+        }
+    }
+
     if (fs == RT_NULL ||
     if (fs == RT_NULL ||
         fs->ops->unmount == RT_NULL ||
         fs->ops->unmount == RT_NULL ||
         fs->ops->unmount(fs) < 0)
         fs->ops->unmount(fs) < 0)