kernel/device/block/
mod.rs1use core::any::Any;
2
3use alloc::{boxed::Box, vec::Vec};
4use request::{BlockIORequest, BlockIOResult};
5
6use super::Device;
7
8pub mod request;
9
10extern crate alloc;
11
12pub trait BlockDevice: Device {
17 fn get_id(&self) -> usize;
19
20 fn get_disk_name(&self) -> &'static str;
22
23 fn get_disk_size(&self) -> usize;
25
26 fn enqueue_request(&mut self, request: Box<BlockIORequest>);
28
29 fn process_requests(&mut self) -> Vec<BlockIOResult>;
35}
36
37pub struct GenericBlockDevice {
39 id: usize,
40 disk_name: &'static str,
41 disk_size: usize,
42 request_fn: fn(&mut BlockIORequest) -> Result<(), &'static str>,
43 request_queue: Vec<Box<BlockIORequest>>,
44}
45
46impl GenericBlockDevice {
47 pub fn new(id: usize, disk_name: &'static str, disk_size: usize, request_fn: fn(&mut BlockIORequest) -> Result<(), &'static str>) -> Self {
48 Self { id, disk_name, disk_size, request_fn, request_queue: Vec::new() }
49 }
50}
51
52impl Device for GenericBlockDevice {
53 fn device_type(&self) -> super::DeviceType {
54 super::DeviceType::Block
55 }
56
57 fn name(&self) -> &'static str {
58 self.disk_name
59 }
60
61 fn id(&self) -> usize {
62 self.id
63 }
64
65 fn as_any(&self) -> &dyn Any {
66 self
67 }
68
69 fn as_any_mut(&mut self) -> &mut dyn Any {
70 self
71 }
72
73 fn as_block_device(&mut self) -> Option<&mut dyn BlockDevice> {
74 Some(self)
75 }
76}
77
78impl BlockDevice for GenericBlockDevice {
79 fn get_id(&self) -> usize {
80 self.id
81 }
82
83 fn get_disk_name(&self) -> &'static str {
84 self.disk_name
85 }
86
87 fn get_disk_size(&self) -> usize {
88 self.disk_size
89 }
90
91 fn enqueue_request(&mut self, request: Box<BlockIORequest>) {
92 self.request_queue.push(request);
93 }
94
95 fn process_requests(&mut self) -> Vec<BlockIOResult> {
96 let mut results = Vec::new();
97
98 while let Some(mut request) = self.request_queue.pop() {
99 let result = (self.request_fn)(&mut *request);
100 results.push(BlockIOResult { request, result });
101 }
102
103 results
104 }
105}
106
107#[cfg(test)]
108mod tests;
109
110#[cfg(test)]
111pub mod mockblk;