提交 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 @@
* 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 <rthw.h>
......@@ -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.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册