Browse Source

fix(FileArray): release the spinlock before dropping inner files

greatbridf 7 tháng trước cách đây
mục cha
commit
1513e66772
2 tập tin đã thay đổi với 6 bổ sung4 xóa
  1. 1 1
      src/kernel/vfs/file.rs
  2. 5 3
      src/kernel/vfs/filearray.rs

+ 1 - 1
src/kernel/vfs/file.rs

@@ -516,7 +516,7 @@ impl File {
 
     pub fn as_path(&self) -> Option<&Arc<Dentry>> {
         match self {
-            File::Inode(inode_file) if s_isdir(inode_file.mode) => Some(&inode_file.dentry),
+            File::Inode(inode_file) => Some(&inode_file.dentry),
             _ => None,
         }
     }

+ 5 - 3
src/kernel/vfs/filearray.rs

@@ -79,9 +79,11 @@ impl FileArray {
     }
 
     pub fn close_all(&self) {
-        let mut inner = self.inner.lock();
-        inner.fd_min_avail = FD(0);
-        inner.files.clear();
+        let _old_files = {
+            let mut inner = self.inner.lock();
+            inner.fd_min_avail = FD(0);
+            core::mem::take(&mut inner.files)
+        };
     }
 
     pub fn close(&self, fd: FD) -> KResult<()> {