1b087521eSChiichen #![allow(dead_code)] 2b087521eSChiichen use alloc::sync::{Arc, Weak}; 3*9fa0e95eSLoGin use system_error::SystemError; 4b087521eSChiichen 5*9fa0e95eSLoGin use super::block_device::{BlockDevice, GeneralBlockRange}; 6b087521eSChiichen 7b087521eSChiichen pub type SectorT = u64; 8b087521eSChiichen 9b087521eSChiichen /// @brief: 磁盘的分区信息 - (保留了c版本的数据信息) 10b087521eSChiichen #[derive(Debug)] 11b087521eSChiichen pub struct Partition { 12b087521eSChiichen pub start_sector: SectorT, // 该分区的起始扇区 13b087521eSChiichen pub lba_start: u64, // 起始LBA号 14b087521eSChiichen pub sectors_num: u64, // 该分区的扇区数 15*9fa0e95eSLoGin disk: Option<Weak<dyn BlockDevice>>, // 当前分区所属的磁盘 16b087521eSChiichen pub partno: u16, // 在磁盘上的分区号 17b087521eSChiichen } 18b087521eSChiichen 19b087521eSChiichen /// @brief: 分区信息 - 成员函数 20b087521eSChiichen impl Partition { 21b087521eSChiichen /// @brief: 为 disk new 一个分区结构体 new( start_sector: SectorT, lba_start: u64, sectors_num: u64, disk: Weak<dyn BlockDevice>, partno: u16, ) -> Arc<Self>22b087521eSChiichen pub fn new( 23b087521eSChiichen start_sector: SectorT, 24b087521eSChiichen lba_start: u64, 25b087521eSChiichen sectors_num: u64, 26b087521eSChiichen disk: Weak<dyn BlockDevice>, 27b087521eSChiichen partno: u16, 28b087521eSChiichen ) -> Arc<Self> { 29b087521eSChiichen return Arc::new(Partition { 30b087521eSChiichen start_sector, 31b087521eSChiichen lba_start, 32b087521eSChiichen sectors_num, 33*9fa0e95eSLoGin disk: Some(disk), 34b087521eSChiichen partno, 35b087521eSChiichen }); 36b087521eSChiichen } 37b087521eSChiichen new_raw(start_sector: SectorT, lba_start: u64, sectors_num: u64, partno: u16) -> Self38*9fa0e95eSLoGin pub fn new_raw(start_sector: SectorT, lba_start: u64, sectors_num: u64, partno: u16) -> Self { 39*9fa0e95eSLoGin return Partition { 40*9fa0e95eSLoGin start_sector, 41*9fa0e95eSLoGin lba_start, 42*9fa0e95eSLoGin sectors_num, 43*9fa0e95eSLoGin disk: None, 44*9fa0e95eSLoGin partno, 45*9fa0e95eSLoGin }; 46*9fa0e95eSLoGin } 47*9fa0e95eSLoGin 48b087521eSChiichen /// @brief 获取当前分区所属的磁盘的Arc指针 49b087521eSChiichen #[inline] disk(&self) -> Arc<dyn BlockDevice>50b087521eSChiichen pub fn disk(&self) -> Arc<dyn BlockDevice> { 51*9fa0e95eSLoGin return self.disk.as_ref().unwrap().upgrade().unwrap(); 52*9fa0e95eSLoGin } 53*9fa0e95eSLoGin } 54*9fa0e95eSLoGin 55*9fa0e95eSLoGin impl TryInto<GeneralBlockRange> for Partition { 56*9fa0e95eSLoGin type Error = SystemError; 57*9fa0e95eSLoGin try_into(self) -> Result<GeneralBlockRange, Self::Error>58*9fa0e95eSLoGin fn try_into(self) -> Result<GeneralBlockRange, Self::Error> { 59*9fa0e95eSLoGin if let Some(range) = GeneralBlockRange::new( 60*9fa0e95eSLoGin self.lba_start as usize, 61*9fa0e95eSLoGin (self.lba_start + self.sectors_num) as usize, 62*9fa0e95eSLoGin ) { 63*9fa0e95eSLoGin return Ok(range); 64*9fa0e95eSLoGin } else { 65*9fa0e95eSLoGin return Err(SystemError::EINVAL); 66*9fa0e95eSLoGin } 67b087521eSChiichen } 68b087521eSChiichen } 69