Remove unnecessary clones and pass CallerCtx to call()
This commit is contained in:
+68
-55
@@ -185,16 +185,15 @@ impl UserInner {
|
||||
|
||||
fn call(
|
||||
&self,
|
||||
ctx: CallerCtx,
|
||||
opcode: Opcode,
|
||||
args: impl Args,
|
||||
caller_responsible: &mut PageSpan,
|
||||
token: &mut CleanLockToken,
|
||||
) -> Result<usize> {
|
||||
let ctx = { context::current().read(token.token()).caller_ctx() };
|
||||
match self.call_extended(ctx, None, opcode, args, caller_responsible, token)? {
|
||||
Response::Regular(code, _) => Error::demux(code),
|
||||
Response::Fd(_) => Err(Error::new(EIO)),
|
||||
Response::MultipleFds(_) => Err(Error::new(EIO)),
|
||||
Response::Fd(_) | Response::MultipleFds(_) => Err(Error::new(EIO)),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1400,12 +1399,12 @@ impl KernelScheme for UserScheme {
|
||||
file: usize,
|
||||
path: &str,
|
||||
flags: usize,
|
||||
_ctx: CallerCtx,
|
||||
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(
|
||||
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(),
|
||||
@@ -1415,15 +1414,17 @@ impl KernelScheme for UserScheme {
|
||||
}
|
||||
|
||||
fn fsize(&self, file: usize, token: &mut CleanLockToken) -> Result<u64> {
|
||||
let inner = self.inner.clone();
|
||||
inner
|
||||
.call(Opcode::Fsize, [file], &mut PageSpan::empty(), token)
|
||||
let ctx = { context::current().read(token.token()).caller_ctx() };
|
||||
self.inner
|
||||
.call(ctx, Opcode::Fsize, [file], &mut PageSpan::empty(), token)
|
||||
.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(),
|
||||
@@ -1441,8 +1442,9 @@ impl KernelScheme for UserScheme {
|
||||
}
|
||||
}
|
||||
|
||||
let inner = self.inner.clone();
|
||||
inner.call(
|
||||
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(),
|
||||
@@ -1458,8 +1460,9 @@ impl KernelScheme for UserScheme {
|
||||
arg: usize,
|
||||
token: &mut CleanLockToken,
|
||||
) -> Result<usize> {
|
||||
let inner = self.inner.clone();
|
||||
inner.call(
|
||||
let ctx = { context::current().read(token.token()).caller_ctx() };
|
||||
self.inner.call(
|
||||
ctx,
|
||||
Opcode::Fcntl,
|
||||
[file, cmd, arg],
|
||||
&mut PageSpan::empty(),
|
||||
@@ -1473,9 +1476,10 @@ impl KernelScheme for UserScheme {
|
||||
flags: EventFlags,
|
||||
token: &mut CleanLockToken,
|
||||
) -> Result<EventFlags> {
|
||||
let inner = self.inner.clone();
|
||||
inner
|
||||
let ctx = { context::current().read(token.token()).caller_ctx() };
|
||||
self.inner
|
||||
.call(
|
||||
ctx,
|
||||
Opcode::Fevent,
|
||||
[file, flags.bits()],
|
||||
&mut PageSpan::empty(),
|
||||
@@ -1488,12 +1492,13 @@ impl KernelScheme for UserScheme {
|
||||
&self,
|
||||
file: usize,
|
||||
path: &str,
|
||||
_ctx: CallerCtx,
|
||||
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(),
|
||||
@@ -1506,12 +1511,12 @@ impl KernelScheme for UserScheme {
|
||||
&self,
|
||||
file: usize,
|
||||
path: &str,
|
||||
_ctx: CallerCtx,
|
||||
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(
|
||||
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(),
|
||||
@@ -1521,14 +1526,16 @@ impl KernelScheme for UserScheme {
|
||||
}
|
||||
|
||||
fn fsync(&self, file: usize, token: &mut CleanLockToken) -> Result<()> {
|
||||
let inner = self.inner.clone();
|
||||
inner.call(Opcode::Fsync, [file], &mut PageSpan::empty(), token)?;
|
||||
let ctx = { context::current().read(token.token()).caller_ctx() };
|
||||
self.inner
|
||||
.call(ctx, Opcode::Fsync, [file], &mut PageSpan::empty(), token)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn ftruncate(&self, file: usize, len: usize, token: &mut CleanLockToken) -> Result<()> {
|
||||
let inner = self.inner.clone();
|
||||
inner.call(
|
||||
let ctx = { context::current().read(token.token()).caller_ctx() };
|
||||
self.inner.call(
|
||||
ctx,
|
||||
Opcode::Ftruncate,
|
||||
[file, len],
|
||||
&mut PageSpan::empty(),
|
||||
@@ -1538,14 +1545,14 @@ impl KernelScheme for UserScheme {
|
||||
}
|
||||
|
||||
fn close(&self, id: usize, token: &mut CleanLockToken) -> Result<()> {
|
||||
let inner = self.inner.clone();
|
||||
if !inner.supports_on_close {
|
||||
let inner = self.inner.clone();
|
||||
inner.call(Opcode::Close, [id], &mut PageSpan::empty(), token)?;
|
||||
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)?;
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
inner.todo.send(
|
||||
self.inner.todo.send(
|
||||
Sqe {
|
||||
opcode: Opcode::CloseMsg as u8,
|
||||
sqe_flags: SqeFlags::empty(),
|
||||
@@ -1557,7 +1564,7 @@ impl KernelScheme for UserScheme {
|
||||
token,
|
||||
);
|
||||
|
||||
event::trigger(inner.root_id, inner.scheme_id.get(), EVENT_READ);
|
||||
event::trigger(self.inner.root_id, self.inner.scheme_id.get(), EVENT_READ);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
@@ -1594,9 +1601,10 @@ impl KernelScheme for UserScheme {
|
||||
}
|
||||
}
|
||||
fn kfpath(&self, file: usize, buf: UserSliceWo, token: &mut CleanLockToken) -> Result<usize> {
|
||||
let inner = self.inner.clone();
|
||||
let mut address = inner.capture_user(buf, token)?;
|
||||
let result = inner.call(
|
||||
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(),
|
||||
@@ -1615,10 +1623,11 @@ impl KernelScheme for UserScheme {
|
||||
_stored_flags: u32,
|
||||
token: &mut CleanLockToken,
|
||||
) -> Result<usize> {
|
||||
let inner = self.inner.clone();
|
||||
let ctx = { context::current().read(token.token()).caller_ctx() };
|
||||
|
||||
let mut address = inner.capture_user(buf, token)?;
|
||||
let result = inner.call(
|
||||
let mut address = self.inner.capture_user(buf, token)?;
|
||||
let result = self.inner.call(
|
||||
ctx,
|
||||
Opcode::Read,
|
||||
[
|
||||
file as u64,
|
||||
@@ -1644,10 +1653,11 @@ impl KernelScheme for UserScheme {
|
||||
_stored_flags: u32,
|
||||
token: &mut CleanLockToken,
|
||||
) -> Result<usize> {
|
||||
let inner = self.inner.clone();
|
||||
let ctx = { context::current().read(token.token()).caller_ctx() };
|
||||
|
||||
let mut address = inner.capture_user(buf, token)?;
|
||||
let result = inner.call(
|
||||
let mut address = self.inner.capture_user(buf, token)?;
|
||||
let result = self.inner.call(
|
||||
ctx,
|
||||
Opcode::Write,
|
||||
[
|
||||
file as u64,
|
||||
@@ -1669,9 +1679,10 @@ impl KernelScheme for UserScheme {
|
||||
buf: UserSliceRo,
|
||||
token: &mut CleanLockToken,
|
||||
) -> Result<usize> {
|
||||
let inner = self.inner.clone();
|
||||
let mut address = inner.capture_user(buf, token)?;
|
||||
let result = inner.call(
|
||||
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(),
|
||||
@@ -1688,13 +1699,14 @@ impl KernelScheme for UserScheme {
|
||||
opaque_id_start: u64,
|
||||
token: &mut CleanLockToken,
|
||||
) -> Result<usize> {
|
||||
let inner = self.inner.clone();
|
||||
let mut address = inner.capture_user(buf, token)?;
|
||||
let ctx = { context::current().read(token.token()).caller_ctx() };
|
||||
let mut address = self.inner.capture_user(buf, token)?;
|
||||
// TODO: Support passing the 16-byte record_len of the last dent, to make it possible to
|
||||
// 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 = inner.call(
|
||||
let result = self.inner.call(
|
||||
ctx,
|
||||
Opcode::Getdents,
|
||||
[
|
||||
file,
|
||||
@@ -1710,9 +1722,10 @@ impl KernelScheme for UserScheme {
|
||||
result
|
||||
}
|
||||
fn kfstat(&self, file: usize, stat: UserSliceWo, token: &mut CleanLockToken) -> Result<()> {
|
||||
let inner = self.inner.clone();
|
||||
let mut address = inner.capture_user(stat, token)?;
|
||||
let result = inner.call(
|
||||
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(),
|
||||
@@ -1722,9 +1735,10 @@ impl KernelScheme for UserScheme {
|
||||
result.map(|_| ())
|
||||
}
|
||||
fn kfstatvfs(&self, file: usize, stat: UserSliceWo, token: &mut CleanLockToken) -> Result<()> {
|
||||
let inner = self.inner.clone();
|
||||
let mut address = inner.capture_user(stat, token)?;
|
||||
let result = inner.call(
|
||||
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(),
|
||||
@@ -1741,9 +1755,8 @@ impl KernelScheme for UserScheme {
|
||||
_consume: bool,
|
||||
token: &mut CleanLockToken,
|
||||
) -> Result<usize> {
|
||||
let inner = self.inner.clone();
|
||||
|
||||
inner.fmap_inner(Arc::clone(addr_space), file, map, token)
|
||||
self.inner
|
||||
.fmap_inner(Arc::clone(addr_space), file, map, token)
|
||||
}
|
||||
fn kfunmap(
|
||||
&self,
|
||||
|
||||
Reference in New Issue
Block a user