1 #![allow(dead_code)]
2 use super::device::BlockDevice;
3 
4 use alloc::sync::{Arc, Weak};
5 
6 pub type SectorT = u64;
7 
8 pub const BLK_TYPE_AHCI: u64 = 0;
9 pub const DISK_NAME_LEN: usize = 32; // 磁盘名称的最大长度
10 pub const BLK_GF_AHCI: u16 = 1 << 0; // 定义blk_gendisk中的标志位
11 
12 /// @brief: 磁盘的分区信息 - (保留了c版本的数据信息)
13 #[derive(Debug)]
14 pub struct Partition {
15     pub start_sector: SectorT,   // 该分区的起始扇区
16     pub lba_start: u64,          // 起始LBA号
17     pub sectors_num: u64,        // 该分区的扇区数
18     disk: Weak<dyn BlockDevice>, // 当前分区所属的磁盘
19     pub partno: u16,             // 在磁盘上的分区号
20 
21                                  // struct block_device_request_queue *bd_queue; // 请求队列
22                                  // struct vfs_superblock_t *bd_superblock;      // 执行超级块的指针
23 }
24 
25 /// @brief: 分区信息 - 成员函数
26 impl Partition {
27     /// @brief: 为 disk new 一个分区结构体
new( start_sector: SectorT, lba_start: u64, sectors_num: u64, disk: Weak<dyn BlockDevice>, partno: u16, ) -> Arc<Self>28     pub fn new(
29         start_sector: SectorT,
30         lba_start: u64,
31         sectors_num: u64,
32         disk: Weak<dyn BlockDevice>,
33         partno: u16,
34     ) -> Arc<Self> {
35         return Arc::new(Partition {
36             start_sector,
37             lba_start,
38             sectors_num,
39             disk,
40             partno,
41         });
42     }
43 
44     /// @brief 获取当前分区所属的磁盘的Arc指针
45     #[inline]
disk(&self) -> Arc<dyn BlockDevice>46     pub fn disk(&self) -> Arc<dyn BlockDevice> {
47         return self.disk.upgrade().unwrap();
48     }
49 }
50