diff --git a/repos/dde_rump/src/server/rump_fs/symlink.h b/repos/dde_rump/src/server/rump_fs/symlink.h index 4288bb57b..7045eb765 100644 --- a/repos/dde_rump/src/server/rump_fs/symlink.h +++ b/repos/dde_rump/src/server/rump_fs/symlink.h @@ -49,7 +49,8 @@ class File_system::Symlink : public Node size_t write(char const *src, size_t len, seek_off_t seek_offset) { - if (!_create) + /* Ideal symlink operations are atomic. */ + if (!_create || seek_offset) return 0; int ret = rump_sys_symlink(src, _path.base()); diff --git a/repos/libports/src/server/fuse_fs/symlink.h b/repos/libports/src/server/fuse_fs/symlink.h index 1901c0d3b..590f6198e 100644 --- a/repos/libports/src/server/fuse_fs/symlink.h +++ b/repos/libports/src/server/fuse_fs/symlink.h @@ -70,6 +70,9 @@ class File_system::Symlink : public Node size_t write(char const *src, size_t len, seek_off_t seek_offset) { + /* Ideal symlink operations are atomic. */ + if (seek_offset) return 0; + int res = Fuse::fuse()->op.symlink(src, _path.base()); if (res != 0) return 0; diff --git a/repos/os/include/file_system/util.h b/repos/os/include/file_system/util.h index f16562818..3bd5c192c 100644 --- a/repos/os/include/file_system/util.h +++ b/repos/os/include/file_system/util.h @@ -103,7 +103,7 @@ namespace File_system { /** * Read file content */ - static inline size_t read(Session &fs, File_handle const &file_handle, + static inline size_t read(Session &fs, Node_handle const &node_handle, void *dst, size_t count, seek_off_t seek_offset = 0) { bool success = true; @@ -122,7 +122,7 @@ namespace File_system { Packet_descriptor packet(source.alloc_packet(curr_packet_size), 0, - file_handle, + node_handle, File_system::Packet_descriptor::READ, curr_packet_size, seek_offset); @@ -160,7 +160,7 @@ namespace File_system { /** * Write file content */ - static inline size_t write(Session &fs, File_handle const &file_handle, + static inline size_t write(Session &fs, Node_handle const &node_handle, void const *src, size_t count, seek_off_t seek_offset = 0) { bool success = true; @@ -179,7 +179,7 @@ namespace File_system { Packet_descriptor packet(source.alloc_packet(curr_packet_size), 0, - file_handle, + node_handle, File_system::Packet_descriptor::WRITE, curr_packet_size, seek_offset); diff --git a/repos/os/src/server/lx_fs/symlink.h b/repos/os/src/server/lx_fs/symlink.h index 40bc2bf52..e0c466b73 100644 --- a/repos/os/src/server/lx_fs/symlink.h +++ b/repos/os/src/server/lx_fs/symlink.h @@ -39,6 +39,9 @@ class File_system::Symlink : public Node size_t write(char const *src, size_t len, seek_off_t seek_offset) { + /* Ideal symlink operations are atomic. */ + if (seek_offset) return 0; + size_t count = min(len, sizeof(_link_to) + 1); Genode::strncpy(_link_to, src, count); return count; diff --git a/repos/os/src/server/ram_fs/symlink.h b/repos/os/src/server/ram_fs/symlink.h index c74164e9f..c632d8521 100644 --- a/repos/os/src/server/ram_fs/symlink.h +++ b/repos/os/src/server/ram_fs/symlink.h @@ -31,6 +31,9 @@ namespace File_system { size_t write(char const *src, size_t len, seek_off_t seek_offset) { + /* Ideal symlink operations are atomic. */ + if (seek_offset) return 0; + size_t count = min(len, sizeof(_link_to) + 1); Genode::strncpy(_link_to, src, count); return count;