diff --git a/components/dfs/filesystems/tmpfs/dfs_tmpfs.c b/components/dfs/filesystems/tmpfs/dfs_tmpfs.c index 7ed8e8f88805c9bafe1584fc2b06d44960046a9e..b52b27cb73b0e74a4a78b625302af1af9f892e98 100644 --- a/components/dfs/filesystems/tmpfs/dfs_tmpfs.c +++ b/components/dfs/filesystems/tmpfs/dfs_tmpfs.c @@ -6,6 +6,7 @@ * Change Logs: * Date Author Notes * 2022-10-24 flybreak the first version + * 2023-02-01 xqyjlj fix cannot open the same file repeatedly in 'w' mode */ #include @@ -382,45 +383,41 @@ int dfs_tmpfs_open(struct dfs_fd *file) /* Creates a new file. */ if (file->flags & O_CREAT) { - if (d_file != NULL) - return -EEXIST; - - /* find parent file */ - _path_separate(file->vnode->path, parent_path, file_name); - if (file_name[0] == '\0') /* it's root dir */ - return -ENOENT; - - /* open parent directory */ - p_file = dfs_tmpfs_lookup(superblock, parent_path, &size); - if (p_file == NULL) - return -ENOENT; - - /* create a file entry */ - d_file = (struct tmpfs_file *)rt_calloc(1, sizeof(struct tmpfs_file)); - if (d_file == NULL) - { - return -ENOMEM; - } - superblock->df_size += sizeof(struct tmpfs_file); + if (d_file == NULL) { + /* find parent file */ + _path_separate(file->vnode->path, parent_path, file_name); + if (file_name[0] == '\0') /* it's root dir */ + return -ENOENT; + + /* open parent directory */ + p_file = dfs_tmpfs_lookup(superblock, parent_path, &size); + if (p_file == NULL) + return -ENOENT; + + /* create a file entry */ + d_file = (struct tmpfs_file *)rt_calloc(1, sizeof(struct tmpfs_file)); + if (d_file == NULL) { + return -ENOMEM; + } + superblock->df_size += sizeof(struct tmpfs_file); - strncpy(d_file->name, file_name, TMPFS_NAME_MAX); + strncpy(d_file->name, file_name, TMPFS_NAME_MAX); - rt_list_init(&(d_file->subdirs)); - rt_list_init(&(d_file->sibling)); - d_file->data = NULL; - d_file->size = 0; - d_file->sb = superblock; - if (file->flags & O_DIRECTORY) - { - d_file->type = TMPFS_TYPE_DIR; - } - else - { - d_file->type = TMPFS_TYPE_FILE; + rt_list_init(&(d_file->subdirs)); + rt_list_init(&(d_file->sibling)); + d_file->data = NULL; + d_file->size = 0; + d_file->sb = superblock; + if (file->flags & O_DIRECTORY) { + d_file->type = TMPFS_TYPE_DIR; + } + else { + d_file->type = TMPFS_TYPE_FILE; + } + rt_hw_spin_lock(&lock); + rt_list_insert_after(&(p_file->subdirs), &(d_file->sibling)); + rt_hw_spin_unlock(&lock); } - rt_hw_spin_lock(&lock); - rt_list_insert_after(&(p_file->subdirs), &(d_file->sibling)); - rt_hw_spin_unlock(&lock); } /* Creates a new file. * If the file is existing, it is truncated and overwritten.