scheme-utils: Panic on scheme EOF

EOF used to be triggered by unmounting a scheme, but this is no longer
the case since namespaces got moved to userspace. Unmounting now only
closes the scheme root fd.
This commit is contained in:
bjorn3
2026-04-15 22:13:06 +02:00
parent a5018ca37e
commit a2bc1dd79c
7 changed files with 47 additions and 143 deletions
+10 -8
View File
@@ -31,15 +31,16 @@ impl<'sock> ReadinessBased<'sock> {
state: SchemeState::new(),
}
}
pub fn read_and_process_requests(&mut self, scheme: &mut impl SchemeSync) -> Result<bool> {
pub fn read_and_process_requests(&mut self, scheme: &mut impl SchemeSync) -> Result<()> {
assert!(self.requests_read.is_empty());
match self
.socket
.read_requests(&mut self.requests_read, SignalBehavior::Interrupt)
{
// TODO: write ECANCELED or similar for everything in self.states?
Ok(()) if self.requests_read.is_empty() => return Ok(false), // EOF
Ok(()) if self.requests_read.is_empty() => {
unreachable!("blocking scheme read failed to read anything");
}
Ok(())
| Err(Error {
errno: errno::EINTR | errno::EWOULDBLOCK | errno::EAGAIN,
@@ -113,7 +114,7 @@ impl<'sock> ReadinessBased<'sock> {
self.responses_to_write.push_back(resp);
}
Ok(true)
Ok(())
}
// TODO: Doesn't scale. Instead, provide an API for some form of queue.
// TODO: panic if id isn't present?
@@ -175,17 +176,18 @@ impl<'sock> ReadinessBased<'sock> {
self.ready_queue.extend(self.states.keys().copied());
self.poll_ready_requests(scheme)
}
pub fn write_responses(&mut self) -> Result<bool> {
pub fn write_responses(&mut self) -> Result<()> {
match self
.socket
.write_responses(&mut self.responses_to_write, SignalBehavior::Restart)
{
// TODO: write ECANCELED or similar for everything in self.states?
//Ok(()) if !self.responses_to_write.is_empty() => Ok(false), // EOF, FIXME
Ok(()) if !self.responses_to_write.is_empty() => {
panic!("failed to write all scheme responses");
}
Ok(())
| Err(Error {
errno: errno::EINTR | errno::EWOULDBLOCK | errno::EAGAIN,
}) => Ok(true),
}) => Ok(()),
Err(err) => return Err(LError::from(err).into()),
}
}