xref: /DragonOS/kernel/src/driver/base/block/block_device.rs (revision 9fa0e95eeed8630a8a69c874090af2f10e8eee02)
1b087521eSChiichen /// 引入Module
22eab6dd7S曾俊 use crate::driver::{
3eb49bb99S曾俊     base::{
4c566df45SLoGin         device::{
5c566df45SLoGin             device_number::{DeviceNumber, Major},
6c566df45SLoGin             Device, DeviceError, IdTable, BLOCKDEVS,
7c566df45SLoGin         },
8ae5ede03SLoGin         map::{
9ae5ede03SLoGin             DeviceStruct, DEV_MAJOR_DYN_END, DEV_MAJOR_DYN_EXT_END, DEV_MAJOR_DYN_EXT_START,
10c566df45SLoGin             DEV_MAJOR_HASH_SIZE, DEV_MAJOR_MAX,
11ae5ede03SLoGin         },
12ae5ede03SLoGin     },
13eb49bb99S曾俊     block::cache::{cached_block_device::BlockCache, BlockCacheError, BLOCK_SIZE},
14ae5ede03SLoGin };
1591e9d4abSLoGin 
16*9fa0e95eSLoGin use alloc::{string::String, sync::Arc, vec::Vec};
17*9fa0e95eSLoGin use core::{any::Any, fmt::Display, ops::Deref};
182eab6dd7S曾俊 use log::error;
1991e9d4abSLoGin use system_error::SystemError;
20b087521eSChiichen 
21*9fa0e95eSLoGin use super::{disk_info::Partition, gendisk::GenDisk, manager::BlockDevMeta};
22b087521eSChiichen 
23b087521eSChiichen /// 该文件定义了 Device 和 BlockDevice 的接口
24b087521eSChiichen /// Notice 设备错误码使用 Posix 规定的 int32_t 的错误码表示,而不是自己定义错误enum
25b087521eSChiichen 
26b087521eSChiichen // 使用方法:
27b087521eSChiichen // 假设 blk_dev 是块设备
28b087521eSChiichen // <blk_dev as Device>::read_at() 调用的是Device的函数
29b087521eSChiichen // <blk_dev as BlockDevice>::read_at() 调用的是BlockDevice的函数
30b087521eSChiichen 
31b087521eSChiichen /// 定义类型
32b087521eSChiichen pub type BlockId = usize;
33b087521eSChiichen 
34b087521eSChiichen /// 定义常量
35b087521eSChiichen pub const BLK_SIZE_LOG2_LIMIT: u8 = 12; // 设定块设备的块大小不能超过 1 << 12.
36b087521eSChiichen /// 在DragonOS中,我们认为磁盘的每个LBA大小均为512字节。(注意,文件系统的1个扇区可能事实上是多个LBA)
37b087521eSChiichen pub const LBA_SIZE: usize = 512;
38b087521eSChiichen 
39*9fa0e95eSLoGin #[derive(Debug, Clone, Copy)]
40*9fa0e95eSLoGin pub struct GeneralBlockRange {
41*9fa0e95eSLoGin     pub lba_start: usize,
42*9fa0e95eSLoGin     pub lba_end: usize,
43*9fa0e95eSLoGin }
44*9fa0e95eSLoGin 
45*9fa0e95eSLoGin impl GeneralBlockRange {
new(lba_start: usize, lba_end: usize) -> Option<Self>46*9fa0e95eSLoGin     pub fn new(lba_start: usize, lba_end: usize) -> Option<Self> {
47*9fa0e95eSLoGin         if lba_start >= lba_end {
48*9fa0e95eSLoGin             return None;
49*9fa0e95eSLoGin         }
50*9fa0e95eSLoGin         return Some(GeneralBlockRange { lba_start, lba_end });
51*9fa0e95eSLoGin     }
52*9fa0e95eSLoGin 
53*9fa0e95eSLoGin     #[inline]
len(&self) -> usize54*9fa0e95eSLoGin     pub fn len(&self) -> usize {
55*9fa0e95eSLoGin         return self.lba_end - self.lba_start;
56*9fa0e95eSLoGin     }
57*9fa0e95eSLoGin 
58*9fa0e95eSLoGin     /// 取交集
intersects_with(&self, rhs: &Self) -> Option<Self>59*9fa0e95eSLoGin     pub fn intersects_with(&self, rhs: &Self) -> Option<Self> {
60*9fa0e95eSLoGin         // 检查是否相交
61*9fa0e95eSLoGin         if self.lba_start <= rhs.lba_end && self.lba_end >= rhs.lba_start {
62*9fa0e95eSLoGin             // 计算相交部分的起始和结束 LBA
63*9fa0e95eSLoGin             let start = usize::max(self.lba_start, rhs.lba_start);
64*9fa0e95eSLoGin             let end = usize::min(self.lba_end, rhs.lba_end);
65*9fa0e95eSLoGin             // 返回相交部分
66*9fa0e95eSLoGin             GeneralBlockRange::new(start, end)
67*9fa0e95eSLoGin         } else {
68*9fa0e95eSLoGin             // 不相交,返回 None
69*9fa0e95eSLoGin             None
70*9fa0e95eSLoGin         }
71*9fa0e95eSLoGin     }
72*9fa0e95eSLoGin }
73*9fa0e95eSLoGin 
74b087521eSChiichen /// @brief 块设备的迭代器
75b087521eSChiichen /// @usage 某次操作读/写块设备的[L,R]范围内的字节,
76b087521eSChiichen ///        那么可以使用此结构体进行迭代遍历,每次调用next()返回一个BlockRange
77b087521eSChiichen pub struct BlockIter {
78b087521eSChiichen     pub begin: usize, // 迭代器的起始位置 -> 块设备的地址 (单位是字节)
79b087521eSChiichen     pub end: usize,
80b087521eSChiichen     pub blk_size_log2: u8,
81b087521eSChiichen     pub multiblock: bool, // 是否启用连续整块同时遍历
82b087521eSChiichen }
83b087521eSChiichen 
84b087521eSChiichen /// @brief Range搭配迭代器BlockIter使用,[L,R]区间被分割成多个小的Range
85b087521eSChiichen ///        Range要么是整块,要么是一块的某一部分
86b087521eSChiichen /// 细节: range = [begin, end) 左闭右开
87b087521eSChiichen pub struct BlockRange {
88b087521eSChiichen     pub lba_start: usize, // 起始块的lba_id
89b087521eSChiichen     pub lba_end: usize,   // 终止块的lba_id
90b087521eSChiichen     pub begin: usize, // 起始位置在块内的偏移量, 如果BlockIter启用Multiblock,则是多个块的偏移量
91b087521eSChiichen     pub end: usize,   // 结束位置在块内的偏移量,单位是字节
92b087521eSChiichen     pub blk_size_log2: u8,
93b087521eSChiichen }
94b087521eSChiichen 
95b087521eSChiichen impl BlockIter {
96b087521eSChiichen     #[allow(dead_code)]
new(start_addr: usize, end_addr: usize, blk_size_log2: u8) -> BlockIter97b087521eSChiichen     pub fn new(start_addr: usize, end_addr: usize, blk_size_log2: u8) -> BlockIter {
98b087521eSChiichen         return BlockIter {
99b087521eSChiichen             begin: start_addr,
100b087521eSChiichen             end: end_addr,
101b5b571e0SLoGin             blk_size_log2,
102b087521eSChiichen             multiblock: false,
103b087521eSChiichen         };
104b087521eSChiichen     }
new_multiblock(start_addr: usize, end_addr: usize, blk_size_log2: u8) -> BlockIter105b087521eSChiichen     pub fn new_multiblock(start_addr: usize, end_addr: usize, blk_size_log2: u8) -> BlockIter {
106b087521eSChiichen         return BlockIter {
107b087521eSChiichen             begin: start_addr,
108b087521eSChiichen             end: end_addr,
109b5b571e0SLoGin 
110b5b571e0SLoGin             blk_size_log2,
111b087521eSChiichen             multiblock: true,
112b087521eSChiichen         };
113b087521eSChiichen     }
114b087521eSChiichen 
115b087521eSChiichen     /// 获取下一个整块或者不完整的块
next_block(&mut self) -> BlockRange116b087521eSChiichen     pub fn next_block(&mut self) -> BlockRange {
117b087521eSChiichen         let blk_size_log2 = self.blk_size_log2;
118b087521eSChiichen         let blk_size = 1usize << self.blk_size_log2;
119b087521eSChiichen         let lba_id = self.begin / blk_size;
120b087521eSChiichen         let begin = self.begin % blk_size;
121b087521eSChiichen         let end = if lba_id == self.end / blk_size {
122b087521eSChiichen             self.end % blk_size
123b087521eSChiichen         } else {
124b087521eSChiichen             blk_size
125b087521eSChiichen         };
126b087521eSChiichen 
127b087521eSChiichen         self.begin += end - begin;
128b087521eSChiichen 
129b087521eSChiichen         return BlockRange {
130b087521eSChiichen             lba_start: lba_id,
131b087521eSChiichen             lba_end: lba_id + 1,
132b5b571e0SLoGin             begin,
133b5b571e0SLoGin             end,
134b5b571e0SLoGin             blk_size_log2,
135b087521eSChiichen         };
136b087521eSChiichen     }
137b087521eSChiichen 
138b087521eSChiichen     /// 如果能返回多个连续的整块,则返回;否则调用next_block()返回不完整的块
next_multiblock(&mut self) -> BlockRange139b087521eSChiichen     pub fn next_multiblock(&mut self) -> BlockRange {
140b087521eSChiichen         let blk_size_log2 = self.blk_size_log2;
141b087521eSChiichen         let blk_size = 1usize << self.blk_size_log2;
142b087521eSChiichen         let lba_start = self.begin / blk_size;
143b087521eSChiichen         let lba_end = self.end / blk_size;
144b087521eSChiichen 
145b087521eSChiichen         // 如果不是整块,先返回非整块的小部分
146b087521eSChiichen         if __bytes_to_lba(self.begin, blk_size)
147b087521eSChiichen             != __bytes_to_lba(self.begin + blk_size - 1, blk_size)
148b087521eSChiichen             || lba_start == lba_end
149b087521eSChiichen         {
150b087521eSChiichen             return self.next_block();
151b087521eSChiichen         }
152b087521eSChiichen 
153b087521eSChiichen         let begin = self.begin % blk_size; // 因为是多个整块,这里必然是0
154b087521eSChiichen         let end = __lba_to_bytes(lba_end, blk_size) - self.begin;
155b087521eSChiichen 
156b087521eSChiichen         self.begin += end - begin;
157b087521eSChiichen 
158b087521eSChiichen         return BlockRange {
159b5b571e0SLoGin             lba_start,
160b5b571e0SLoGin             lba_end,
161b5b571e0SLoGin             begin,
162b5b571e0SLoGin             end,
163b5b571e0SLoGin             blk_size_log2,
164b087521eSChiichen         };
165b087521eSChiichen     }
166b087521eSChiichen }
167b087521eSChiichen 
168b087521eSChiichen /// BlockIter 函数实现
169b087521eSChiichen impl Iterator for BlockIter {
170b087521eSChiichen     type Item = BlockRange;
171b087521eSChiichen 
next(&mut self) -> Option<<Self as Iterator>::Item>172b087521eSChiichen     fn next(&mut self) -> Option<<Self as Iterator>::Item> {
173b087521eSChiichen         if self.begin >= self.end {
174b087521eSChiichen             return None;
175b087521eSChiichen         }
176b087521eSChiichen         if self.multiblock {
177b087521eSChiichen             return Some(self.next_multiblock());
178b087521eSChiichen         } else {
179b087521eSChiichen             return Some(self.next_block());
180b087521eSChiichen         }
181b087521eSChiichen     }
182b087521eSChiichen }
183b087521eSChiichen 
184b087521eSChiichen /// BlockRange 函数实现
185b087521eSChiichen impl BlockRange {
186b087521eSChiichen     #[allow(dead_code)]
is_empty(&self) -> bool187b087521eSChiichen     pub fn is_empty(&self) -> bool {
188b087521eSChiichen         return self.end == self.begin;
189b087521eSChiichen     }
len(&self) -> usize190b087521eSChiichen     pub fn len(&self) -> usize {
191b087521eSChiichen         return self.end - self.begin;
192b087521eSChiichen     }
193b087521eSChiichen     /// 判断是不是整块
is_full(&self) -> bool194b087521eSChiichen     pub fn is_full(&self) -> bool {
195b087521eSChiichen         return self.len() == (1usize << self.blk_size_log2);
196b087521eSChiichen     }
197b087521eSChiichen     /// 判断是不是多个整块连在一起
is_multi(&self) -> bool198b087521eSChiichen     pub fn is_multi(&self) -> bool {
199b087521eSChiichen         return self.len() >= (1usize << self.blk_size_log2)
200b087521eSChiichen             && (self.len() % (1usize << self.blk_size_log2) == 0);
201b087521eSChiichen     }
202b087521eSChiichen     /// 获取 BlockRange 在块设备内部的起始位置 (单位是字节)
origin_begin(&self) -> usize203b087521eSChiichen     pub fn origin_begin(&self) -> usize {
204b087521eSChiichen         return (self.lba_start << self.blk_size_log2) + self.begin;
205b087521eSChiichen     }
206b087521eSChiichen     /// 获取 BlockRange 在块设备内部的结尾位置 (单位是字节)
origin_end(&self) -> usize207b087521eSChiichen     pub fn origin_end(&self) -> usize {
208b087521eSChiichen         return (self.lba_start << self.blk_size_log2) + self.end;
209b087521eSChiichen     }
210b087521eSChiichen }
211b087521eSChiichen 
212b087521eSChiichen /// 从字节地址转换到lba id
213b087521eSChiichen #[inline]
__bytes_to_lba(addr: usize, blk_size: usize) -> BlockId214b087521eSChiichen pub fn __bytes_to_lba(addr: usize, blk_size: usize) -> BlockId {
215b087521eSChiichen     return addr / blk_size;
216b087521eSChiichen }
217b087521eSChiichen 
218b087521eSChiichen /// 从lba id转换到字节地址, 返回lba_id的最左侧字节
219b087521eSChiichen #[inline]
__lba_to_bytes(lba_id: usize, blk_size: usize) -> BlockId220b087521eSChiichen pub fn __lba_to_bytes(lba_id: usize, blk_size: usize) -> BlockId {
221b087521eSChiichen     return lba_id * blk_size;
222b087521eSChiichen }
223b087521eSChiichen 
224*9fa0e95eSLoGin /// 块设备的名字
225*9fa0e95eSLoGin pub struct BlockDevName {
226*9fa0e95eSLoGin     name: Arc<String>,
227*9fa0e95eSLoGin     id: usize,
228*9fa0e95eSLoGin }
229*9fa0e95eSLoGin 
230*9fa0e95eSLoGin impl BlockDevName {
new(name: String, id: usize) -> Self231*9fa0e95eSLoGin     pub fn new(name: String, id: usize) -> Self {
232*9fa0e95eSLoGin         return BlockDevName {
233*9fa0e95eSLoGin             name: Arc::new(name),
234*9fa0e95eSLoGin             id,
235*9fa0e95eSLoGin         };
236*9fa0e95eSLoGin     }
237*9fa0e95eSLoGin 
238*9fa0e95eSLoGin     #[inline]
id(&self) -> usize239*9fa0e95eSLoGin     pub fn id(&self) -> usize {
240*9fa0e95eSLoGin         return self.id;
241*9fa0e95eSLoGin     }
242*9fa0e95eSLoGin }
243*9fa0e95eSLoGin 
244*9fa0e95eSLoGin impl core::fmt::Debug for BlockDevName {
fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result245*9fa0e95eSLoGin     fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
246*9fa0e95eSLoGin         return write!(f, "{}", self.name);
247*9fa0e95eSLoGin     }
248*9fa0e95eSLoGin }
249*9fa0e95eSLoGin 
250*9fa0e95eSLoGin impl Display for BlockDevName {
fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result251*9fa0e95eSLoGin     fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
252*9fa0e95eSLoGin         return write!(f, "{}", self.name);
253*9fa0e95eSLoGin     }
254*9fa0e95eSLoGin }
255*9fa0e95eSLoGin 
256*9fa0e95eSLoGin impl Clone for BlockDevName {
clone(&self) -> Self257*9fa0e95eSLoGin     fn clone(&self) -> Self {
258*9fa0e95eSLoGin         return BlockDevName {
259*9fa0e95eSLoGin             name: self.name.clone(),
260*9fa0e95eSLoGin             id: self.id,
261*9fa0e95eSLoGin         };
262*9fa0e95eSLoGin     }
263*9fa0e95eSLoGin }
264*9fa0e95eSLoGin 
265*9fa0e95eSLoGin impl core::hash::Hash for BlockDevName {
hash<H: core::hash::Hasher>(&self, state: &mut H)266*9fa0e95eSLoGin     fn hash<H: core::hash::Hasher>(&self, state: &mut H) {
267*9fa0e95eSLoGin         self.name.hash(state);
268*9fa0e95eSLoGin     }
269*9fa0e95eSLoGin }
270*9fa0e95eSLoGin 
271*9fa0e95eSLoGin impl Deref for BlockDevName {
272*9fa0e95eSLoGin     type Target = String;
273*9fa0e95eSLoGin 
deref(&self) -> &Self::Target274*9fa0e95eSLoGin     fn deref(&self) -> &Self::Target {
275*9fa0e95eSLoGin         return self.name.as_ref();
276*9fa0e95eSLoGin     }
277*9fa0e95eSLoGin }
278*9fa0e95eSLoGin 
279*9fa0e95eSLoGin impl PartialEq for BlockDevName {
eq(&self, other: &Self) -> bool280*9fa0e95eSLoGin     fn eq(&self, other: &Self) -> bool {
281*9fa0e95eSLoGin         return self.name == other.name;
282*9fa0e95eSLoGin     }
283*9fa0e95eSLoGin }
284*9fa0e95eSLoGin 
285*9fa0e95eSLoGin impl Eq for BlockDevName {}
286*9fa0e95eSLoGin 
287b087521eSChiichen /// @brief 块设备应该实现的操作
288b087521eSChiichen pub trait BlockDevice: Device {
289*9fa0e95eSLoGin     /// # dev_name
290*9fa0e95eSLoGin     /// 返回块设备的名字
dev_name(&self) -> &BlockDevName291*9fa0e95eSLoGin     fn dev_name(&self) -> &BlockDevName;
292*9fa0e95eSLoGin 
blkdev_meta(&self) -> &BlockDevMeta293*9fa0e95eSLoGin     fn blkdev_meta(&self) -> &BlockDevMeta;
294*9fa0e95eSLoGin 
295*9fa0e95eSLoGin     /// 获取设备的扇区范围
disk_range(&self) -> GeneralBlockRange296*9fa0e95eSLoGin     fn disk_range(&self) -> GeneralBlockRange;
297*9fa0e95eSLoGin 
298b087521eSChiichen     /// @brief: 在块设备中,从第lba_id_start个块开始,读取count个块数据,存放到buf中
299b087521eSChiichen     ///
300b087521eSChiichen     /// @parameter lba_id_start: 起始块
301b087521eSChiichen     /// @parameter count: 读取块的数量
302b087521eSChiichen     /// @parameter buf: 目标数组
303b087521eSChiichen     /// @return: 如果操作成功,返回 Ok(操作的长度) 其中单位是字节;
304b087521eSChiichen     ///          否则返回Err(错误码),其中错误码为负数;
305b087521eSChiichen     ///          如果操作异常,但是并没有检查出什么错误,将返回Err(已操作的长度)
read_at_sync( &self, lba_id_start: BlockId, count: usize, buf: &mut [u8], ) -> Result<usize, SystemError>306eb49bb99S曾俊     fn read_at_sync(
307b087521eSChiichen         &self,
308b087521eSChiichen         lba_id_start: BlockId,
309b087521eSChiichen         count: usize,
310b087521eSChiichen         buf: &mut [u8],
311b087521eSChiichen     ) -> Result<usize, SystemError>;
312b087521eSChiichen 
313b087521eSChiichen     /// @brief: 在块设备中,从第lba_id_start个块开始,把buf中的count个块数据,存放到设备中
314b087521eSChiichen     /// @parameter lba_id_start: 起始块
315b087521eSChiichen     /// @parameter count: 写入块的数量
316b087521eSChiichen     /// @parameter buf: 目标数组
317b087521eSChiichen     /// @return: 如果操作成功,返回 Ok(操作的长度) 其中单位是字节;
318b087521eSChiichen     ///          否则返回Err(错误码),其中错误码为负数;
319b087521eSChiichen     ///          如果操作异常,但是并没有检查出什么错误,将返回Err(已操作的长度)
write_at_sync( &self, lba_id_start: BlockId, count: usize, buf: &[u8], ) -> Result<usize, SystemError>320eb49bb99S曾俊     fn write_at_sync(
321b087521eSChiichen         &self,
322b087521eSChiichen         lba_id_start: BlockId,
323b087521eSChiichen         count: usize,
324b087521eSChiichen         buf: &[u8],
325b087521eSChiichen     ) -> Result<usize, SystemError>;
326b087521eSChiichen 
327b087521eSChiichen     /// @brief: 同步磁盘信息,把所有的dirty数据写回硬盘 - 待实现
sync(&self) -> Result<(), SystemError>328b087521eSChiichen     fn sync(&self) -> Result<(), SystemError>;
329b087521eSChiichen 
330b087521eSChiichen     /// @brief: 每个块设备都必须固定自己块大小,而且该块大小必须是2的幂次
331b087521eSChiichen     /// @return: 返回一个固定量,硬编码(编程的时候固定的常量).
blk_size_log2(&self) -> u8332b087521eSChiichen     fn blk_size_log2(&self) -> u8;
333b087521eSChiichen 
334b087521eSChiichen     // TODO: 待实现 open, close
335b087521eSChiichen 
336b087521eSChiichen     /// @brief 本函数用于实现动态转换。
337b087521eSChiichen     /// 具体的文件系统在实现本函数时,最简单的方式就是:直接返回self
as_any_ref(&self) -> &dyn Any338b087521eSChiichen     fn as_any_ref(&self) -> &dyn Any;
339b087521eSChiichen 
340b087521eSChiichen     /// @brief 本函数用于将BlockDevice转换为Device。
341b087521eSChiichen     /// 由于实现了BlockDevice的结构体,本身也实现了Device Trait, 因此转换是可能的。
342b087521eSChiichen     /// 思路:在BlockDevice的结构体中新增一个self_ref变量,返回self_ref.upgrade()即可。
device(&self) -> Arc<dyn Device>343b087521eSChiichen     fn device(&self) -> Arc<dyn Device>;
344b087521eSChiichen 
345b087521eSChiichen     /// @brief 返回块设备的块大小(单位:字节)
block_size(&self) -> usize346b087521eSChiichen     fn block_size(&self) -> usize;
347b087521eSChiichen 
348b087521eSChiichen     /// @brief 返回当前磁盘上的所有分区的Arc指针数组
partitions(&self) -> Vec<Arc<Partition>>349b087521eSChiichen     fn partitions(&self) -> Vec<Arc<Partition>>;
350b087521eSChiichen 
351eb49bb99S曾俊     /// # 函数的功能
352eb49bb99S曾俊     /// 经由Cache对块设备的读操作
read_at( &self, lba_id_start: BlockId, count: usize, buf: &mut [u8], ) -> Result<usize, SystemError>353eb49bb99S曾俊     fn read_at(
354eb49bb99S曾俊         &self,
355eb49bb99S曾俊         lba_id_start: BlockId,
356eb49bb99S曾俊         count: usize,
357eb49bb99S曾俊         buf: &mut [u8],
358eb49bb99S曾俊     ) -> Result<usize, SystemError> {
359eb49bb99S曾俊         self.cache_read(lba_id_start, count, buf)
360eb49bb99S曾俊     }
361eb49bb99S曾俊 
362eb49bb99S曾俊     /// # 函数的功能
363eb49bb99S曾俊     ///  经由Cache对块设备的写操作
write_at( &self, lba_id_start: BlockId, count: usize, buf: &[u8], ) -> Result<usize, SystemError>364eb49bb99S曾俊     fn write_at(
365eb49bb99S曾俊         &self,
366eb49bb99S曾俊         lba_id_start: BlockId,
367eb49bb99S曾俊         count: usize,
368eb49bb99S曾俊         buf: &[u8],
369eb49bb99S曾俊     ) -> Result<usize, SystemError> {
370eb49bb99S曾俊         self.cache_write(lba_id_start, count, buf)
371eb49bb99S曾俊     }
372eb49bb99S曾俊 
373eb49bb99S曾俊     /// # 函数的功能
374eb49bb99S曾俊     /// 其功能对外而言和read_at函数完全一致,但是加入blockcache的功能
cache_read( &self, lba_id_start: BlockId, count: usize, buf: &mut [u8], ) -> Result<usize, SystemError>375eb49bb99S曾俊     fn cache_read(
376eb49bb99S曾俊         &self,
377eb49bb99S曾俊         lba_id_start: BlockId,
378eb49bb99S曾俊         count: usize,
379eb49bb99S曾俊         buf: &mut [u8],
380eb49bb99S曾俊     ) -> Result<usize, SystemError> {
381eb49bb99S曾俊         let cache_response = BlockCache::read(lba_id_start, count, buf);
382eb49bb99S曾俊         if let Err(e) = cache_response {
383eb49bb99S曾俊             match e {
384eb49bb99S曾俊                 BlockCacheError::StaticParameterError => {
385eb49bb99S曾俊                     BlockCache::init();
386eb49bb99S曾俊                     let ans = self.read_at_sync(lba_id_start, count, buf)?;
387eb49bb99S曾俊                     return Ok(ans);
388eb49bb99S曾俊                 }
389eb49bb99S曾俊                 BlockCacheError::BlockFaultError(fail_vec) => {
390eb49bb99S曾俊                     let ans = self.read_at_sync(lba_id_start, count, buf)?;
391eb49bb99S曾俊                     let _ = BlockCache::insert(fail_vec, buf);
392eb49bb99S曾俊                     return Ok(ans);
393eb49bb99S曾俊                 }
394eb49bb99S曾俊                 _ => {
395eb49bb99S曾俊                     let ans = self.read_at_sync(lba_id_start, count, buf)?;
396eb49bb99S曾俊                     return Ok(ans);
397eb49bb99S曾俊                 }
398eb49bb99S曾俊             }
399eb49bb99S曾俊         } else {
400eb49bb99S曾俊             return Ok(count * BLOCK_SIZE);
401eb49bb99S曾俊         }
402eb49bb99S曾俊     }
403eb49bb99S曾俊 
404eb49bb99S曾俊     /// # 函数功能
405eb49bb99S曾俊     /// 其功能对外而言和write_at函数完全一致,但是加入blockcache的功能
cache_write( &self, lba_id_start: BlockId, count: usize, buf: &[u8], ) -> Result<usize, SystemError>406eb49bb99S曾俊     fn cache_write(
407eb49bb99S曾俊         &self,
408eb49bb99S曾俊         lba_id_start: BlockId,
409eb49bb99S曾俊         count: usize,
410eb49bb99S曾俊         buf: &[u8],
411eb49bb99S曾俊     ) -> Result<usize, SystemError> {
412eb49bb99S曾俊         let _cache_response = BlockCache::immediate_write(lba_id_start, count, buf);
413eb49bb99S曾俊         self.write_at_sync(lba_id_start, count, buf)
414eb49bb99S曾俊     }
415eb49bb99S曾俊 
write_at_bytes(&self, offset: usize, len: usize, buf: &[u8]) -> Result<usize, SystemError>416b087521eSChiichen     fn write_at_bytes(&self, offset: usize, len: usize, buf: &[u8]) -> Result<usize, SystemError> {
417b087521eSChiichen         if len > buf.len() {
418b087521eSChiichen             return Err(SystemError::E2BIG);
419b087521eSChiichen         }
420b087521eSChiichen 
421b087521eSChiichen         let iter = BlockIter::new_multiblock(offset, offset + len, self.blk_size_log2());
422b087521eSChiichen         let multi = iter.multiblock;
423b087521eSChiichen 
424b087521eSChiichen         for range in iter {
425b087521eSChiichen             let buf_begin = range.origin_begin() - offset; // 本次读操作的起始位置/已经读了这么多字节
426b087521eSChiichen             let buf_end = range.origin_end() - offset;
427b087521eSChiichen             let buf_slice = &buf[buf_begin..buf_end];
428b5b571e0SLoGin             let count: usize = range.lba_end - range.lba_start;
429b087521eSChiichen             let full = multi && range.is_multi() || !multi && range.is_full();
430b087521eSChiichen 
431b087521eSChiichen             if full {
432b087521eSChiichen                 self.write_at(range.lba_start, count, buf_slice)?;
433b087521eSChiichen             } else {
434b087521eSChiichen                 if self.blk_size_log2() > BLK_SIZE_LOG2_LIMIT {
435b087521eSChiichen                     return Err(SystemError::E2BIG);
436b087521eSChiichen                 }
437b087521eSChiichen 
438b5b571e0SLoGin                 let mut temp = vec![0; 1usize << self.blk_size_log2()];
439b087521eSChiichen                 // 由于块设备每次读写都是整块的,在不完整写入之前,必须把不完整的地方补全
4400facf623SLoGin                 self.read_at(range.lba_start, 1, &mut temp[..])?;
441b087521eSChiichen                 // 把数据从临时buffer复制到目标buffer
442b5b571e0SLoGin                 temp[range.begin..range.end].copy_from_slice(buf_slice);
443b087521eSChiichen                 self.write_at(range.lba_start, 1, &temp[..])?;
444b087521eSChiichen             }
445b087521eSChiichen         }
446b087521eSChiichen         return Ok(len);
447b087521eSChiichen     }
448b087521eSChiichen 
read_at_bytes( &self, offset: usize, len: usize, buf: &mut [u8], ) -> Result<usize, SystemError>449b087521eSChiichen     fn read_at_bytes(
450b087521eSChiichen         &self,
451b087521eSChiichen         offset: usize,
452b087521eSChiichen         len: usize,
453b087521eSChiichen         buf: &mut [u8],
454b087521eSChiichen     ) -> Result<usize, SystemError> {
455b087521eSChiichen         if len > buf.len() {
456b087521eSChiichen             return Err(SystemError::E2BIG);
457b087521eSChiichen         }
458b087521eSChiichen 
459b087521eSChiichen         let iter = BlockIter::new_multiblock(offset, offset + len, self.blk_size_log2());
460b087521eSChiichen         let multi = iter.multiblock;
461b087521eSChiichen 
462b087521eSChiichen         // 枚举每一个range
463b087521eSChiichen         for range in iter {
464b087521eSChiichen             let buf_begin = range.origin_begin() - offset; // 本次读操作的起始位置/已经读了这么多字节
465b087521eSChiichen             let buf_end = range.origin_end() - offset;
466b087521eSChiichen             let buf_slice = &mut buf[buf_begin..buf_end];
467b5b571e0SLoGin             let count: usize = range.lba_end - range.lba_start;
468b087521eSChiichen             let full = multi && range.is_multi() || !multi && range.is_full();
469b087521eSChiichen 
4701effcfe5SGnoCiYeH             // 读取整个block作为有效数据
471b087521eSChiichen             if full {
472b087521eSChiichen                 // 调用 BlockDevice::read_at() 直接把引用传进去,不是把整个数组move进去
4731effcfe5SGnoCiYeH                 self.read_at(range.lba_start, count, buf_slice)?;
474b087521eSChiichen             } else {
475b087521eSChiichen                 // 判断块的长度不能超过最大值
476b087521eSChiichen                 if self.blk_size_log2() > BLK_SIZE_LOG2_LIMIT {
477b087521eSChiichen                     return Err(SystemError::E2BIG);
478b087521eSChiichen                 }
479b087521eSChiichen 
480b5b571e0SLoGin                 let mut temp = vec![0; 1usize << self.blk_size_log2()];
481b087521eSChiichen                 self.read_at(range.lba_start, 1, &mut temp[..])?;
482b087521eSChiichen 
483b087521eSChiichen                 // 把数据从临时buffer复制到目标buffer
484b087521eSChiichen                 buf_slice.copy_from_slice(&temp[range.begin..range.end]);
485b087521eSChiichen             }
486b087521eSChiichen         }
487b087521eSChiichen         return Ok(len);
488b087521eSChiichen     }
489*9fa0e95eSLoGin 
490*9fa0e95eSLoGin     /// # gendisk注册成功的回调函数
callback_gendisk_registered(&self, _gendisk: &Arc<GenDisk>) -> Result<(), SystemError>491*9fa0e95eSLoGin     fn callback_gendisk_registered(&self, _gendisk: &Arc<GenDisk>) -> Result<(), SystemError> {
492*9fa0e95eSLoGin         Ok(())
493*9fa0e95eSLoGin     }
494b087521eSChiichen }
495ae5ede03SLoGin 
496ae5ede03SLoGin /// @brief 块设备框架函数集
497ae5ede03SLoGin pub struct BlockDeviceOps;
498ae5ede03SLoGin 
499ae5ede03SLoGin impl BlockDeviceOps {
500ae5ede03SLoGin     /// @brief: 主设备号转下标
501ae5ede03SLoGin     /// @parameter: major: 主设备号
502ae5ede03SLoGin     /// @return: 返回下标
503ae5ede03SLoGin     #[allow(dead_code)]
major_to_index(major: Major) -> usize504c566df45SLoGin     fn major_to_index(major: Major) -> usize {
505b5b571e0SLoGin         return (major.data() % DEV_MAJOR_HASH_SIZE) as usize;
506ae5ede03SLoGin     }
507ae5ede03SLoGin 
508ae5ede03SLoGin     /// @brief: 动态获取主设备号
509ae5ede03SLoGin     /// @parameter: None
510ae5ede03SLoGin     /// @return: 如果成功,返回主设备号,否则,返回错误码
511ae5ede03SLoGin     #[allow(dead_code)]
find_dynamic_major() -> Result<Major, SystemError>512c566df45SLoGin     fn find_dynamic_major() -> Result<Major, SystemError> {
513ae5ede03SLoGin         let blockdevs = BLOCKDEVS.lock();
514ae5ede03SLoGin         // 寻找主设备号为234~255的设备
515c566df45SLoGin         for index in ((DEV_MAJOR_DYN_END.data())..DEV_MAJOR_HASH_SIZE).rev() {
516c566df45SLoGin             if let Some(item) = blockdevs.get(index as usize) {
517ae5ede03SLoGin                 if item.is_empty() {
518c566df45SLoGin                     return Ok(Major::new(index)); // 返回可用的主设备号
519ae5ede03SLoGin                 }
520ae5ede03SLoGin             }
521ae5ede03SLoGin         }
522ae5ede03SLoGin         // 寻找主设备号在384~511的设备
523c566df45SLoGin         for index in
524c566df45SLoGin             ((DEV_MAJOR_DYN_EXT_END.data() + 1)..(DEV_MAJOR_DYN_EXT_START.data() + 1)).rev()
525c566df45SLoGin         {
526b5b571e0SLoGin             if let Some(blockdevss) = blockdevs.get(Self::major_to_index(Major::new(index))) {
527ae5ede03SLoGin                 let mut flag = true;
528ae5ede03SLoGin                 for item in blockdevss {
529b5b571e0SLoGin                     if item.device_number().major() == Major::new(index) {
530ae5ede03SLoGin                         flag = false;
531ae5ede03SLoGin                         break;
532ae5ede03SLoGin                     }
533ae5ede03SLoGin                 }
534ae5ede03SLoGin                 if flag {
535ae5ede03SLoGin                     // 如果数组中不存在主设备号等于index的设备
536c566df45SLoGin                     return Ok(Major::new(index)); // 返回可用的主设备号
537ae5ede03SLoGin                 }
538ae5ede03SLoGin             }
539ae5ede03SLoGin         }
540ae5ede03SLoGin         return Err(SystemError::EBUSY);
541ae5ede03SLoGin     }
542ae5ede03SLoGin 
543ae5ede03SLoGin     /// @brief: 注册设备号,该函数需要指定主设备号
544ae5ede03SLoGin     /// @parameter: from: 主设备号
545ae5ede03SLoGin     ///             count: 次设备号数量
546ae5ede03SLoGin     ///             name: 字符设备名
547ae5ede03SLoGin     /// @return: 如果注册成功,返回设备号,否则,返回错误码
548ae5ede03SLoGin     #[allow(dead_code)]
register_blockdev_region( from: DeviceNumber, count: u32, name: &'static str, ) -> Result<DeviceNumber, SystemError>549ae5ede03SLoGin     pub fn register_blockdev_region(
550ae5ede03SLoGin         from: DeviceNumber,
551c566df45SLoGin         count: u32,
552ae5ede03SLoGin         name: &'static str,
553ae5ede03SLoGin     ) -> Result<DeviceNumber, SystemError> {
554ae5ede03SLoGin         Self::__register_blockdev_region(from, count, name)
555ae5ede03SLoGin     }
556ae5ede03SLoGin 
557ae5ede03SLoGin     /// @brief: 注册设备号,该函数自动分配主设备号
558ae5ede03SLoGin     /// @parameter: baseminor: 主设备号
559ae5ede03SLoGin     ///             count: 次设备号数量
560ae5ede03SLoGin     ///             name: 字符设备名
561ae5ede03SLoGin     /// @return: 如果注册成功,返回,否则,返回false
562ae5ede03SLoGin     #[allow(dead_code)]
alloc_blockdev_region( baseminor: u32, count: u32, name: &'static str, ) -> Result<DeviceNumber, SystemError>563ae5ede03SLoGin     pub fn alloc_blockdev_region(
564c566df45SLoGin         baseminor: u32,
565c566df45SLoGin         count: u32,
566ae5ede03SLoGin         name: &'static str,
567ae5ede03SLoGin     ) -> Result<DeviceNumber, SystemError> {
568c566df45SLoGin         Self::__register_blockdev_region(
569c566df45SLoGin             DeviceNumber::new(Major::UNNAMED_MAJOR, baseminor),
570c566df45SLoGin             count,
571c566df45SLoGin             name,
572c566df45SLoGin         )
573ae5ede03SLoGin     }
574ae5ede03SLoGin 
575ae5ede03SLoGin     /// @brief: 注册设备号
576ae5ede03SLoGin     /// @parameter: device_number: 设备号,主设备号如果为0,则动态分配
577ae5ede03SLoGin     ///             minorct: 次设备号数量
578ae5ede03SLoGin     ///             name: 字符设备名
579ae5ede03SLoGin     /// @return: 如果注册成功,返回设备号,否则,返回错误码
__register_blockdev_region( device_number: DeviceNumber, minorct: u32, name: &'static str, ) -> Result<DeviceNumber, SystemError>580ae5ede03SLoGin     fn __register_blockdev_region(
581ae5ede03SLoGin         device_number: DeviceNumber,
582c566df45SLoGin         minorct: u32,
583ae5ede03SLoGin         name: &'static str,
584ae5ede03SLoGin     ) -> Result<DeviceNumber, SystemError> {
585ae5ede03SLoGin         let mut major = device_number.major();
586ae5ede03SLoGin         let baseminor = device_number.minor();
587ae5ede03SLoGin         if major >= DEV_MAJOR_MAX {
5882eab6dd7S曾俊             error!(
589c566df45SLoGin                 "DEV {} major requested {:?} is greater than the maximum {}\n",
590ae5ede03SLoGin                 name,
591ae5ede03SLoGin                 major,
592c566df45SLoGin                 DEV_MAJOR_MAX.data() - 1
593ae5ede03SLoGin             );
594ae5ede03SLoGin         }
595c566df45SLoGin         if minorct > DeviceNumber::MINOR_MASK + 1 - baseminor {
5962eab6dd7S曾俊             error!("DEV {} minor range requested ({}-{}) is out of range of maximum range ({}-{}) for a single major\n",
597c566df45SLoGin                 name, baseminor, baseminor + minorct - 1, 0, DeviceNumber::MINOR_MASK);
598ae5ede03SLoGin         }
599c566df45SLoGin         let blockdev = DeviceStruct::new(DeviceNumber::new(major, baseminor), minorct, name);
600c566df45SLoGin         if major == Major::UNNAMED_MAJOR {
601ae5ede03SLoGin             // 如果主设备号为0,则自动分配主设备号
602ae5ede03SLoGin             major = Self::find_dynamic_major().expect("Find synamic major error.\n");
603ae5ede03SLoGin         }
604ae5ede03SLoGin         if let Some(items) = BLOCKDEVS.lock().get_mut(Self::major_to_index(major)) {
605ae5ede03SLoGin             let mut insert_index: usize = 0;
606ae5ede03SLoGin             for (index, item) in items.iter().enumerate() {
607ae5ede03SLoGin                 insert_index = index;
608ae5ede03SLoGin                 match item.device_number().major().cmp(&major) {
609ae5ede03SLoGin                     core::cmp::Ordering::Less => continue,
610ae5ede03SLoGin                     core::cmp::Ordering::Greater => {
611ae5ede03SLoGin                         break; // 大于则向后插入
612ae5ede03SLoGin                     }
613ae5ede03SLoGin                     core::cmp::Ordering::Equal => {
614ae5ede03SLoGin                         if item.device_number().minor() + item.minorct() <= baseminor {
615ae5ede03SLoGin                             continue; // 下一个主设备号大于或者次设备号大于被插入的次设备号最大值
616ae5ede03SLoGin                         }
617ae5ede03SLoGin                         if item.base_minor() >= baseminor + minorct {
618ae5ede03SLoGin                             break; // 在此处插入
619ae5ede03SLoGin                         }
620ae5ede03SLoGin                         return Err(SystemError::EBUSY); // 存在重合的次设备号
621ae5ede03SLoGin                     }
622ae5ede03SLoGin                 }
623ae5ede03SLoGin             }
624ae5ede03SLoGin             items.insert(insert_index, blockdev);
625ae5ede03SLoGin         }
626c566df45SLoGin 
627c566df45SLoGin         return Ok(DeviceNumber::new(major, baseminor));
628ae5ede03SLoGin     }
629ae5ede03SLoGin 
630ae5ede03SLoGin     /// @brief: 注销设备号
631ae5ede03SLoGin     /// @parameter: major: 主设备号,如果为0,动态分配
632ae5ede03SLoGin     ///             baseminor: 起始次设备号
633ae5ede03SLoGin     ///             minorct: 次设备号数量
634ae5ede03SLoGin     /// @return: 如果注销成功,返回(),否则,返回错误码
__unregister_blockdev_region( device_number: DeviceNumber, minorct: u32, ) -> Result<(), SystemError>635ae5ede03SLoGin     fn __unregister_blockdev_region(
636ae5ede03SLoGin         device_number: DeviceNumber,
637c566df45SLoGin         minorct: u32,
638ae5ede03SLoGin     ) -> Result<(), SystemError> {
639ae5ede03SLoGin         if let Some(items) = BLOCKDEVS
640ae5ede03SLoGin             .lock()
641ae5ede03SLoGin             .get_mut(Self::major_to_index(device_number.major()))
642ae5ede03SLoGin         {
643ae5ede03SLoGin             for (index, item) in items.iter().enumerate() {
644ae5ede03SLoGin                 if item.device_number() == device_number && item.minorct() == minorct {
645ae5ede03SLoGin                     // 设备号和数量都相等
646ae5ede03SLoGin                     items.remove(index);
647ae5ede03SLoGin                     return Ok(());
648ae5ede03SLoGin                 }
649ae5ede03SLoGin             }
650ae5ede03SLoGin         }
651ae5ede03SLoGin         return Err(SystemError::EBUSY);
652ae5ede03SLoGin     }
653ae5ede03SLoGin 
654ae5ede03SLoGin     /// @brief: 块设备注册
655ae5ede03SLoGin     /// @parameter: cdev: 字符设备实例
656ae5ede03SLoGin     ///             dev_t: 字符设备号
657ae5ede03SLoGin     ///             range: 次设备号范围
658ae5ede03SLoGin     /// @return: none
659ae5ede03SLoGin     #[allow(dead_code)]
bdev_add(_bdev: Arc<dyn BlockDevice>, id_table: IdTable) -> Result<(), DeviceError>66006d5e247SLoGin     pub fn bdev_add(_bdev: Arc<dyn BlockDevice>, id_table: IdTable) -> Result<(), DeviceError> {
661c566df45SLoGin         if id_table.device_number().data() == 0 {
6622eab6dd7S曾俊             error!("Device number can't be 0!\n");
663ae5ede03SLoGin         }
66406d5e247SLoGin         todo!("bdev_add")
66506d5e247SLoGin         // return device_manager().add_device(bdev.id_table(), bdev.device());
666ae5ede03SLoGin     }
667ae5ede03SLoGin 
668ae5ede03SLoGin     /// @brief: block设备注销
669ae5ede03SLoGin     /// @parameter: dev_t: 字符设备号
670ae5ede03SLoGin     ///             range: 次设备号范围
671ae5ede03SLoGin     /// @return: none
672ae5ede03SLoGin     #[allow(dead_code)]
bdev_del(_devnum: DeviceNumber, _range: usize)673ae5ede03SLoGin     pub fn bdev_del(_devnum: DeviceNumber, _range: usize) {
674ae5ede03SLoGin         unimplemented!();
675ae5ede03SLoGin     }
676ae5ede03SLoGin }
677