diff --git a/Kernel/Memory/SharedInodeVMObject.cpp b/Kernel/Memory/SharedInodeVMObject.cpp index 15ad1c39e2..9d31e82fc7 100644 --- a/Kernel/Memory/SharedInodeVMObject.cpp +++ b/Kernel/Memory/SharedInodeVMObject.cpp @@ -35,11 +35,13 @@ SharedInodeVMObject::SharedInodeVMObject(SharedInodeVMObject const& other) { } -ErrorOr SharedInodeVMObject::sync() +ErrorOr SharedInodeVMObject::sync(off_t offset_in_pages, size_t pages) { SpinlockLocker locker(m_lock); - for (size_t page_index = 0; page_index < page_count(); ++page_index) { + size_t highest_page_to_flush = min(page_count(), offset_in_pages + pages); + + for (size_t page_index = offset_in_pages; page_index < highest_page_to_flush; ++page_index) { auto& physical_page = m_physical_pages[page_index]; if (!physical_page) continue; diff --git a/Kernel/Memory/SharedInodeVMObject.h b/Kernel/Memory/SharedInodeVMObject.h index 81d6a93ca0..3a47c511ef 100644 --- a/Kernel/Memory/SharedInodeVMObject.h +++ b/Kernel/Memory/SharedInodeVMObject.h @@ -18,7 +18,7 @@ public: static ErrorOr> try_create_with_inode(Inode&); virtual ErrorOr> try_clone() override; - ErrorOr sync(); + ErrorOr sync(off_t offset_in_pages = 0, size_t pages = -1); private: virtual bool is_shared_inode() const override { return true; } diff --git a/Kernel/Syscalls/mmap.cpp b/Kernel/Syscalls/mmap.cpp index 2a2ed149db..5e358cd171 100644 --- a/Kernel/Syscalls/mmap.cpp +++ b/Kernel/Syscalls/mmap.cpp @@ -616,8 +616,12 @@ ErrorOr Process::sys$msync(Userspace address, size_t size, int f if (!vmobject.is_shared_inode()) return 0; + off_t offset = region->offset_in_vmobject() + address.ptr() - region->range().base().get(); + auto& inode_vmobject = static_cast(vmobject); - TRY(inode_vmobject.sync()); + // FIXME: Handle MS_ASYNC + TRY(inode_vmobject.sync(offset / PAGE_SIZE, size / PAGE_SIZE)); + // FIXME: Handle MS_INVALIDATE // FIXME: If msync() causes any write to a file, the file's st_ctime and st_mtime fields shall be marked for update. return 0; }