This repository was archived by the owner on Jul 17, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 19
Expand file tree
/
Copy pathdelete.rs
More file actions
80 lines (67 loc) · 2.48 KB
/
delete.rs
File metadata and controls
80 lines (67 loc) · 2.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
// Copyright © 2021 University of Colorado. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0 OR MIT
use alloc::string::String;
use abomonation::{decode, encode, unsafe_abomonate, Abomonation};
use core2::io::Result as IOResult;
use core2::io::Write;
use rpc::rpc::*;
use crate::error::{KError, KResult};
use crate::fallible_string::TryString;
use crate::fs::cnrfs;
use super::super::fileops::get_str_from_payload;
use super::super::kernelrpc::*;
use super::FileIO;
use crate::arch::rackscale::CLIENT_STATE;
#[derive(Debug)]
pub(crate) struct DeleteReq {
pub pid: usize,
}
unsafe_abomonate!(DeleteReq: pid);
pub(crate) fn rpc_delete(pid: usize, pathname: String) -> KResult<(u64, u64)> {
log::debug!("Delete({:?})", pathname);
// Construct request data
let req = DeleteReq { pid };
let mut req_data = [0u8; core::mem::size_of::<DeleteReq>()];
unsafe { encode(&req, &mut (&mut req_data).as_mut()) }
.expect("Failed to encode delete request");
// Create buffer for result
let mut res_data = [0u8; core::mem::size_of::<KResult<(u64, u64)>>()];
// Call RPC
CLIENT_STATE.rpc_clients[kpi::system::mtid_from_gtid(*crate::environment::CORE_ID)]
.lock()
.call(
KernelRpc::Delete as RPCType,
&[&req_data, &pathname.as_bytes()],
&mut [&mut res_data],
)?;
// Decode result - return result if decoding successful
if let Some((res, remaining)) = unsafe { decode::<KResult<(u64, u64)>>(&mut res_data) } {
if remaining.len() > 0 {
return Err(KError::from(RPCError::ExtraData));
}
log::debug!("Delete() {:?}", res);
return *res;
} else {
return Err(KError::from(RPCError::MalformedResponse));
}
}
// RPC Handler function for delete() RPCs in the controller
pub(crate) fn handle_delete(hdr: &mut RPCHeader, payload: &mut [u8]) -> Result<(), RPCError> {
// Parse request
let pid = match unsafe { decode::<DeleteReq>(payload) } {
Some((req, _)) => req.pid,
None => {
log::error!("Invalid payload for request: {:?}", hdr);
construct_error_ret(hdr, payload, KError::from(RPCError::MalformedRequest));
return Ok(());
}
};
let ret = get_str_from_payload(
payload,
core::mem::size_of::<DeleteReq>(),
hdr.msg_len as usize,
)
.and_then(|path_string| cnrfs::MlnrKernelNode::file_delete(pid, path_string));
construct_ret(hdr, payload, ret);
Ok(())
}