summaryrefslogtreecommitdiff
path: root/components
diff options
context:
space:
mode:
authorhichard <[email protected]>2019-11-16 11:16:48 +0800
committerhichard <[email protected]>2019-11-16 11:16:48 +0800
commitaafed7b43455d6e2d66d5e36e8f3d849b677e195 (patch)
tree467dd7025aafb8c4e915b82a3682f41027882535 /components
parent69e8c0324e77d7c30634d2a74264fd4fc171ec24 (diff)
1.修复sd卡热插拔内存泄露的bug
2.dfs增加函数,配合实现sd卡热插拔自动挂载卸载文件系统
Diffstat (limited to 'components')
-rw-r--r--components/dfs/include/dfs_fs.h1
-rw-r--r--components/dfs/src/dfs_fs.c39
-rw-r--r--components/dfs/src/poll.c3
-rw-r--r--components/dfs/src/select.c3
-rw-r--r--components/drivers/sdio/block_dev.c7
5 files changed, 49 insertions, 4 deletions
diff --git a/components/dfs/include/dfs_fs.h b/components/dfs/include/dfs_fs.h
index d3a00fc542..58a9e5cf55 100644
--- a/components/dfs/include/dfs_fs.h
+++ b/components/dfs/include/dfs_fs.h
@@ -90,6 +90,7 @@ int dfs_unmount(const char *specialfile);
int dfs_mkfs(const char *fs_name, const char *device_name);
int dfs_statfs(const char *path, struct statfs *buffer);
+int dfs_mount_device(rt_device_t dev);
#ifdef __cplusplus
}
diff --git a/components/dfs/src/dfs_fs.c b/components/dfs/src/dfs_fs.c
index 04d862e85d..164beed719 100644
--- a/components/dfs/src/dfs_fs.c
+++ b/components/dfs/src/dfs_fs.c
@@ -508,7 +508,7 @@ int dfs_mount_table(void)
mount_table[index].rwflag,
mount_table[index].data) != 0)
{
- rt_kprintf("mount fs[%s] on %s failed.\n", mount_table[index].filesystemtype,
+ LOG_E("mount fs[%s] on %s failed.\n", mount_table[index].filesystemtype,
mount_table[index].path);
return -RT_ERROR;
}
@@ -518,6 +518,43 @@ int dfs_mount_table(void)
return 0;
}
INIT_ENV_EXPORT(dfs_mount_table);
+
+int dfs_mount_device(rt_device_t dev)
+{
+ int index = 0;
+
+ if(dev == RT_NULL) {
+ rt_kprintf("the device is NULL to be mounted.\n");
+ return -RT_ERROR;
+ }
+
+ while (1)
+ {
+ if (mount_table[index].path == NULL) break;
+
+ if(strcmp(mount_table[index].device_name, dev->parent.name) == 0) {
+ if (dfs_mount(mount_table[index].device_name,
+ mount_table[index].path,
+ mount_table[index].filesystemtype,
+ mount_table[index].rwflag,
+ mount_table[index].data) != 0)
+ {
+ LOG_E("mount fs[%s] device[%s] to %s failed.\n", mount_table[index].filesystemtype, dev->parent.name,
+ mount_table[index].path);
+ return -RT_ERROR;
+ } else {
+ LOG_D("mount fs[%s] device[%s] to %s ok.\n", mount_table[index].filesystemtype, dev->parent.name,
+ mount_table[index].path);
+ return RT_EOK;
+ }
+ }
+
+ index ++;
+ }
+
+ rt_kprintf("can't find device:%s to be mounted.\n", dev->parent.name);
+ return -RT_ERROR;
+}
#endif
#ifdef RT_USING_FINSH
diff --git a/components/dfs/src/poll.c b/components/dfs/src/poll.c
index 473b1579d2..3f304549f7 100644
--- a/components/dfs/src/poll.c
+++ b/components/dfs/src/poll.c
@@ -19,6 +19,8 @@
#include <dfs_posix.h>
#include <dfs_poll.h>
+#ifdef RT_USING_POSIX
+
struct rt_poll_node;
struct rt_poll_table
@@ -214,3 +216,4 @@ int poll(struct pollfd *fds, nfds_t nfds, int timeout)
return num;
}
+#endif
diff --git a/components/dfs/src/select.c b/components/dfs/src/select.c
index b20f7cf656..181855bc74 100644
--- a/components/dfs/src/select.c
+++ b/components/dfs/src/select.c
@@ -14,6 +14,8 @@
#include <dfs_poll.h>
#include <dfs_select.h>
+#ifdef RT_USING_POSIX
+
static void fdszero(fd_set *set, int nfds)
{
fd_mask *m;
@@ -178,3 +180,4 @@ int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struc
return ret;
}
+#endif
diff --git a/components/drivers/sdio/block_dev.c b/components/drivers/sdio/block_dev.c
index cac4fc5036..5db0f38c08 100644
--- a/components/drivers/sdio/block_dev.c
+++ b/components/drivers/sdio/block_dev.c
@@ -472,7 +472,7 @@ rt_int32_t rt_mmcsd_blk_probe(struct rt_mmcsd_card *card)
}
#ifdef RT_USING_DFS_MNTTABLE
- if (0) // if (blk_dev)
+ if (blk_dev)
{
LOG_I("try to mount file system!");
/* try to mount file system on this block device */
@@ -507,9 +507,10 @@ void rt_mmcsd_blk_remove(struct rt_mmcsd_card *card)
const char * mounted_path = dfs_filesystem_get_mounted_path(&(blk_dev->dev));
if (mounted_path)
{
- dfs_unmount(mounted_path);
+ dfs_unmount(mounted_path);
+ LOG_D("unmount file system %s for device %s.\r\n", mounted_path, blk_dev->dev.parent.name);
}
-
+ rt_sem_delete(blk_dev->part.lock);
rt_device_unregister(&blk_dev->dev);
rt_list_remove(&blk_dev->list);
rt_free(blk_dev);