diff options
-rw-r--r-- | Kernel/Process.cpp | 1 | ||||
-rw-r--r-- | Kernel/Syscall.cpp | 8 | ||||
-rw-r--r-- | Kernel/Syscall.h | 1 | ||||
-rwxr-xr-x | Kernel/sync.sh | 3 | ||||
-rw-r--r-- | LibC/unistd.cpp | 5 | ||||
-rw-r--r-- | LibC/unistd.h | 1 | ||||
-rw-r--r-- | Userland/.gitignore | 1 | ||||
-rw-r--r-- | Userland/Makefile | 6 | ||||
-rw-r--r-- | Userland/sync.cpp | 8 | ||||
-rw-r--r-- | VirtualFileSystem/Ext2FileSystem.cpp | 1 | ||||
-rw-r--r-- | VirtualFileSystem/FileSystem.cpp | 45 | ||||
-rw-r--r-- | VirtualFileSystem/FileSystem.h | 7 | ||||
-rw-r--r-- | VirtualFileSystem/VirtualFileSystem.cpp | 13 | ||||
-rw-r--r-- | VirtualFileSystem/VirtualFileSystem.h | 2 |
14 files changed, 78 insertions, 24 deletions
diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index c9b3c18f89..f9b13b0655 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -1105,7 +1105,6 @@ int Process::sys$utime(const char* pathname, const Unix::utimbuf* buf) } inode.set_atime(atime); inode.set_mtime(mtime); - inode.flush_metadata(); return 0; } diff --git a/Kernel/Syscall.cpp b/Kernel/Syscall.cpp index 0c9d8b472f..1cfc118cd8 100644 --- a/Kernel/Syscall.cpp +++ b/Kernel/Syscall.cpp @@ -44,6 +44,12 @@ void initialize() kprintf("syscall: int 0x80 handler installed\n"); } +static int sync() +{ + VFS::the().sync(); + return 0; +} + static dword handle(RegisterDump& regs, dword function, dword arg1, dword arg2, dword arg3) { ASSERT_INTERRUPTS_ENABLED(); @@ -179,6 +185,8 @@ static dword handle(RegisterDump& regs, dword function, dword arg1, dword arg2, return current->sys$times((Unix::tms*)arg1); case Syscall::SC_utime: return current->sys$utime((const char*)arg1, (const Unix::utimbuf*)arg2); + case Syscall::SC_sync: + return sync(); default: kprintf("<%u> int0x80: Unknown function %u requested {%x, %x, %x}\n", current->pid(), function, arg1, arg2, arg3); break; diff --git a/Kernel/Syscall.h b/Kernel/Syscall.h index 99a0c73730..84e352e7e7 100644 --- a/Kernel/Syscall.h +++ b/Kernel/Syscall.h @@ -65,6 +65,7 @@ __ENUMERATE_SYSCALL(mkdir) \ __ENUMERATE_SYSCALL(times) \ __ENUMERATE_SYSCALL(utime) \ + __ENUMERATE_SYSCALL(sync) \ #define DO_SYSCALL_A0(function) Syscall::invoke((dword)(function)) diff --git a/Kernel/sync.sh b/Kernel/sync.sh index 49ed14e7e3..d2592c2cc0 100755 --- a/Kernel/sync.sh +++ b/Kernel/sync.sh @@ -23,14 +23,13 @@ cp -v ../Userland/cat mnt/bin/cat cp -v ../Userland/uname mnt/bin/uname cp -v ../Userland/clear mnt/bin/clear cp -v ../Userland/tst mnt/bin/tst -cp -v ../Userland/ft mnt/bin/ft -cp -v ../Userland/ft2 mnt/bin/ft2 cp -v ../Userland/mm mnt/bin/mm cp -v ../Userland/kill mnt/bin/kill cp -v ../Userland/tty mnt/bin/tty cp -v ../Userland/strsignal mnt/bin/strsignal cp -v ../Userland/mkdir mnt/bin/mkdir cp -v ../Userland/touch mnt/bin/touch +cp -v ../Userland/sync mnt/bin/sync sh sync-local.sh cp -v kernel.map mnt/ ln -s dir_a mnt/dir_cur diff --git a/LibC/unistd.cpp b/LibC/unistd.cpp index d8191ae507..d7c1d252be 100644 --- a/LibC/unistd.cpp +++ b/LibC/unistd.cpp @@ -294,4 +294,9 @@ void _exit(int status) assert(false); } +void sync() +{ + Syscall::invoke(Syscall::SC_sync); +} + } diff --git a/LibC/unistd.h b/LibC/unistd.h index b11d90708a..22a7979d5c 100644 --- a/LibC/unistd.h +++ b/LibC/unistd.h @@ -11,6 +11,7 @@ extern char** environ; inline int getpagesize() { return 4096; } pid_t fork(); int execve(const char* filename, const char** argv, const char** envp); +void sync(); void _exit(int status); pid_t getsid(pid_t); pid_t setsid(); diff --git a/Userland/.gitignore b/Userland/.gitignore index c5f95143dc..27f4a6276a 100644 --- a/Userland/.gitignore +++ b/Userland/.gitignore @@ -22,3 +22,4 @@ strsignal fgrep mkdir touch +sync diff --git a/Userland/Makefile b/Userland/Makefile index 30abcc2e79..de65d69b99 100644 --- a/Userland/Makefile +++ b/Userland/Makefile @@ -44,7 +44,8 @@ APPS = \ fgrep \ tty \ mkdir \ - touch + touch \ + sync ARCH_FLAGS = STANDARD_FLAGS = -std=c++17 -nostdinc++ -nostdlib -nostdinc @@ -130,6 +131,9 @@ mkdir: mkdir.o touch: touch.o $(LD) -o $@ $(LDFLAGS) $< ../LibC/LibC.a +sync: sync.o + $(LD) -o $@ $(LDFLAGS) $< ../LibC/LibC.a + .cpp.o: @echo "CXX $<"; $(CXX) $(CXXFLAGS) -o $@ -c $< diff --git a/Userland/sync.cpp b/Userland/sync.cpp new file mode 100644 index 0000000000..aeed3ac5dc --- /dev/null +++ b/Userland/sync.cpp @@ -0,0 +1,8 @@ +#include <stdio.h> +#include <unistd.h> + +int main(int, char**) +{ + sync(); + return 0; +} diff --git a/VirtualFileSystem/Ext2FileSystem.cpp b/VirtualFileSystem/Ext2FileSystem.cpp index aae08f7eb2..6c4284e942 100644 --- a/VirtualFileSystem/Ext2FileSystem.cpp +++ b/VirtualFileSystem/Ext2FileSystem.cpp @@ -306,6 +306,7 @@ void Ext2FSInode::populate_metadata() const void Ext2FSInode::flush_metadata() { + dbgprintf("Ext2FSInode: flush_metadata for inode %u\n", index()); m_raw_inode.i_size = m_metadata.size; m_raw_inode.i_mode = m_metadata.mode; m_raw_inode.i_uid = m_metadata.uid; diff --git a/VirtualFileSystem/FileSystem.cpp b/VirtualFileSystem/FileSystem.cpp index f990a11f87..62fbfe5880 100644 --- a/VirtualFileSystem/FileSystem.cpp +++ b/VirtualFileSystem/FileSystem.cpp @@ -4,36 +4,45 @@ #include "FileSystem.h" static dword s_lastFileSystemID; -static HashMap<dword, FS*>* map; +static HashMap<dword, FS*>* s_fs_map; +static HashTable<Inode*>* s_inode_set; -static HashMap<dword, FS*>& fileSystems() +static HashMap<dword, FS*>& all_fses() { - if (!map) - map = new HashMap<dword, FS*>(); - return *map; + if (!s_fs_map) + s_fs_map = new HashMap<dword, FS*>(); + return *s_fs_map; +} + +static HashTable<Inode*>& all_inodes() +{ + if (!s_inode_set) + s_inode_set = new HashTable<Inode*>(); + return *s_inode_set; } void FS::initializeGlobals() { s_lastFileSystemID = 0; - map = 0; + s_fs_map = nullptr; + s_inode_set = nullptr; } FS::FS() : m_fsid(++s_lastFileSystemID) { - fileSystems().set(m_fsid, this); + all_fses().set(m_fsid, this); } FS::~FS() { - fileSystems().remove(m_fsid); + all_fses().remove(m_fsid); } FS* FS::from_fsid(dword id) { - auto it = fileSystems().find(id); - if (it != fileSystems().end()) + auto it = all_fses().find(id); + if (it != all_fses().end()) return (*it).value; return nullptr; } @@ -125,8 +134,16 @@ FS::DirectoryEntry::DirectoryEntry(const char* n, size_t nl, InodeIdentifier i, name[nl] = '\0'; } +Inode::Inode(FS& fs, unsigned index) + : m_fs(fs) + , m_index(index) +{ + all_inodes().set(this); +} + Inode::~Inode() { + all_inodes().remove(this); } void Inode::will_be_destroyed() @@ -167,3 +184,11 @@ int Inode::set_mtime(Unix::time_t ts) m_metadata_dirty = true; return 0; } + +void FS::sync() +{ + for (auto* inode : all_inodes()) { + if (inode->is_metadata_dirty()) + inode->flush_metadata(); + } +} diff --git a/VirtualFileSystem/FileSystem.h b/VirtualFileSystem/FileSystem.h index 726066e2be..8215ac41d3 100644 --- a/VirtualFileSystem/FileSystem.h +++ b/VirtualFileSystem/FileSystem.h @@ -26,6 +26,7 @@ public: dword id() const { return m_fsid; } static FS* from_fsid(dword); + static void sync(); virtual bool initialize() = 0; virtual const char* class_name() const = 0; @@ -98,11 +99,7 @@ public: void will_be_destroyed(); protected: - Inode(FS& fs, unsigned index) - : m_fs(fs) - , m_index(index) - { - } + Inode(FS& fs, unsigned index); virtual void populate_metadata() const = 0; void set_metadata_dirty(bool b) { m_metadata_dirty = b; } diff --git a/VirtualFileSystem/VirtualFileSystem.cpp b/VirtualFileSystem/VirtualFileSystem.cpp index d51a1d4dbe..5c711df21a 100644 --- a/VirtualFileSystem/VirtualFileSystem.cpp +++ b/VirtualFileSystem/VirtualFileSystem.cpp @@ -47,13 +47,11 @@ VFS::~VFS() auto VFS::makeNode(InodeIdentifier inode) -> RetainPtr<Vnode> { - auto metadata = inode.metadata(); - if (!metadata.isValid()) + auto core_inode = inode.fs()->get_inode(inode); + if (!core_inode) return nullptr; - auto core_inode = inode.fs()->get_inode(inode); - if (core_inode) - core_inode->m_metadata = metadata; + auto& metadata = core_inode->metadata(); InterruptDisabler disabler; @@ -501,3 +499,8 @@ void VFS::for_each_mount(Function<void(const Mount&)> callback) const callback(*mount); } } + +void VFS::sync() +{ + FS::sync(); +} diff --git a/VirtualFileSystem/VirtualFileSystem.h b/VirtualFileSystem/VirtualFileSystem.h index 73bf47150a..d2874f5ed4 100644 --- a/VirtualFileSystem/VirtualFileSystem.h +++ b/VirtualFileSystem/VirtualFileSystem.h @@ -123,6 +123,8 @@ public: InodeIdentifier root_inode_id() const; + void sync(); + private: friend class FileDescriptor; friend class Vnode; |