This is an automated email from the ASF dual-hosted git repository.
pkarashchenko pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new 63e6f80fb0 sync: add sync api
63e6f80fb0 is described below
commit 63e6f80fb0f5b1fbaada5b66399407e880552652
Author: dongjiuzhu1 <[email protected]>
AuthorDate: Mon Feb 6 22:56:05 2023 +0800
sync: add sync api
Signed-off-by: dongjiuzhu1 <[email protected]>
---
fs/inode/fs_files.c | 52 ++++++++++++++++++++++++++++++++++++++++++++
include/sys/syscall_lookup.h | 1 +
include/unistd.h | 2 ++
syscall/syscall.csv | 1 +
4 files changed, 56 insertions(+)
diff --git a/fs/inode/fs_files.c b/fs/inode/fs_files.c
index 570f5f5f6a..ad6e2e893b 100644
--- a/fs/inode/fs_files.c
+++ b/fs/inode/fs_files.c
@@ -35,6 +35,7 @@
#include <nuttx/kmalloc.h>
#include <nuttx/cancelpt.h>
#include <nuttx/mutex.h>
+#include <nuttx/sched.h>
#include "inode/inode.h"
@@ -97,6 +98,39 @@ static int files_extend(FAR struct filelist *list, size_t
row)
return 0;
}
+#ifndef CONFIG_DISABLE_MOUNTPOINT
+
+static void task_fssync(FAR struct tcb_s *tcb, FAR void *arg)
+{
+ FAR struct filelist *list;
+ int i;
+ int j;
+
+ list = &tcb->group->tg_filelist;
+ if (nxmutex_lock(&list->fl_lock) < 0)
+ {
+ return;
+ }
+
+ for (i = 0; i < list->fl_rows; i++)
+ {
+ for (j = 0; j < CONFIG_NFILE_DESCRIPTORS_PER_BLOCK; j++)
+ {
+ FAR struct file *filep;
+
+ filep = &list->fl_files[i][j];
+ if (filep != NULL && filep->f_inode != NULL)
+ {
+ file_fsync(filep);
+ }
+ }
+ }
+
+ nxmutex_unlock(&list->fl_lock);
+}
+
+#endif /* !CONFIG_DISABLE_MOUNTPOINT */
+
/****************************************************************************
* Public Functions
****************************************************************************/
@@ -603,3 +637,21 @@ int close(int fd)
leave_cancellation_point();
return ret;
}
+
+#ifndef CONFIG_DISABLE_MOUNTPOINT
+
+/****************************************************************************
+ * Name: sync
+ *
+ * Description:
+ * sync() causes all pending modifications to filesystem metadata and
+ * cached file data to be written to the underlying filesystems.
+ *
+ ****************************************************************************/
+
+void sync(void)
+{
+ nxsched_foreach(task_fssync, NULL);
+}
+
+#endif /* !CONFIG_DISABLE_MOUNTPOINT */
diff --git a/include/sys/syscall_lookup.h b/include/sys/syscall_lookup.h
index 4c44ea2919..a159cad3ff 100644
--- a/include/sys/syscall_lookup.h
+++ b/include/sys/syscall_lookup.h
@@ -271,6 +271,7 @@ SYSCALL_LOOKUP(munmap, 2)
#ifndef CONFIG_DISABLE_MOUNTPOINT
SYSCALL_LOOKUP(mount, 5)
+ SYSCALL_LOOKUP(sync, 0)
SYSCALL_LOOKUP(fsync, 1)
SYSCALL_LOOKUP(ftruncate, 2)
SYSCALL_LOOKUP(mkdir, 2)
diff --git a/include/unistd.h b/include/unistd.h
index 0ee4275de9..4c49eaabd2 100644
--- a/include/unistd.h
+++ b/include/unistd.h
@@ -438,6 +438,8 @@ int setregid(gid_t rgid, gid_t egid);
int getentropy(FAR void *buffer, size_t length);
+void sync(void);
+
#undef EXTERN
#if defined(__cplusplus)
}
diff --git a/syscall/syscall.csv b/syscall/syscall.csv
index dd3a221d43..ac2706ac36 100644
--- a/syscall/syscall.csv
+++ b/syscall/syscall.csv
@@ -166,6 +166,7 @@
"stat","sys/stat.h","","int","FAR const char *","FAR struct stat *"
"statfs","sys/statfs.h","","int","FAR const char *","FAR struct statfs *"
"symlink","unistd.h","defined(CONFIG_PSEUDOFS_SOFTLINKS)","int","FAR const
char *","FAR const char *"
+"sync","unistd.h","!defined(CONFIG_DISABLE_MOUNTPOINT)","void"
"sysinfo","sys/sysinfo.h","","int","FAR struct sysinfo *"
"task_create","sched.h","!defined(CONFIG_BUILD_KERNEL)", "int","FAR const char
*","int","int","main_t","FAR char * const []|FAR char * const *"
"task_delete","sched.h","!defined(CONFIG_BUILD_KERNEL)","int","pid_t"