diff --git a/components/dfs/dfs_v1/filesystems/elmfat/dfs_elm.c b/components/dfs/dfs_v1/filesystems/elmfat/dfs_elm.c index afb2a0d46d9..ee997d4087e 100644 --- a/components/dfs/dfs_v1/filesystems/elmfat/dfs_elm.c +++ b/components/dfs/dfs_v1/filesystems/elmfat/dfs_elm.c @@ -478,6 +478,7 @@ int dfs_elm_close(struct dfs_file *file) dir = (DIR *)(file->data); RT_ASSERT(dir != RT_NULL); + f_closedir(dir); /* release memory */ rt_free(dir); } diff --git a/components/dfs/dfs_v2/filesystems/elmfat/dfs_elm.c b/components/dfs/dfs_v2/filesystems/elmfat/dfs_elm.c index cb1479f6ca9..8d29785f639 100644 --- a/components/dfs/dfs_v2/filesystems/elmfat/dfs_elm.c +++ b/components/dfs/dfs_v2/filesystems/elmfat/dfs_elm.c @@ -522,6 +522,7 @@ int dfs_elm_close(struct dfs_file *file) dir = (DIR *)(file->vnode->data); RT_ASSERT(dir != RT_NULL); + f_closedir(dir); /* release memory */ rt_free(dir); } @@ -1014,10 +1015,19 @@ static struct dfs_vnode *dfs_elm_create_vnode(struct dfs_dentry *dentry, int typ static int dfs_elm_free_vnode(struct dfs_vnode *vnode) { - /* nothing to be freed */ - if (vnode && vnode->ref_count <= 1) + if (vnode && vnode->ref_count <= 1 && vnode->data != RT_NULL) { - vnode->data = NULL; + if (vnode->type == FT_DIRECTORY) + { + f_closedir((DIR *)vnode->data); + } + else if (vnode->type == FT_REGULAR) + { + f_close((FIL *)vnode->data); + } + rt_free(vnode->data); + vnode->data = RT_NULL; + rt_mutex_detach(&vnode->lock); } return 0;