summaryrefslogtreecommitdiff
path: root/components/dfs
diff options
context:
space:
mode:
Diffstat (limited to 'components/dfs')
-rw-r--r--components/dfs/include/dfs_fs.h1
-rw-r--r--components/dfs/src/dfs_fs.c48
2 files changed, 49 insertions, 0 deletions
diff --git a/components/dfs/include/dfs_fs.h b/components/dfs/include/dfs_fs.h
index 58a9e5cf55..a35a513044 100644
--- a/components/dfs/include/dfs_fs.h
+++ b/components/dfs/include/dfs_fs.h
@@ -91,6 +91,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);
+int dfs_unmount_device(rt_device_t dev);
#ifdef __cplusplus
}
diff --git a/components/dfs/src/dfs_fs.c b/components/dfs/src/dfs_fs.c
index 164beed719..476e47fc06 100644
--- a/components/dfs/src/dfs_fs.c
+++ b/components/dfs/src/dfs_fs.c
@@ -555,6 +555,54 @@ int dfs_mount_device(rt_device_t dev)
rt_kprintf("can't find device:%s to be mounted.\n", dev->parent.name);
return -RT_ERROR;
}
+
+int dfs_unmount_device(rt_device_t dev)
+{
+ struct dfs_filesystem *iter;
+ struct dfs_filesystem *fs = NULL;
+
+ /* lock filesystem */
+ dfs_lock();
+
+ for (iter = &filesystem_table[0];
+ iter < &filesystem_table[DFS_FILESYSTEMS_MAX]; iter++)
+ {
+ /* check if the PATH is mounted */
+ if ((iter->dev_id->parent.name != NULL)
+ && (strcmp(iter->dev_id->parent.name, dev->parent.name) == 0))
+ {
+ fs = iter;
+ break;
+ }
+ }
+
+ if (fs == NULL ||
+ fs->ops->unmount == NULL ||
+ fs->ops->unmount(fs) < 0)
+ {
+ goto err1;
+ }
+
+ /* close device, but do not check the status of device */
+ if (fs->dev_id != NULL)
+ rt_device_close(fs->dev_id);
+
+ if (fs->path != NULL)
+ rt_free(fs->path);
+
+ /* clear this filesystem table entry */
+ memset(fs, 0, sizeof(struct dfs_filesystem));
+
+ dfs_unlock();
+
+ return 0;
+
+err1:
+ dfs_unlock();
+
+ return -1;
+}
+
#endif
#ifdef RT_USING_FINSH