1
0
Эх сурвалжийг харах

🐞 fix(components/dfs/filesystems/tmpfs/dfs_tmpfs.c): cannot open the same file repeatedly in 'w' mode

xqyjlj 2 жил өмнө
parent
commit
da8f5c08c2

+ 33 - 36
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 <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.