Inline UserInner::call and rename call_extended to call

This commit is contained in:
bjorn3
2026-02-08 13:01:14 +01:00
parent 3d1188cf1e
commit 0576db1fb4
+206 -146
View File
@@ -193,18 +193,6 @@ impl UserInner {
}
fn call(
&self,
ctx: CallerCtx,
opcode: Opcode,
args: impl Args,
caller_responsible: &mut PageSpan,
token: &mut CleanLockToken,
) -> Result<usize> {
self.call_extended(ctx, None, opcode, args, caller_responsible, token)?
.as_regular()
}
fn call_extended(
&self,
ctx: CallerCtx,
fds: Option<Vec<Arc<RwLock<FileDescription>>>>,
@@ -214,7 +202,7 @@ impl UserInner {
token: &mut CleanLockToken,
) -> Result<Response> {
let next_id = self.next_id()?;
self.call_extended_inner(
self.call_inner(
fds,
Sqe {
opcode: opcode as u8,
@@ -233,7 +221,7 @@ impl UserInner {
)
}
fn call_extended_inner(
fn call_inner(
&self,
fds: Option<Vec<Arc<RwLock<FileDescription>>>>,
sqe: Sqe,
@@ -1051,7 +1039,7 @@ impl UserInner {
(context.pid, desc.description)
};
let response = self.call_extended_inner(
let response = self.call_inner(
None,
Sqe {
opcode: Opcode::MmapPrep as u8,
@@ -1367,9 +1355,8 @@ impl KernelScheme for UserScheme {
ctx: CallerCtx,
token: &mut CleanLockToken,
) -> Result<OpenResult> {
let inner = self.inner.clone();
let mut address = inner.copy_and_capture_tail(path.as_bytes(), token)?;
let result = inner.call_extended(
let mut address = self.inner.copy_and_capture_tail(path.as_bytes(), token)?;
let result = self.inner.call(
ctx,
None,
Opcode::OpenAt,
@@ -1402,33 +1389,46 @@ impl KernelScheme for UserScheme {
token: &mut CleanLockToken,
) -> Result<()> {
let mut address = self.inner.copy_and_capture_tail(path.as_bytes(), token)?;
self.inner.call(
ctx,
Opcode::UnlinkAt,
[file, address.base(), address.len(), flags],
address.span(),
token,
)?;
self.inner
.call(
ctx,
None,
Opcode::UnlinkAt,
[file, address.base(), address.len(), flags],
address.span(),
token,
)?
.as_regular()?;
Ok(())
}
fn fsize(&self, file: usize, token: &mut CleanLockToken) -> Result<u64> {
let ctx = { context::current().read(token.token()).caller_ctx() };
self.inner
.call(ctx, Opcode::Fsize, [file], &mut PageSpan::empty(), token)
.call(
ctx,
None,
Opcode::Fsize,
[file],
&mut PageSpan::empty(),
token,
)?
.as_regular()
.map(|o| o as u64)
}
fn fchmod(&self, file: usize, mode: u16, token: &mut CleanLockToken) -> Result<()> {
let ctx = { context::current().read(token.token()).caller_ctx() };
let inner = self.inner.clone();
inner.call(
ctx,
Opcode::Fchmod,
[file, mode as usize],
&mut PageSpan::empty(),
token,
)?;
self.inner
.call(
ctx,
None,
Opcode::Fchmod,
[file, mode as usize],
&mut PageSpan::empty(),
token,
)?
.as_regular()?;
Ok(())
}
@@ -1442,13 +1442,16 @@ impl KernelScheme for UserScheme {
}
let ctx = { context::current().read(token.token()).caller_ctx() };
self.inner.call(
ctx,
Opcode::Fchown,
[file, uid as usize, gid as usize],
&mut PageSpan::empty(),
token,
)?;
self.inner
.call(
ctx,
None,
Opcode::Fchown,
[file, uid as usize, gid as usize],
&mut PageSpan::empty(),
token,
)?
.as_regular()?;
Ok(())
}
@@ -1460,13 +1463,16 @@ impl KernelScheme for UserScheme {
token: &mut CleanLockToken,
) -> Result<usize> {
let ctx = { context::current().read(token.token()).caller_ctx() };
self.inner.call(
ctx,
Opcode::Fcntl,
[file, cmd, arg],
&mut PageSpan::empty(),
token,
)
self.inner
.call(
ctx,
None,
Opcode::Fcntl,
[file, cmd, arg],
&mut PageSpan::empty(),
token,
)?
.as_regular()
}
fn fevent(
@@ -1479,11 +1485,13 @@ impl KernelScheme for UserScheme {
self.inner
.call(
ctx,
None,
Opcode::Fevent,
[file, flags.bits()],
&mut PageSpan::empty(),
token,
)
)?
.as_regular()
.map(EventFlags::from_bits_truncate)
}
@@ -1494,15 +1502,17 @@ impl KernelScheme for UserScheme {
ctx: CallerCtx,
token: &mut CleanLockToken,
) -> Result<()> {
let inner = self.inner.clone();
let mut address = inner.copy_and_capture_tail(path.as_bytes(), token)?;
inner.call(
ctx,
Opcode::Flink,
[file, address.base(), address.len()],
address.span(),
token,
)?;
let mut address = self.inner.copy_and_capture_tail(path.as_bytes(), token)?;
self.inner
.call(
ctx,
None,
Opcode::Flink,
[file, address.base(), address.len()],
address.span(),
token,
)?
.as_regular()?;
Ok(())
}
@@ -1514,32 +1524,46 @@ impl KernelScheme for UserScheme {
token: &mut CleanLockToken,
) -> Result<()> {
let mut address = self.inner.copy_and_capture_tail(path.as_bytes(), token)?;
self.inner.call(
ctx,
Opcode::Frename,
[file, address.base(), address.len()],
address.span(),
token,
)?;
self.inner
.call(
ctx,
None,
Opcode::Frename,
[file, address.base(), address.len()],
address.span(),
token,
)?
.as_regular()?;
Ok(())
}
fn fsync(&self, file: usize, token: &mut CleanLockToken) -> Result<()> {
let ctx = { context::current().read(token.token()).caller_ctx() };
self.inner
.call(ctx, Opcode::Fsync, [file], &mut PageSpan::empty(), token)?;
.call(
ctx,
None,
Opcode::Fsync,
[file],
&mut PageSpan::empty(),
token,
)?
.as_regular()?;
Ok(())
}
fn ftruncate(&self, file: usize, len: usize, token: &mut CleanLockToken) -> Result<()> {
let ctx = { context::current().read(token.token()).caller_ctx() };
self.inner.call(
ctx,
Opcode::Ftruncate,
[file, len],
&mut PageSpan::empty(),
token,
)?;
self.inner
.call(
ctx,
None,
Opcode::Ftruncate,
[file, len],
&mut PageSpan::empty(),
token,
)?
.as_regular()?;
Ok(())
}
@@ -1547,7 +1571,15 @@ impl KernelScheme for UserScheme {
let ctx = { context::current().read(token.token()).caller_ctx() };
if !self.inner.supports_on_close {
self.inner
.call(ctx, Opcode::Close, [id], &mut PageSpan::empty(), token)?;
.call(
ctx,
None,
Opcode::Close,
[id],
&mut PageSpan::empty(),
token,
)?
.as_regular()?;
return Ok(());
}
@@ -1576,7 +1608,7 @@ impl KernelScheme for UserScheme {
) -> Result<OpenResult> {
let inner = self.inner.clone();
let mut address = inner.capture_user(buf, token)?;
let result = inner.call_extended(
let result = inner.call(
ctx,
None,
Opcode::Dup,
@@ -1602,13 +1634,17 @@ impl KernelScheme for UserScheme {
fn kfpath(&self, file: usize, buf: UserSliceWo, token: &mut CleanLockToken) -> Result<usize> {
let ctx = { context::current().read(token.token()).caller_ctx() };
let mut address = self.inner.capture_user(buf, token)?;
let result = self.inner.call(
ctx,
Opcode::Fpath,
[file, address.base(), address.len()],
address.span(),
token,
);
let result = self
.inner
.call(
ctx,
None,
Opcode::Fpath,
[file, address.base(), address.len()],
address.span(),
token,
)?
.as_regular();
address.release()?;
result
}
@@ -1625,19 +1661,23 @@ impl KernelScheme for UserScheme {
let ctx = { context::current().read(token.token()).caller_ctx() };
let mut address = self.inner.capture_user(buf, token)?;
let result = self.inner.call(
ctx,
Opcode::Read,
[
file as u64,
address.base() as u64,
address.len() as u64,
offset,
u64::from(call_flags),
],
address.span(),
token,
);
let result = self
.inner
.call(
ctx,
None,
Opcode::Read,
[
file as u64,
address.base() as u64,
address.len() as u64,
offset,
u64::from(call_flags),
],
address.span(),
token,
)?
.as_regular();
address.release()?;
result
@@ -1655,19 +1695,23 @@ impl KernelScheme for UserScheme {
let ctx = { context::current().read(token.token()).caller_ctx() };
let mut address = self.inner.capture_user(buf, token)?;
let result = self.inner.call(
ctx,
Opcode::Write,
[
file as u64,
address.base() as u64,
address.len() as u64,
offset,
u64::from(call_flags),
],
address.span(),
token,
);
let result = self
.inner
.call(
ctx,
None,
Opcode::Write,
[
file as u64,
address.base() as u64,
address.len() as u64,
offset,
u64::from(call_flags),
],
address.span(),
token,
)?
.as_regular();
address.release()?;
result
@@ -1680,13 +1724,17 @@ impl KernelScheme for UserScheme {
) -> Result<usize> {
let ctx = { context::current().read(token.token()).caller_ctx() };
let mut address = self.inner.capture_user(buf, token)?;
let result = self.inner.call(
ctx,
Opcode::Futimens,
[file, address.base(), address.len()],
address.span(),
token,
);
let result = self
.inner
.call(
ctx,
None,
Opcode::Futimens,
[file, address.base(), address.len()],
address.span(),
token,
)?
.as_regular();
address.release()?;
result
}
@@ -1704,45 +1752,57 @@ impl KernelScheme for UserScheme {
// iterate backwards without first interating forward? The last entry will contain the
// opaque id to pass to the next getdents. Since this field is small, this would fit in the
// extra_raw field of `Cqe`s.
let result = self.inner.call(
ctx,
Opcode::Getdents,
[
file,
address.base(),
address.len(),
header_size.into(),
opaque_id_start as usize,
],
address.span(),
token,
);
let result = self
.inner
.call(
ctx,
None,
Opcode::Getdents,
[
file,
address.base(),
address.len(),
header_size.into(),
opaque_id_start as usize,
],
address.span(),
token,
)?
.as_regular();
address.release()?;
result
}
fn kfstat(&self, file: usize, stat: UserSliceWo, token: &mut CleanLockToken) -> Result<()> {
let ctx = { context::current().read(token.token()).caller_ctx() };
let mut address = self.inner.capture_user(stat, token)?;
let result = self.inner.call(
ctx,
Opcode::Fstat,
[file, address.base(), address.len()],
address.span(),
token,
);
let result = self
.inner
.call(
ctx,
None,
Opcode::Fstat,
[file, address.base(), address.len()],
address.span(),
token,
)?
.as_regular();
address.release()?;
result.map(|_| ())
}
fn kfstatvfs(&self, file: usize, stat: UserSliceWo, token: &mut CleanLockToken) -> Result<()> {
let ctx = { context::current().read(token.token()).caller_ctx() };
let mut address = self.inner.capture_user(stat, token)?;
let result = self.inner.call(
ctx,
Opcode::Fstatvfs,
[file, address.base(), address.len()],
address.span(),
token,
);
let result = self
.inner
.call(
ctx,
None,
Opcode::Fstatvfs,
[file, address.base(), address.len()],
address.span(),
token,
)?
.as_regular();
address.release()?;
result.map(|_| ())
}
@@ -1768,7 +1828,7 @@ impl KernelScheme for UserScheme {
let inner = self.inner.clone();
let ctx = { context::current().read(token.token()).caller_ctx() };
let res = inner.call_extended(
let res = inner.call(
ctx,
None,
Opcode::Munmap,
@@ -1814,7 +1874,7 @@ impl KernelScheme for UserScheme {
dst[..len].copy_from_slice(&metadata[..len]);
}
inner
.call_extended_inner(None, sqe, address.span(), token)?
.call_inner(None, sqe, address.span(), token)?
.as_regular()
}
fn kfdwrite(
@@ -1836,7 +1896,7 @@ impl KernelScheme for UserScheme {
let ctx = { context::current().read(token.token()).caller_ctx() };
let len = descs.len();
inner
.call_extended(
.call(
ctx,
Some(descs),
Opcode::Sendfd,
@@ -1869,7 +1929,7 @@ impl KernelScheme for UserScheme {
let ctx = { context::current().read(token.token()).caller_ctx() };
let len = payload.len() / mem::size_of::<usize>();
let res = inner.call_extended(
let res = inner.call(
ctx,
None,
Opcode::Recvfd,