提交 da8f5c08 编写于 作者: xqyjlj's avatar xqyjlj 提交者: guo

🐞 fix(components/dfs/filesystems/tmpfs/dfs_tmpfs.c): cannot open the same file...

🐞 fix(components/dfs/filesystems/tmpfs/dfs_tmpfs.c): cannot open the same file repeatedly in 'w' mode
上级 e010d844
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
* Change Logs: * Change Logs:
* Date Author Notes * Date Author Notes
* 2022-10-24 flybreak the first version * 2022-10-24 flybreak the first version
* 2023-02-01 xqyjlj fix cannot open the same file repeatedly in 'w' mode
*/ */
#include <rthw.h> #include <rthw.h>
...@@ -382,45 +383,41 @@ int dfs_tmpfs_open(struct dfs_fd *file) ...@@ -382,45 +383,41 @@ int dfs_tmpfs_open(struct dfs_fd *file)
/* Creates a new file. */ /* Creates a new file. */
if (file->flags & O_CREAT) if (file->flags & O_CREAT)
{ {
if (d_file != NULL) if (d_file == NULL) {
return -EEXIST; /* find parent file */
_path_separate(file->vnode->path, parent_path, file_name);
/* find parent file */ if (file_name[0] == '\0') /* it's root dir */
_path_separate(file->vnode->path, parent_path, file_name); return -ENOENT;
if (file_name[0] == '\0') /* it's root dir */
return -ENOENT; /* open parent directory */
p_file = dfs_tmpfs_lookup(superblock, parent_path, &size);
/* open parent directory */ if (p_file == NULL)
p_file = dfs_tmpfs_lookup(superblock, parent_path, &size); return -ENOENT;
if (p_file == NULL)
return -ENOENT; /* create a file entry */
d_file = (struct tmpfs_file *)rt_calloc(1, sizeof(struct tmpfs_file));
/* create a file entry */ if (d_file == NULL) {
d_file = (struct tmpfs_file *)rt_calloc(1, sizeof(struct tmpfs_file)); return -ENOMEM;
if (d_file == NULL) }
{ superblock->df_size += sizeof(struct tmpfs_file);
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->subdirs));
rt_list_init(&(d_file->sibling)); rt_list_init(&(d_file->sibling));
d_file->data = NULL; d_file->data = NULL;
d_file->size = 0; d_file->size = 0;
d_file->sb = superblock; d_file->sb = superblock;
if (file->flags & O_DIRECTORY) if (file->flags & O_DIRECTORY) {
{ d_file->type = TMPFS_TYPE_DIR;
d_file->type = TMPFS_TYPE_DIR; }
} else {
else d_file->type = TMPFS_TYPE_FILE;
{ }
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. /* Creates a new file.
* If the file is existing, it is truncated and overwritten. * If the file is existing, it is truncated and overwritten.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册