浏览代码

Kernel: InodeVMObject can't call Inode::size() with interrupts disabled

Inode::size() may try to take a lock, so we can't be calling it with
interrupts disabled.

This fixes a kernel hang when trying to execute a binary in a TmpFS.
Andreas Kling 5 年之前
父节点
当前提交
aba7829724
共有 2 个文件被更改,包括 5 次插入4 次删除
  1. 4 3
      Kernel/VM/InodeVMObject.cpp
  2. 1 1
      Kernel/VM/InodeVMObject.h

+ 4 - 3
Kernel/VM/InodeVMObject.cpp

@@ -5,10 +5,11 @@
 
 NonnullRefPtr<InodeVMObject> InodeVMObject::create_with_inode(Inode& inode)
 {
+    size_t size = inode.size();
     InterruptDisabler disabler;
     if (inode.vmobject())
         return *inode.vmobject();
-    auto vmobject = adopt(*new InodeVMObject(inode));
+    auto vmobject = adopt(*new InodeVMObject(inode, size));
     vmobject->inode().set_vmobject(*vmobject);
     return vmobject;
 }
@@ -18,8 +19,8 @@ NonnullRefPtr<VMObject> InodeVMObject::clone()
     return adopt(*new InodeVMObject(*this));
 }
 
-InodeVMObject::InodeVMObject(Inode& inode)
-    : VMObject(inode.size())
+InodeVMObject::InodeVMObject(Inode& inode, size_t size)
+    : VMObject(size)
     , m_inode(inode)
     , m_dirty_pages(page_count(), false)
 {

+ 1 - 1
Kernel/VM/InodeVMObject.h

@@ -22,7 +22,7 @@ public:
     int release_all_clean_pages();
 
 private:
-    explicit InodeVMObject(Inode&);
+    explicit InodeVMObject(Inode&, size_t);
     explicit InodeVMObject(const InodeVMObject&);
 
     InodeVMObject& operator=(const InodeVMObject&) = delete;