Merge branch 'master' into 'master'
feat(redox): flocking See merge request redox-os/redoxfs!112
This commit is contained in:
+15
-2
@@ -1,4 +1,7 @@
|
||||
use redox_scheme::{scheme::SchemeSync, RequestKind, Response, SignalBehavior, Socket};
|
||||
use redox_scheme::{
|
||||
scheme::{SchemeState, SchemeSync},
|
||||
RequestKind, Response, SignalBehavior, Socket,
|
||||
};
|
||||
use std::io;
|
||||
use std::path::Path;
|
||||
use std::sync::atomic::Ordering;
|
||||
@@ -25,6 +28,7 @@ where
|
||||
let scheme_name = format!("{}", mountpoint.display());
|
||||
let mounted_path = format!("/scheme/{}", mountpoint.display());
|
||||
|
||||
let mut state = SchemeState::new();
|
||||
let mut scheme = FileScheme::new(scheme_name, mounted_path.clone(), filesystem, &socket);
|
||||
|
||||
redox_scheme::scheme::register_sync_scheme(
|
||||
@@ -52,6 +56,15 @@ where
|
||||
}
|
||||
RequestKind::OnClose { id } => {
|
||||
scheme.on_close(id);
|
||||
state.on_close(id);
|
||||
continue;
|
||||
}
|
||||
RequestKind::OnDetach { id, pid } => {
|
||||
let Ok(inode) = scheme.inode(id) else {
|
||||
log::warn!("RequestKind::OnDetach with invalid `id`");
|
||||
continue;
|
||||
};
|
||||
state.on_detach(id, inode, pid);
|
||||
continue;
|
||||
}
|
||||
_ => {
|
||||
@@ -62,7 +75,7 @@ where
|
||||
}
|
||||
}
|
||||
};
|
||||
let response = req.handle_sync(&mut scheme);
|
||||
let response = req.handle_sync(&mut scheme, &mut state);
|
||||
|
||||
if !socket.write_response(response, SignalBehavior::Restart)? {
|
||||
break;
|
||||
|
||||
@@ -493,7 +493,7 @@ impl<D: Disk> Resource<D> for FileResource {
|
||||
let fmap_info = fmaps
|
||||
.get_mut(&self.node_ptr.id())
|
||||
.ok_or(Error::new(EBADFD))?;
|
||||
|
||||
|
||||
if !fmap_info.in_use() {
|
||||
// Notify filesystem of open
|
||||
tx.on_open_node(self.node_ptr)?;
|
||||
|
||||
@@ -1153,4 +1153,11 @@ impl<'sock, D: Disk> SchemeSync for FileScheme<'sock, D> {
|
||||
_ => Err(Error::new(EOPNOTSUPP)),
|
||||
}
|
||||
}
|
||||
|
||||
fn inode(&self, id: usize) -> Result<usize> {
|
||||
let Some(Handle::Resource(resource)) = self.handles.get(&id) else {
|
||||
return Err(Error::new(EBADF));
|
||||
};
|
||||
Ok(resource.node_ptr().id() as usize)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user