summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Kernel/Process.cpp1
-rw-r--r--Kernel/Syscall.cpp8
-rw-r--r--Kernel/Syscall.h1
-rwxr-xr-xKernel/sync.sh3
-rw-r--r--LibC/unistd.cpp5
-rw-r--r--LibC/unistd.h1
-rw-r--r--Userland/.gitignore1
-rw-r--r--Userland/Makefile6
-rw-r--r--Userland/sync.cpp8
-rw-r--r--VirtualFileSystem/Ext2FileSystem.cpp1
-rw-r--r--VirtualFileSystem/FileSystem.cpp45
-rw-r--r--VirtualFileSystem/FileSystem.h7
-rw-r--r--VirtualFileSystem/VirtualFileSystem.cpp13
-rw-r--r--VirtualFileSystem/VirtualFileSystem.h2
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;