diff --git a/components/dfs/dfs_v2/src/dfs_dentry.c b/components/dfs/dfs_v2/src/dfs_dentry.c index 634bcfe6b9a..a04fb191b73 100644 --- a/components/dfs/dfs_v2/src/dfs_dentry.c +++ b/components/dfs/dfs_v2/src/dfs_dentry.c @@ -90,7 +90,10 @@ struct dfs_dentry * dfs_dentry_ref(struct dfs_dentry *dentry) RT_ASSERT(dentry); rt_atomic_add(&(dentry->ref_count), 1); - + if (dentry->vnode) + { + rt_atomic_add(&(dentry->vnode->ref_count), 1); // TODO: dont add vnode's ref + } return dentry; } @@ -98,17 +101,12 @@ struct dfs_dentry *dfs_dentry_unref(struct dfs_dentry *dentry) { rt_err_t ret = RT_EOK; - RT_ASSERT(dentry); + RT_ASSERT(dentry && (dentry->flags & DENTRY_IS_ALLOCED)); ret = dfs_file_lock(); if (ret == RT_EOK) { - if (dentry->flags & DENTRY_IS_ALLOCED) - { - rt_atomic_sub(&(dentry->ref_count), 1); - } - - if (rt_atomic_load(&(dentry->ref_count)) == 0) + if (rt_atomic_dec_and_test(&(dentry->ref_count))) { DLOG(msg, "dentry", "dentry", DLOG_MSG, "free dentry, ref_count=0"); if (dentry->flags & DENTRY_IS_ADDHASH) diff --git a/components/dfs/dfs_v2/src/dfs_file.c b/components/dfs/dfs_v2/src/dfs_file.c index 11bb70fe6b3..46b8b08c9c1 100644 --- a/components/dfs/dfs_v2/src/dfs_file.c +++ b/components/dfs/dfs_v2/src/dfs_file.c @@ -201,6 +201,14 @@ void dfs_file_deinit(struct dfs_file *file) { RT_ASSERT(file); + if (file->fops && file->fops->close) + { + if (file->fops->close(file) != RT_EOK) + { + LOG_E("file %p close error", file); + } + } + rt_mutex_detach(&file->pos_lock); if (file->dentry) @@ -210,7 +218,7 @@ void dfs_file_deinit(struct dfs_file *file) if (file->vnode) { - dfs_vnode_unref(file->vnode); + //dfs_vnode_unref(file->vnode); } if (file->mmap_context) diff --git a/components/dfs/dfs_v2/src/dfs_mnt.c b/components/dfs/dfs_v2/src/dfs_mnt.c index 4ad73c6dee9..aa0f74072cd 100644 --- a/components/dfs/dfs_v2/src/dfs_mnt.c +++ b/components/dfs/dfs_v2/src/dfs_mnt.c @@ -233,11 +233,10 @@ struct dfs_mnt *dfs_mnt_lookup(const char *fullpath) struct dfs_mnt* dfs_mnt_ref(struct dfs_mnt* mnt) { - if (mnt) - { - rt_atomic_add(&(mnt->ref_count), 1); - DLOG(note, "mnt", "mnt(%s),ref_count=%d", mnt->fs_ops->name, rt_atomic_load(&(mnt->ref_count))); - } + RT_ASSERT(mnt); + + rt_atomic_add(&(mnt->ref_count), 1); + DLOG(note, "mnt", "mnt(%s),ref_count=%d", mnt->fs_ops->name, rt_atomic_load(&(mnt->ref_count))); return mnt; } @@ -248,9 +247,7 @@ int dfs_mnt_unref(struct dfs_mnt* mnt) if (mnt) { - rt_atomic_sub(&(mnt->ref_count), 1); - - if (rt_atomic_load(&(mnt->ref_count)) == 0) + if (rt_atomic_dec_and_test(&(mnt->ref_count))) { dfs_lock(); diff --git a/components/dfs/dfs_v2/src/dfs_pcache.c b/components/dfs/dfs_v2/src/dfs_pcache.c index 1f2b2fab75e..024996e0169 100644 --- a/components/dfs/dfs_v2/src/dfs_pcache.c +++ b/components/dfs/dfs_v2/src/dfs_pcache.c @@ -721,9 +721,7 @@ static void dfs_page_unref(struct dfs_page *page) dfs_aspace_lock(aspace); - rt_atomic_sub(&(page->ref_count), 1); - - if (rt_atomic_load(&(page->ref_count)) == 0) + if (rt_atomic_dec_and_test(&(page->ref_count))) { dfs_page_unmap(page);