diff --git a/components/dfs/dfs_v2/filesystems/elmfat/dfs_elm.c b/components/dfs/dfs_v2/filesystems/elmfat/dfs_elm.c index 52d3cafdac1..eab787cde41 100644 --- a/components/dfs/dfs_v2/filesystems/elmfat/dfs_elm.c +++ b/components/dfs/dfs_v2/filesystems/elmfat/dfs_elm.c @@ -447,7 +447,7 @@ int dfs_elm_open(struct dfs_file *file) } file->vnode->data = dir; - rt_mutex_init(&file->vnode->lock, file->dentry->pathname, RT_IPC_FLAG_PRIO); + dfs_vnode_lock_init(file->vnode, file->dentry); return RT_EOK; } else @@ -488,7 +488,7 @@ int dfs_elm_open(struct dfs_file *file) file->vnode->size = f_size(fd); file->vnode->type = FT_REGULAR; file->vnode->data = fd; - rt_mutex_init(&file->vnode->lock, file->dentry->pathname, RT_IPC_FLAG_PRIO); + dfs_vnode_lock_init(file->vnode, file->dentry); if (file->flags & O_APPEND) { diff --git a/components/dfs/dfs_v2/filesystems/tmpfs/dfs_tmpfs.c b/components/dfs/dfs_v2/filesystems/tmpfs/dfs_tmpfs.c index 996c01df782..011e6e14c24 100644 --- a/components/dfs/dfs_v2/filesystems/tmpfs/dfs_tmpfs.c +++ b/components/dfs/dfs_v2/filesystems/tmpfs/dfs_tmpfs.c @@ -266,6 +266,7 @@ struct tmpfs_file *dfs_tmpfs_lookup(struct tmpfs_sb *superblock, { if (rt_strcmp(file->name, filename) == 0) { + /* cppcheck-suppress uninitvar */ *size = file->size; rt_spin_unlock(&superblock->lock); @@ -455,7 +456,7 @@ static int dfs_tmpfs_open(struct dfs_file *file) RT_ASSERT(file->vnode->ref_count > 0); if(file->vnode->ref_count == 1) { - rt_mutex_init(&file->vnode->lock, file->dentry->pathname, RT_IPC_FLAG_PRIO); + dfs_vnode_lock_init(file->vnode, file->dentry); } return 0; @@ -525,6 +526,7 @@ static int dfs_tmpfs_getdents(struct dfs_file *file, if (index >= (rt_size_t)file->fpos) { d = dirp + count; + /* cppcheck-suppress uninitvar */ if (n_file->type == TMPFS_TYPE_FILE) { d->d_type = DT_REG; diff --git a/components/dfs/dfs_v2/include/dfs_file.h b/components/dfs/dfs_v2/include/dfs_file.h index 5010ed45346..0e609e9eef4 100644 --- a/components/dfs/dfs_v2/include/dfs_file.h +++ b/components/dfs/dfs_v2/include/dfs_file.h @@ -124,6 +124,7 @@ struct dfs_file int dfs_vnode_init(struct dfs_vnode *vnode, int type, const struct dfs_file_ops *fops); struct dfs_vnode *dfs_vnode_create(void); int dfs_vnode_destroy(struct dfs_vnode* vnode); +rt_err_t dfs_vnode_lock_init(struct dfs_vnode *vnode, struct dfs_dentry *dentry); struct dfs_vnode *dfs_vnode_ref(struct dfs_vnode *vnode); void dfs_vnode_unref(struct dfs_vnode *vnode); diff --git a/components/dfs/dfs_v2/src/dfs_vnode.c b/components/dfs/dfs_v2/src/dfs_vnode.c index d46885e0b31..462f94e05e6 100644 --- a/components/dfs/dfs_v2/src/dfs_vnode.c +++ b/components/dfs/dfs_v2/src/dfs_vnode.c @@ -9,6 +9,7 @@ */ #include +#include #include #ifdef RT_USING_PAGECACHE #include "dfs_pcache.h" @@ -63,6 +64,31 @@ struct dfs_vnode *dfs_vnode_create(void) return vnode; } +/** + * @brief Initialize the lock of a virtual node (vnode) + * + * @param[in,out] vnode Pointer to the vnode containing the lock + * @param[in] dentry Pointer to the dentry used to identify the vnode + * + * @return RT_EOK on success, or -RT_EINVAL if a parameter is invalid + */ +rt_err_t dfs_vnode_lock_init(struct dfs_vnode *vnode, struct dfs_dentry *dentry) +{ + char lock_name[RT_NAME_MAX]; + uint32_t path_hash; + + if (vnode == RT_NULL || dentry == RT_NULL) + { + return -RT_EINVAL; + } + + path_hash = dfs_dentry_full_path_crc32(dentry); + rt_snprintf(lock_name, sizeof(lock_name), "vn-%04x", + (unsigned int)(path_hash & 0xffffU)); + + return rt_mutex_init(&vnode->lock, lock_name, RT_IPC_FLAG_PRIO); +} + /** * @brief Destroy a virtual node (vnode) and free its resources *