diff --git a/repos/os/src/server/lx_fs/directory.h b/repos/os/src/server/lx_fs/directory.h index 6eca4fa97..684a3b7a5 100644 --- a/repos/os/src/server/lx_fs/directory.h +++ b/repos/os/src/server/lx_fs/directory.h @@ -237,6 +237,12 @@ class Lx_fs::Directory : public Node return 0; } + bool sync() override + { + int ret = fsync(dirfd(_fd)); + return ret ? false : true; + } + Status status() override { struct stat st { }; diff --git a/repos/os/src/server/lx_fs/file.h b/repos/os/src/server/lx_fs/file.h index fa94192fe..e38830b3c 100644 --- a/repos/os/src/server/lx_fs/file.h +++ b/repos/os/src/server/lx_fs/file.h @@ -141,6 +141,12 @@ class Lx_fs::File : public Node return ret == -1 ? 0 : ret; } + bool sync() override + { + int ret = fsync(_fd); + return ret ? false : true; + } + Status status() override { struct stat st { }; diff --git a/repos/os/src/server/lx_fs/main.cc b/repos/os/src/server/lx_fs/main.cc index 6c0373a58..157058351 100644 --- a/repos/os/src/server/lx_fs/main.cc +++ b/repos/os/src/server/lx_fs/main.cc @@ -121,13 +121,10 @@ class Lx_fs::Session_component : public Session_rpc_object case Packet_descriptor::SYNC: - /** - * We could call sync(2) here but for now we forward just the - * reminder because besides testing, there is currently no - * use-case. - */ - Genode::warning("SYNC not implemented!"); - succeeded = true; + if (tx_sink()->packet_valid(packet)) { + succeeded = open_node.node().sync(); + } + break; } diff --git a/repos/os/src/server/lx_fs/node.h b/repos/os/src/server/lx_fs/node.h index 61e28f591..2ff0ead63 100644 --- a/repos/os/src/server/lx_fs/node.h +++ b/repos/os/src/server/lx_fs/node.h @@ -53,6 +53,8 @@ class Lx_fs::Node : public File_system::Node_base virtual size_t read(char *dst, size_t len, seek_off_t) = 0; virtual size_t write(char const *src, size_t len, seek_off_t) = 0; + virtual bool sync() { return true; } + virtual Status status() = 0; /*