xref: /DragonOS/kernel/src/driver/block/cache/cache_iter.rs (revision eb49bb993a39964f92494ec3effafed3fb9adfd8)
1*eb49bb99S曾俊 use crate::driver::base::block::block_device::BlockId;
2*eb49bb99S曾俊 
3*eb49bb99S曾俊 /// # 结构功能
4*eb49bb99S曾俊 /// 一个简单的结构体,是BlockIter的输出
5*eb49bb99S曾俊 #[derive(Debug)]
6*eb49bb99S曾俊 pub struct BlockData {
7*eb49bb99S曾俊     /// 表示单个块对应的lba_id
8*eb49bb99S曾俊     lba_id: BlockId,
9*eb49bb99S曾俊     /// 表示该块在buf中的起始地址,目前并没有作用(例如:若该块是第2个块,那么该数据成员值为2*BLOCK_SIZE)
10*eb49bb99S曾俊     _data_start_addr: BlockId,
11*eb49bb99S曾俊     /// 表示该块的大小
12*eb49bb99S曾俊     _block_size: usize,
13*eb49bb99S曾俊 }
14*eb49bb99S曾俊 
15*eb49bb99S曾俊 impl BlockData {
new(lba_id: BlockId, data_start_addr: BlockId, block_size: usize) -> Self16*eb49bb99S曾俊     pub fn new(lba_id: BlockId, data_start_addr: BlockId, block_size: usize) -> Self {
17*eb49bb99S曾俊         Self {
18*eb49bb99S曾俊             lba_id,
19*eb49bb99S曾俊             _data_start_addr: data_start_addr,
20*eb49bb99S曾俊             _block_size: block_size,
21*eb49bb99S曾俊         }
22*eb49bb99S曾俊     }
23*eb49bb99S曾俊     #[inline]
lba_id(&self) -> BlockId24*eb49bb99S曾俊     pub fn lba_id(&self) -> BlockId {
25*eb49bb99S曾俊         self.lba_id
26*eb49bb99S曾俊     }
27*eb49bb99S曾俊     #[inline]
_data_start_addr(&self) -> BlockId28*eb49bb99S曾俊     pub fn _data_start_addr(&self) -> BlockId {
29*eb49bb99S曾俊         self._data_start_addr
30*eb49bb99S曾俊     }
31*eb49bb99S曾俊     #[inline]
_block_size(&self) -> usize32*eb49bb99S曾俊     pub fn _block_size(&self) -> usize {
33*eb49bb99S曾俊         self._block_size
34*eb49bb99S曾俊     }
35*eb49bb99S曾俊 }
36*eb49bb99S曾俊 
37*eb49bb99S曾俊 /// # 结构功能
38*eb49bb99S曾俊 /// 块迭代器,它获取需求(起始块,连续块的个数),并将连续的块输出为单一的块(如你需要读取lba_id为10~20的连续块,它就可以输出10,11...,20的BlockData)
39*eb49bb99S曾俊 #[derive(Copy, Clone)]
40*eb49bb99S曾俊 pub struct BlockIter {
41*eb49bb99S曾俊     /// 表示起始块的lba_id
42*eb49bb99S曾俊     lba_id_start: BlockId,
43*eb49bb99S曾俊     /// 表示从起始块开始你需要读多少个块
44*eb49bb99S曾俊     count: usize,
45*eb49bb99S曾俊     /// 表示当前遍历到第几个块了
46*eb49bb99S曾俊     current: usize,
47*eb49bb99S曾俊     /// 规定块的大小
48*eb49bb99S曾俊     block_size: usize,
49*eb49bb99S曾俊 }
50*eb49bb99S曾俊 
51*eb49bb99S曾俊 impl BlockIter {
new(lba_id_start: BlockId, count: usize, block_size: usize) -> Self52*eb49bb99S曾俊     pub fn new(lba_id_start: BlockId, count: usize, block_size: usize) -> Self {
53*eb49bb99S曾俊         Self {
54*eb49bb99S曾俊             lba_id_start,
55*eb49bb99S曾俊             count,
56*eb49bb99S曾俊             block_size,
57*eb49bb99S曾俊             current: 0,
58*eb49bb99S曾俊         }
59*eb49bb99S曾俊     }
60*eb49bb99S曾俊 }
61*eb49bb99S曾俊 
62*eb49bb99S曾俊 impl Iterator for BlockIter {
63*eb49bb99S曾俊     type Item = BlockData;
64*eb49bb99S曾俊 
next(&mut self) -> Option<Self::Item>65*eb49bb99S曾俊     fn next(&mut self) -> Option<Self::Item> {
66*eb49bb99S曾俊         if self.current < self.count {
67*eb49bb99S曾俊             let ans = BlockData::new(
68*eb49bb99S曾俊                 self.lba_id_start + self.current,
69*eb49bb99S曾俊                 self.current * self.block_size,
70*eb49bb99S曾俊                 self.block_size,
71*eb49bb99S曾俊             );
72*eb49bb99S曾俊             self.current += 1;
73*eb49bb99S曾俊             Some(ans)
74*eb49bb99S曾俊         } else {
75*eb49bb99S曾俊             None
76*eb49bb99S曾俊         }
77*eb49bb99S曾俊     }
78*eb49bb99S曾俊 }
79*eb49bb99S曾俊 
80*eb49bb99S曾俊 /// # 结构功能
81*eb49bb99S曾俊 /// 表示缺块信息的数据结构,往往在读取的时候发现缺块并产生FailData,在插入的时候使用FailData
82*eb49bb99S曾俊 pub struct FailData {
83*eb49bb99S曾俊     /// 表示缺块的lba_id
84*eb49bb99S曾俊     lba_id: BlockId,
85*eb49bb99S曾俊     /// 表示缺块在buf中的位置,用于在insert的时候定位缺块数据的位置
86*eb49bb99S曾俊     index: usize,
87*eb49bb99S曾俊 }
88*eb49bb99S曾俊 
89*eb49bb99S曾俊 impl FailData {
new(lba_id: BlockId, index: usize) -> Self90*eb49bb99S曾俊     pub fn new(lba_id: BlockId, index: usize) -> Self {
91*eb49bb99S曾俊         FailData { lba_id, index }
92*eb49bb99S曾俊     }
93*eb49bb99S曾俊     #[inline]
lba_id(&self) -> BlockId94*eb49bb99S曾俊     pub fn lba_id(&self) -> BlockId {
95*eb49bb99S曾俊         self.lba_id
96*eb49bb99S曾俊     }
97*eb49bb99S曾俊     /// # 函数的功能
98*eb49bb99S曾俊     /// 该函数返回的是缺块在buf中的位置,比如:index=1,那么我们就应该取buf\[512..1024\]
index(&self) -> usize99*eb49bb99S曾俊     pub fn index(&self) -> usize {
100*eb49bb99S曾俊         self.index
101*eb49bb99S曾俊     }
102*eb49bb99S曾俊 }
103