summaryrefslogtreecommitdiff
path: root/components
diff options
context:
space:
mode:
authorXYZ <[email protected]>2023-10-20 13:24:56 +0800
committerGitHub <[email protected]>2023-10-20 13:24:56 +0800
commit1f05b6b401e329f85bc82d7379757760a1886227 (patch)
treeab6eeb19e7273137fc8adf585daf56c199485354 /components
parent43f96b3f8598aaa2a808a5a5b72482d662dfcc20 (diff)
[dfs v2] support O_DIRECT and O_SYNC flags (#8155)
Diffstat (limited to 'components')
-rw-r--r--components/dfs/dfs_v2/src/dfs_file.c9
-rw-r--r--components/dfs/dfs_v2/src/dfs_pcache.c20
2 files changed, 26 insertions, 3 deletions
diff --git a/components/dfs/dfs_v2/src/dfs_file.c b/components/dfs/dfs_v2/src/dfs_file.c
index a7baa9323f..3cbf8912f1 100644
--- a/components/dfs/dfs_v2/src/dfs_file.c
+++ b/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
{
diff --git a/components/dfs/dfs_v2/src/dfs_pcache.c b/components/dfs/dfs_v2/src/dfs_pcache.c
index 0b2492dc7f..0a8037c9c2 100644
--- a/components/dfs/dfs_v2/src/dfs_pcache.c
+++ b/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);
}