kernel/device/block/
mod.rs

1use 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
12/// Block device interface
13/// 
14/// This trait defines the interface for block devices.
15/// It provides methods for querying device information and handling I/O requests.
16pub trait BlockDevice: Device {
17    /// Get the device identifier
18    fn get_id(&self) -> usize;
19    
20    /// Get the disk name
21    fn get_disk_name(&self) -> &'static str;
22    
23    /// Get the disk size in bytes
24    fn get_disk_size(&self) -> usize;
25    
26    /// Enqueue a block I/O request
27    fn enqueue_request(&mut self, request: Box<BlockIORequest>);
28    
29    /// Process all queued requests
30    /// 
31    /// # Returns
32    /// 
33    /// A vector of results for all processed requests
34    fn process_requests(&mut self) -> Vec<BlockIOResult>;
35}
36
37/// A generic implementation of a block device
38pub 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;