|
@@ -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.
|