Browse Source

[dfs v2] support O_DIRECT and O_SYNC flags (#8155)

XYZ 1 year ago
parent
commit
1f05b6b401
2 changed files with 26 additions and 3 deletions
  1. 7 2
      components/dfs/dfs_v2/src/dfs_file.c
  2. 19 1
      components/dfs/dfs_v2/src/dfs_pcache.c

+ 7 - 2
components/dfs/dfs_v2/src/dfs_file.c

@@ -685,7 +685,7 @@ ssize_t dfs_file_read(struct dfs_file *file, void *buf, size_t len)
                 if (dfs_is_mounted(file->vnode->mnt) == 0)
                 {
 #ifdef RT_USING_PAGECACHE
-                    if (file->vnode->aspace)
+                    if (file->vnode->aspace && !(file->flags & O_DIRECT))
                     {
                         ret = dfs_aspace_read(file, buf, len, &pos);
                     }
@@ -739,7 +739,7 @@ ssize_t dfs_file_write(struct dfs_file *file, const void *buf, size_t len)
                 if (dfs_is_mounted(file->vnode->mnt) == 0)
                 {
 #ifdef RT_USING_PAGECACHE
-                    if (file->vnode->aspace)
+                    if (file->vnode->aspace && !(file->flags & O_DIRECT))
                     {
                         ret = dfs_aspace_write(file, buf, len, &pos);
                     }
@@ -748,6 +748,11 @@ ssize_t dfs_file_write(struct dfs_file *file, const void *buf, size_t len)
                     {
                         ret = file->fops->write(file, buf, len, &pos);
                     }
+
+                    if (file->flags & O_SYNC)
+                    {
+                        file->fops->flush(file);
+                    }
                 }
                 else
                 {

+ 19 - 1
components/dfs/dfs_v2/src/dfs_pcache.c

@@ -1153,7 +1153,25 @@ int dfs_aspace_write(struct dfs_file *file, const void *buf, size_t count, off_t
                     aspace->vnode->size = *pos;
                 }
 
-                dfs_page_dirty(page);
+                if (file->flags & O_SYNC)
+                {
+                    if (aspace->vnode->size < page->fpos + page->size)
+                    {
+                        page->len = aspace->vnode->size - page->fpos;
+                    }
+                    else
+                    {
+                        page->len = page->size;
+                    }
+
+                    aspace->ops->write(page);
+                    page->is_dirty = 0;
+                }
+                else
+                {
+                    dfs_page_dirty(page);
+                }
+
                 dfs_page_release(page);
                 dfs_aspace_unlock(aspace);
             }