diff --git a/src/scheme/user.rs b/src/scheme/user.rs index 3e1ab7afc0..dff9040a60 100644 --- a/src/scheme/user.rs +++ b/src/scheme/user.rs @@ -185,16 +185,15 @@ impl UserInner { fn call( &self, + ctx: CallerCtx, opcode: Opcode, args: impl Args, caller_responsible: &mut PageSpan, token: &mut CleanLockToken, ) -> Result { - 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 { - 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 { - 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 { - 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 { - 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 { - 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 { - 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 { - 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 { - 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 { - 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,