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
81
82
83
84
85
86
87
88
89
90
91
use crate::protocol::node;
use crate::protocol::prelude::*;
#[cfg(test)]
mod forget_test;
pub struct ForgetRequest<'a> {
single: Option<ForgetNode>,
batch: &'a [ForgetNode],
}
impl ForgetRequest<'_> {
pub fn nodes(&self) -> &[ForgetNode] {
if let Some(ref n) = self.single {
return slice::from_ref(n);
}
return self.batch;
}
}
#[repr(C)]
#[derive(Debug)]
pub struct ForgetNode {
id: Option<node::NodeId>,
count: u64,
}
impl ForgetNode {
pub fn id(&self) -> Option<node::NodeId> {
self.id
}
pub fn count(&self) -> u64 {
self.count
}
}
impl<'a> fuse_io::DecodeRequest<'a> for ForgetRequest<'a> {
fn decode_request(
mut dec: fuse_io::RequestDecoder<'a>,
) -> io::Result<Self> {
let header = dec.header();
if header.opcode == fuse_kernel::FUSE_BATCH_FORGET {
let raw: &fuse_kernel::fuse_batch_forget_in = dec.next_sized()?;
let batch_size =
raw.count * size_of::<fuse_kernel::fuse_forget_one>() as u32;
let batch_bytes = dec.next_bytes(batch_size)?;
let batch = unsafe {
slice::from_raw_parts(
batch_bytes.as_ptr() as *const ForgetNode,
raw.count as usize,
)
};
return Ok(Self {
single: None,
batch,
});
}
debug_assert!(header.opcode == fuse_kernel::FUSE_FORGET);
let raw: &fuse_kernel::fuse_forget_in = dec.next_sized()?;
let node_id = try_node_id(header.nodeid)?;
Ok(Self {
single: Some(ForgetNode {
id: Some(node_id),
count: raw.nlookup,
}),
batch: &[],
})
}
}