Migrate nvmed to schemev2.
This commit is contained in:
Generated
+2
@@ -787,6 +787,8 @@ dependencies = [
|
||||
"pcid",
|
||||
"redox-daemon",
|
||||
"redox-log",
|
||||
"redox-scheme",
|
||||
"redox_event",
|
||||
"redox_syscall 0.5.1",
|
||||
"smallvec 1.13.2",
|
||||
]
|
||||
|
||||
@@ -9,7 +9,7 @@ byteorder = "1.2"
|
||||
log = "0.4"
|
||||
redox-daemon = "0.1"
|
||||
redox-log = "0.1"
|
||||
redox_syscall = "0.5"
|
||||
redox_syscall = { version = "0.5", features = ["std"] }
|
||||
|
||||
common = { path = "../../common" }
|
||||
driver-block = { path = "../driver-block" }
|
||||
|
||||
@@ -11,7 +11,9 @@ futures = "0.3"
|
||||
log = "0.4"
|
||||
redox-daemon = "0.1"
|
||||
redox-log = "0.1"
|
||||
redox_syscall = "0.5"
|
||||
redox_syscall = { version = "0.5", features = ["std"] }
|
||||
redox-scheme = { git = "https://gitlab.redox-os.org/4lDO2/redox-scheme.git", branch = "schemev2" }
|
||||
redox_event = "0.4"
|
||||
partitionlib = { git = "https://gitlab.redox-os.org/redox-os/partitionlib.git" }
|
||||
smallvec = "1"
|
||||
|
||||
|
||||
+14
-22
@@ -11,6 +11,7 @@ use std::{slice, usize};
|
||||
|
||||
use libredox::flag;
|
||||
use pcid_interface::{PciFeature, PciFeatureInfo, PciFunction, PcidServerHandle};
|
||||
use redox_scheme::{CallRequest, RequestKind, SignalBehavior, Socket, V2};
|
||||
use syscall::{
|
||||
Event, Mmio, Packet, Result, SchemeBlockMut,
|
||||
PAGE_SIZE,
|
||||
@@ -278,13 +279,7 @@ fn daemon(daemon: redox_daemon::Daemon) -> ! {
|
||||
ptr: NonNull::new(address as *mut u8).expect("Physmapping BAR gave nullptr"),
|
||||
});
|
||||
|
||||
let socket_fd = libredox::call::open(
|
||||
&format!(":{}", scheme_name),
|
||||
flag::O_RDWR | flag::O_CREAT | flag::O_CLOEXEC,
|
||||
0,
|
||||
)
|
||||
.expect("nvmed: failed to create disk scheme");
|
||||
let mut socket_file = unsafe { File::from_raw_fd(socket_fd as RawFd) };
|
||||
let socket = Socket::<V2>::create(&scheme_name).expect("nvmed: failed to create disk scheme");
|
||||
|
||||
daemon.ready().expect("nvmed: failed to signal readiness");
|
||||
|
||||
@@ -306,27 +301,24 @@ fn daemon(daemon: redox_daemon::Daemon) -> ! {
|
||||
let mut scheme = DiskScheme::new(scheme_name, nvme, namespaces);
|
||||
let mut todo = Vec::new();
|
||||
loop {
|
||||
let mut packet = Packet::default();
|
||||
match socket_file.read(&mut packet) {
|
||||
Ok(0) => {
|
||||
// TODO: Use a proper event queue once interrupt support is back.
|
||||
match socket.next_request(SignalBehavior::Restart).expect("nvmed: failed to read disk scheme") {
|
||||
None => {
|
||||
break;
|
||||
},
|
||||
Ok(_) => {
|
||||
todo.push(packet);
|
||||
},
|
||||
Err(err) => match err.kind() {
|
||||
ErrorKind::WouldBlock => break,
|
||||
_ => Err(err).expect("nvmed: failed to read disk scheme"),
|
||||
},
|
||||
Some(req) => if let RequestKind::Call(c) = req.kind() {
|
||||
todo.push(c);
|
||||
} else {
|
||||
// TODO: cancellation
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
let mut i = 0;
|
||||
while i < todo.len() {
|
||||
if let Some(a) = scheme.handle(&todo[i]) {
|
||||
let mut packet = todo.remove(i);
|
||||
packet.a = a;
|
||||
socket_file
|
||||
.write(&packet)
|
||||
if let Some(resp) = todo[i].handle_scheme_block_mut(&mut scheme) {
|
||||
let _req = todo.remove(i);
|
||||
socket.write_response(resp, SignalBehavior::Restart)
|
||||
.expect("nvmed: failed to write disk scheme");
|
||||
} else {
|
||||
i += 1;
|
||||
|
||||
@@ -7,9 +7,10 @@ use std::sync::Arc;
|
||||
use std::{cmp, str};
|
||||
|
||||
use syscall::{
|
||||
Error, Io, Result, SchemeBlockMut, Stat, EACCES, EBADF, EINVAL, EISDIR, ENOENT, ENOLCK,
|
||||
EOVERFLOW, MODE_DIR, MODE_FILE, O_DIRECTORY, O_STAT, SEEK_CUR, SEEK_END, SEEK_SET,
|
||||
Error, Io, Result, Stat, EACCES, EBADF, EINVAL, EISDIR, ENOENT, ENOLCK, EOVERFLOW, MODE_DIR,
|
||||
MODE_FILE, O_DIRECTORY, O_STAT, SEEK_CUR, SEEK_END, SEEK_SET,
|
||||
};
|
||||
use redox_scheme::SchemeBlockMut;
|
||||
|
||||
use crate::nvme::{Nvme, NvmeNamespace};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user