unmount vfs better
This commit is contained in:
@@ -17,7 +17,8 @@ static mut ROOT_VFS: Vfs = Vfs::null();
|
|||||||
#[allow(unused)]
|
#[allow(unused)]
|
||||||
pub struct Vfs {
|
pub struct Vfs {
|
||||||
mount_point: Option<String>,
|
mount_point: Option<String>,
|
||||||
next: Option<Box<Vfs>>,
|
next: Option<Box<Self>>,
|
||||||
|
prev: Option<NonNull<Self>>,
|
||||||
pub fs: Option<Box<dyn FsOps>>,
|
pub fs: Option<Box<dyn FsOps>>,
|
||||||
vnode_covered: Option<NonNull<VNode>>,
|
vnode_covered: Option<NonNull<VNode>>,
|
||||||
flags: u32,
|
flags: u32,
|
||||||
@@ -32,6 +33,7 @@ impl Vfs {
|
|||||||
return Self {
|
return Self {
|
||||||
mount_point: None,
|
mount_point: None,
|
||||||
next: None,
|
next: None,
|
||||||
|
prev: None,
|
||||||
fs: None,
|
fs: None,
|
||||||
vnode_covered: None,
|
vnode_covered: None,
|
||||||
flags: 0,
|
flags: 0,
|
||||||
@@ -44,6 +46,7 @@ impl Vfs {
|
|||||||
return Self {
|
return Self {
|
||||||
mount_point: Some(mount_point.to_string()),
|
mount_point: Some(mount_point.to_string()),
|
||||||
next: None,
|
next: None,
|
||||||
|
prev: None,
|
||||||
fs: Some(fs),
|
fs: Some(fs),
|
||||||
vnode_covered: None,
|
vnode_covered: None,
|
||||||
flags: 0,
|
flags: 0,
|
||||||
@@ -52,28 +55,15 @@ impl Vfs {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
// sketchy and dumb? yes, but it works
|
|
||||||
fn prev(&self) -> Option<&mut Box<Self>> {
|
|
||||||
let mut cur_vfs = unsafe { ROOT_VFS.next.as_mut() };
|
|
||||||
while let Some(vfs) = cur_vfs {
|
|
||||||
if let Some(next_vfs) = &vfs.next {
|
|
||||||
if next_vfs.mount_point == self.mount_point {
|
|
||||||
return Some(vfs);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
cur_vfs = vfs.next.as_mut();
|
|
||||||
}
|
|
||||||
|
|
||||||
None
|
|
||||||
}
|
|
||||||
|
|
||||||
fn del_vfs(&mut self, target_name: &str) {
|
fn del_vfs(&mut self, target_name: &str) {
|
||||||
let mut curr = self.next.as_mut();
|
let mut curr = self.next.as_mut();
|
||||||
|
|
||||||
while let Some(node) = curr {
|
while let Some(node) = curr {
|
||||||
if node.mount_point.as_deref() == Some(target_name) {
|
if node.mount_point.as_deref() == Some(target_name) {
|
||||||
node.prev().unwrap().next = node.next.take();
|
if let Some(ref mut next_node) = node.next {
|
||||||
|
next_node.prev = node.prev
|
||||||
|
}
|
||||||
|
unsafe { node.prev.unwrap().as_mut().next = node.next.take() };
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -81,12 +71,13 @@ impl Vfs {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn add_vfs(&mut self, vfs: Box<Self>) {
|
fn add_vfs(&mut self, mut vfs: Box<Self>) {
|
||||||
let mut current = self;
|
let mut current = self;
|
||||||
while let Some(ref mut next_vfs) = current.next {
|
while let Some(ref mut next_vfs) = current.next {
|
||||||
current = next_vfs;
|
current = next_vfs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vfs.prev = Some(current.as_ptr());
|
||||||
current.next = Some(vfs);
|
current.next = Some(vfs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -757,12 +748,9 @@ pub fn del_vfs(mount_point: &str) -> Result<(), ()> {
|
|||||||
unsafe { ROOT_VFS.next = None };
|
unsafe { ROOT_VFS.next = None };
|
||||||
} else {
|
} else {
|
||||||
if mount_point_busy(mount_point) {
|
if mount_point_busy(mount_point) {
|
||||||
crate::println!("busy");
|
|
||||||
return Err(());
|
return Err(());
|
||||||
}
|
}
|
||||||
|
|
||||||
crate::println!("Deleting VFS");
|
|
||||||
|
|
||||||
unsafe { ROOT_VFS.del_vfs(mount_point) };
|
unsafe { ROOT_VFS.del_vfs(mount_point) };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -90,8 +90,6 @@ pub fn kmain() -> ! {
|
|||||||
|
|
||||||
let _ = drivers::fs::vfs::del_vfs("/mnt");
|
let _ = drivers::fs::vfs::del_vfs("/mnt");
|
||||||
|
|
||||||
println!("wa");
|
|
||||||
|
|
||||||
let limine_dir = vfs_open("/mnt/boot/limine").unwrap();
|
let limine_dir = vfs_open("/mnt/boot/limine").unwrap();
|
||||||
|
|
||||||
crate::println!(
|
crate::println!(
|
||||||
|
|||||||
Reference in New Issue
Block a user