Selaa lähdekoodia

[dfs] Update dfs v1 synchronously (#15)

* [dfs] Update dfs v1 synchronously
Yuqiang Wang 2 vuotta sitten
vanhempi
sitoutus
d8d10b40c6
1 muutettua tiedostoa jossa 38 lisäystä ja 20 poistoa
  1. 38 20
      dfs_lfs.c

+ 38 - 20
dfs_lfs.c

@@ -539,7 +539,7 @@ static int _dfs_lfs_rename(struct dfs_filesystem* dfs, const char* from, const c
 /******************************************************************************
  * file operations
  ******************************************************************************/
-static int _dfs_lfs_open(struct dfs_fd* file)
+static int _dfs_lfs_open(struct dfs_file* file)
 {
     struct dfs_filesystem* dfs;
     dfs_lfs_t* dfs_lfs;
@@ -547,9 +547,21 @@ static int _dfs_lfs_open(struct dfs_fd* file)
     int flags = 0;
 
     RT_ASSERT(file != RT_NULL);
-    RT_ASSERT(file->data != RT_NULL);
 
-    dfs = (struct dfs_filesystem*)file->data;
+    dfs = (struct dfs_filesystem*)file->vnode->fs;
+
+    RT_ASSERT(file->vnode->ref_count > 0);
+    if (file->vnode->ref_count > 1)
+    {
+        if (file->vnode->type == FT_DIRECTORY
+                && !(file->flags & O_DIRECTORY))
+        {
+            return -ENOENT;
+        }
+        file->pos = 0;
+        return 0;
+    }
+
     dfs_lfs = (dfs_lfs_t*)dfs->data;
 
     if (file->flags & O_DIRECTORY)
@@ -568,7 +580,7 @@ static int _dfs_lfs_open(struct dfs_fd* file)
         if (file->flags & O_CREAT)
         {
 #ifndef LFS_READONLY
-            result = lfs_mkdir(dfs_lfs_fd->lfs, file->path);
+            result = lfs_mkdir(dfs_lfs_fd->lfs, file->vnode->path);
 #else
             result = -EINVAL;
 #endif
@@ -578,7 +590,7 @@ static int _dfs_lfs_open(struct dfs_fd* file)
             }
         }
 
-        result = lfs_dir_open(dfs_lfs_fd->lfs, &dfs_lfs_fd->u.dir, file->path);
+        result = lfs_dir_open(dfs_lfs_fd->lfs, &dfs_lfs_fd->u.dir, file->vnode->path);
         if (result != LFS_ERR_OK)
         {
             goto _error_dir;
@@ -625,7 +637,7 @@ static int _dfs_lfs_open(struct dfs_fd* file)
         if (file->flags & O_APPEND)
             flags |= LFS_O_APPEND;
 
-        result = lfs_file_open(dfs_lfs_fd->lfs, &dfs_lfs_fd->u.file, file->path, flags);
+        result = lfs_file_open(dfs_lfs_fd->lfs, &dfs_lfs_fd->u.file, file->vnode->path, flags);
         if (result != LFS_ERR_OK)
         {
             goto _error_file;
@@ -634,7 +646,7 @@ static int _dfs_lfs_open(struct dfs_fd* file)
         {
             file->data = (void*)dfs_lfs_fd;
             file->pos = dfs_lfs_fd->u.file.pos;
-            file->size = dfs_lfs_fd->u.file.ctz.size;
+            file->vnode->size = dfs_lfs_fd->u.file.ctz.size;
             return RT_EOK;
         }
 
@@ -648,16 +660,22 @@ static int _dfs_lfs_open(struct dfs_fd* file)
     }
 }
 
-static int _dfs_lfs_close(struct dfs_fd* file)
+static int _dfs_lfs_close(struct dfs_file* file)
 {
     int result;
     dfs_lfs_fd_t* dfs_lfs_fd;
     RT_ASSERT(file != RT_NULL);
     RT_ASSERT(file->data != RT_NULL);
 
+    RT_ASSERT(file->vnode->ref_count > 0);
+    if (file->vnode->ref_count > 1)
+    {
+        return 0;
+    }
+
     dfs_lfs_fd = (dfs_lfs_fd_t*)file->data;
 
-    if (file->type == FT_DIRECTORY)
+    if (file->vnode->type == FT_DIRECTORY)
     {
         result = lfs_dir_close(dfs_lfs_fd->lfs, &dfs_lfs_fd->u.dir);
     }
@@ -671,12 +689,12 @@ static int _dfs_lfs_close(struct dfs_fd* file)
     return _lfs_result_to_dfs(result);
 }
 
-static int _dfs_lfs_ioctl(struct dfs_fd* file, int cmd, void* args)
+static int _dfs_lfs_ioctl(struct dfs_file* file, int cmd, void* args)
 {
     return -ENOSYS;
 }
 
-static int _dfs_lfs_read(struct dfs_fd* file, void* buf, size_t len)
+static int _dfs_lfs_read(struct dfs_file* file, void* buf, size_t len)
 {
     lfs_ssize_t ssize;
     dfs_lfs_fd_t* dfs_lfs_fd;
@@ -684,7 +702,7 @@ static int _dfs_lfs_read(struct dfs_fd* file, void* buf, size_t len)
     RT_ASSERT(file != RT_NULL);
     RT_ASSERT(file->data != RT_NULL);
 
-    if (file->type == FT_DIRECTORY)
+    if (file->vnode->type == FT_DIRECTORY)
     {
         return -EISDIR;
     }
@@ -715,14 +733,14 @@ static int _dfs_lfs_read(struct dfs_fd* file, void* buf, size_t len)
 }
 
 #ifndef LFS_READONLY
-static int _dfs_lfs_write(struct dfs_fd* file, const void* buf, size_t len)
+static int _dfs_lfs_write(struct dfs_file* file, const void* buf, size_t len)
 {
     lfs_ssize_t ssize;
     dfs_lfs_fd_t* dfs_lfs_fd;
     RT_ASSERT(file != RT_NULL);
     RT_ASSERT(file->data != RT_NULL);
 
-    if (file->type == FT_DIRECTORY)
+    if (file->vnode->type == FT_DIRECTORY)
     {
         return -EISDIR;
     }
@@ -748,13 +766,13 @@ static int _dfs_lfs_write(struct dfs_fd* file, const void* buf, size_t len)
 
     /* update position and file size */
     file->pos = dfs_lfs_fd->u.file.pos;
-    file->size = dfs_lfs_fd->u.file.ctz.size;
+    file->vnode->size = dfs_lfs_fd->u.file.ctz.size;
 
     return ssize;
 }
 #endif
 
-static int _dfs_lfs_flush(struct dfs_fd* file)
+static int _dfs_lfs_flush(struct dfs_file* file)
 {
     int result;
     dfs_lfs_fd_t* dfs_lfs_fd;
@@ -768,7 +786,7 @@ static int _dfs_lfs_flush(struct dfs_fd* file)
     return _lfs_result_to_dfs(result);
 }
 
-static int _dfs_lfs_lseek(struct dfs_fd* file, rt_off_t offset)
+static int _dfs_lfs_lseek(struct dfs_file* file, rt_off_t offset)
 {
     dfs_lfs_fd_t* dfs_lfs_fd;
 
@@ -777,7 +795,7 @@ static int _dfs_lfs_lseek(struct dfs_fd* file, rt_off_t offset)
 
     dfs_lfs_fd = (dfs_lfs_fd_t*)file->data;
 
-    if (file->type == FT_REGULAR)
+    if (file->vnode->type == FT_REGULAR)
     {
         lfs_soff_t soff = lfs_file_seek(dfs_lfs_fd->lfs, &dfs_lfs_fd->u.file, offset, LFS_SEEK_SET);
         if (soff < 0)
@@ -787,7 +805,7 @@ static int _dfs_lfs_lseek(struct dfs_fd* file, rt_off_t offset)
 
         file->pos = dfs_lfs_fd->u.file.pos;
     }
-    else if (file->type == FT_DIRECTORY)
+    else if (file->vnode->type == FT_DIRECTORY)
     {
         lfs_soff_t soff = lfs_dir_seek(dfs_lfs_fd->lfs, &dfs_lfs_fd->u.dir, offset);
         if (soff < 0)
@@ -801,7 +819,7 @@ static int _dfs_lfs_lseek(struct dfs_fd* file, rt_off_t offset)
     return (file->pos);
 }
 
-static int _dfs_lfs_getdents(struct dfs_fd* file, struct dirent* dirp, uint32_t count)
+static int _dfs_lfs_getdents(struct dfs_file* file, struct dirent* dirp, uint32_t count)
 {
     dfs_lfs_fd_t* dfs_lfs_fd;
     int result;