1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 04:48:14 +00:00

Kernel: Lock the inode before writing in SharedInodeVMObject::sync

We ensure that when we call SharedInodeVMObject::sync we lock the inode
lock before calling Inode virtual write_bytes method directly to avoid
assertion on the unlocked inode lock, as it was regressed recently. This
is not a complete fix as the need to lock from each path before calling
the write_bytes method should be avoided because it can lead to
hard-to-find bugs, and this commit only fixes the problem temporarily.
This commit is contained in:
Mike Akers 2022-08-12 09:48:59 -04:00 committed by Andreas Kling
parent 0b9d83fe0d
commit de980de0e4
2 changed files with 3 additions and 0 deletions

View file

@ -19,6 +19,7 @@
#include <Kernel/Forward.h>
#include <Kernel/Library/ListedRefCounted.h>
#include <Kernel/Locking/Mutex.h>
#include <Kernel/Memory/SharedInodeVMObject.h>
namespace Kernel {
@ -32,6 +33,7 @@ class Inode : public ListedRefCounted<Inode, LockType::Spinlock>
friend class VirtualFileSystem;
friend class FileSystem;
friend class InodeFile;
friend class Kernel::Memory::SharedInodeVMObject; // FIXME: Remove when write_bytes becomes non-virtual
public:
virtual ~Inode();

View file

@ -53,6 +53,7 @@ ErrorOr<void> SharedInodeVMObject::sync(off_t offset_in_pages, size_t pages)
u8 page_buffer[PAGE_SIZE];
MM.copy_physical_page(*physical_page, page_buffer);
MutexLocker locker(m_inode->m_inode_lock);
TRY(m_inode->write_bytes(page_index * PAGE_SIZE, PAGE_SIZE, UserOrKernelBuffer::for_kernel_buffer(page_buffer), nullptr));
}