xref: /DragonOS/kernel/src/driver/base/block/disk_info.rs (revision 9fa0e95eeed8630a8a69c874090af2f10e8eee02)
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