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