fs.rs 65 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788
  1. #![allow(dead_code)]
  2. use core::intrinsics::unlikely;
  3. use core::{any::Any, fmt::Debug};
  4. use alloc::{
  5. collections::BTreeMap,
  6. string::String,
  7. sync::{Arc, Weak},
  8. vec::Vec,
  9. };
  10. use crate::filesystem::vfs::SpecialNodeData;
  11. use crate::ipc::pipe::LockedPipeInode;
  12. use crate::{
  13. driver::base::block::{block_device::LBA_SIZE, disk_info::Partition, SeekFrom},
  14. filesystem::vfs::{
  15. core::generate_inode_id,
  16. file::{FileMode, FilePrivateData},
  17. syscall::ModeType,
  18. FileSystem, FileType, IndexNode, InodeId, Metadata, PollStatus,
  19. },
  20. kerror,
  21. libs::{
  22. spinlock::{SpinLock, SpinLockGuard},
  23. vec_cursor::VecCursor,
  24. },
  25. syscall::SystemError,
  26. time::TimeSpec,
  27. };
  28. use super::entry::FATFile;
  29. use super::{
  30. bpb::{BiosParameterBlock, FATType},
  31. entry::{FATDir, FATDirEntry, FATDirIter, FATEntry},
  32. utils::RESERVED_CLUSTERS,
  33. };
  34. /// FAT32文件系统的最大的文件大小
  35. pub const MAX_FILE_SIZE: u64 = 0xffff_ffff;
  36. /// @brief 表示当前簇和上一个簇的关系的结构体
  37. /// 定义这样一个结构体的原因是,FAT文件系统的文件中,前后两个簇具有关联关系。
  38. #[derive(Debug, Clone, Copy, Default)]
  39. pub struct Cluster {
  40. pub cluster_num: u64,
  41. pub parent_cluster: u64,
  42. }
  43. impl PartialOrd for Cluster {
  44. /// @brief 根据当前簇号比较大小
  45. fn partial_cmp(&self, other: &Self) -> Option<core::cmp::Ordering> {
  46. return self.cluster_num.partial_cmp(&other.cluster_num);
  47. }
  48. }
  49. impl PartialEq for Cluster {
  50. /// @brief 根据当前簇号比较是否相等
  51. fn eq(&self, other: &Self) -> bool {
  52. self.cluster_num == other.cluster_num
  53. }
  54. }
  55. impl Eq for Cluster {}
  56. #[derive(Debug)]
  57. pub struct FATFileSystem {
  58. /// 当前文件系统所在的分区
  59. pub partition: Arc<Partition>,
  60. /// 当前文件系统的BOPB
  61. pub bpb: BiosParameterBlock,
  62. /// 当前文件系统的第一个数据扇区(相对分区开始位置)
  63. pub first_data_sector: u64,
  64. /// 文件系统信息结构体
  65. pub fs_info: Arc<LockedFATFsInfo>,
  66. /// 文件系统的根inode
  67. root_inode: Arc<LockedFATInode>,
  68. }
  69. /// FAT文件系统的Inode
  70. #[derive(Debug)]
  71. pub struct LockedFATInode(SpinLock<FATInode>);
  72. #[derive(Debug)]
  73. pub struct LockedFATFsInfo(SpinLock<FATFsInfo>);
  74. impl LockedFATFsInfo {
  75. #[inline]
  76. pub fn new(fs_info: FATFsInfo) -> Self {
  77. return Self(SpinLock::new(fs_info));
  78. }
  79. }
  80. #[derive(Debug)]
  81. pub struct FATInode {
  82. /// 指向父Inode的弱引用
  83. parent: Weak<LockedFATInode>,
  84. /// 指向自身的弱引用
  85. self_ref: Weak<LockedFATInode>,
  86. /// 子Inode的B树. 该数据结构用作缓存区。其中,它的key表示inode的名称。
  87. /// 请注意,由于FAT的查询过程对大小写不敏感,因此我们选择让key全部是大写的,方便统一操作。
  88. children: BTreeMap<String, Arc<LockedFATInode>>,
  89. /// 当前inode的元数据
  90. metadata: Metadata,
  91. /// 指向inode所在的文件系统对象的指针
  92. fs: Weak<FATFileSystem>,
  93. /// 根据不同的Inode类型,创建不同的私有字段
  94. inode_type: FATDirEntry,
  95. /// 若该节点是特殊文件节点,该字段则为真正的文件节点
  96. special_node: Option<SpecialNodeData>,
  97. }
  98. impl FATInode {
  99. /// @brief 更新当前inode的元数据
  100. pub fn update_metadata(&mut self) {
  101. // todo: 更新文件的访问时间等信息
  102. match &self.inode_type {
  103. FATDirEntry::File(f) | FATDirEntry::VolId(f) => {
  104. self.metadata.size = f.size() as i64;
  105. }
  106. FATDirEntry::Dir(d) => {
  107. self.metadata.size = d.size(&self.fs.upgrade().unwrap().clone()) as i64;
  108. }
  109. FATDirEntry::UnInit => {
  110. kerror!("update_metadata: Uninitialized FATDirEntry: {:?}", self);
  111. return;
  112. }
  113. };
  114. }
  115. fn find(&mut self, name: &str) -> Result<Arc<LockedFATInode>, SystemError> {
  116. match &self.inode_type {
  117. FATDirEntry::Dir(d) => {
  118. // 尝试在缓存区查找
  119. if let Some(entry) = self.children.get(&name.to_uppercase()) {
  120. return Ok(entry.clone());
  121. }
  122. // 在缓存区找不到
  123. // 在磁盘查找
  124. let fat_entry: FATDirEntry =
  125. d.find_entry(name, None, None, self.fs.upgrade().unwrap())?;
  126. // kdebug!("find entry from disk ok, entry={fat_entry:?}");
  127. // 创建新的inode
  128. let entry_inode: Arc<LockedFATInode> = LockedFATInode::new(
  129. self.fs.upgrade().unwrap(),
  130. self.self_ref.clone(),
  131. fat_entry,
  132. );
  133. // 加入缓存区, 由于FAT文件系统的大小写不敏感问题,因此存入缓存区的key应当是全大写的
  134. self.children
  135. .insert(name.to_uppercase(), entry_inode.clone());
  136. return Ok(entry_inode);
  137. }
  138. FATDirEntry::UnInit => {
  139. panic!(
  140. "Uninitialized FAT Inode, fs = {:?}, inode={self:?}",
  141. self.fs
  142. )
  143. }
  144. _ => {
  145. return Err(SystemError::ENOTDIR);
  146. }
  147. }
  148. }
  149. }
  150. impl LockedFATInode {
  151. pub fn new(
  152. fs: Arc<FATFileSystem>,
  153. parent: Weak<LockedFATInode>,
  154. inode_type: FATDirEntry,
  155. ) -> Arc<LockedFATInode> {
  156. let file_type = if let FATDirEntry::Dir(_) = inode_type {
  157. FileType::Dir
  158. } else {
  159. FileType::File
  160. };
  161. let inode: Arc<LockedFATInode> = Arc::new(LockedFATInode(SpinLock::new(FATInode {
  162. parent: parent,
  163. self_ref: Weak::default(),
  164. children: BTreeMap::new(),
  165. fs: Arc::downgrade(&fs),
  166. inode_type: inode_type,
  167. metadata: Metadata {
  168. dev_id: 0,
  169. inode_id: generate_inode_id(),
  170. size: 0,
  171. blk_size: fs.bpb.bytes_per_sector as usize,
  172. blocks: if let FATType::FAT32(_) = fs.bpb.fat_type {
  173. fs.bpb.total_sectors_32 as usize
  174. } else {
  175. fs.bpb.total_sectors_16 as usize
  176. },
  177. atime: TimeSpec::default(),
  178. mtime: TimeSpec::default(),
  179. ctime: TimeSpec::default(),
  180. file_type: file_type,
  181. mode: ModeType::from_bits_truncate(0o777),
  182. nlinks: 1,
  183. uid: 0,
  184. gid: 0,
  185. raw_dev: 0,
  186. },
  187. special_node: None,
  188. })));
  189. inode.0.lock().self_ref = Arc::downgrade(&inode);
  190. inode.0.lock().update_metadata();
  191. return inode;
  192. }
  193. }
  194. /// FsInfo结构体(内存中的一份拷贝,当卸载卷或者sync的时候,把它写入磁盘)
  195. #[derive(Debug)]
  196. pub struct FATFsInfo {
  197. /// Lead Signature - must equal 0x41615252
  198. lead_sig: u32,
  199. /// Value must equal 0x61417272
  200. struc_sig: u32,
  201. /// 空闲簇数目
  202. free_count: u32,
  203. /// 第一个空闲簇的位置(不一定准确,仅供加速查找)
  204. next_free: u32,
  205. /// 0xAA550000
  206. trail_sig: u32,
  207. /// Dirty flag to flush to disk
  208. dirty: bool,
  209. /// FsInfo Structure 在磁盘上的字节偏移量
  210. /// Not present for FAT12 and FAT16
  211. offset: Option<u64>,
  212. }
  213. impl FileSystem for FATFileSystem {
  214. fn root_inode(&self) -> Arc<dyn crate::filesystem::vfs::IndexNode> {
  215. return self.root_inode.clone();
  216. }
  217. fn info(&self) -> crate::filesystem::vfs::FsInfo {
  218. todo!()
  219. }
  220. /// @brief 本函数用于实现动态转换。
  221. /// 具体的文件系统在实现本函数时,最简单的方式就是:直接返回self
  222. fn as_any_ref(&self) -> &dyn Any {
  223. self
  224. }
  225. }
  226. impl FATFileSystem {
  227. /// FAT12允许的最大簇号
  228. pub const FAT12_MAX_CLUSTER: u32 = 0xFF5;
  229. /// FAT16允许的最大簇号
  230. pub const FAT16_MAX_CLUSTER: u32 = 0xFFF5;
  231. /// FAT32允许的最大簇号
  232. pub const FAT32_MAX_CLUSTER: u32 = 0x0FFFFFF7;
  233. pub fn new(partition: Arc<Partition>) -> Result<Arc<FATFileSystem>, SystemError> {
  234. let bpb = BiosParameterBlock::new(partition.clone())?;
  235. // 从磁盘上读取FAT32文件系统的FsInfo结构体
  236. let fs_info: FATFsInfo = match bpb.fat_type {
  237. FATType::FAT32(bpb32) => {
  238. let fs_info_in_disk_bytes_offset = partition.lba_start * LBA_SIZE as u64
  239. + bpb32.fs_info as u64 * bpb.bytes_per_sector as u64;
  240. FATFsInfo::new(
  241. partition.clone(),
  242. fs_info_in_disk_bytes_offset,
  243. bpb.bytes_per_sector as usize,
  244. )?
  245. }
  246. _ => FATFsInfo::default(),
  247. };
  248. // 根目录项占用的扇区数(向上取整)
  249. let root_dir_sectors: u64 = ((bpb.root_entries_cnt as u64 * 32)
  250. + (bpb.bytes_per_sector as u64 - 1))
  251. / (bpb.bytes_per_sector as u64);
  252. // FAT表大小(单位:扇区)
  253. let fat_size = if bpb.fat_size_16 != 0 {
  254. bpb.fat_size_16 as u64
  255. } else {
  256. match bpb.fat_type {
  257. FATType::FAT32(x) => x.fat_size_32 as u64,
  258. _ => {
  259. kerror!("FAT12 and FAT16 volumes should have non-zero BPB_FATSz16");
  260. return Err(SystemError::EINVAL);
  261. }
  262. }
  263. };
  264. let first_data_sector =
  265. bpb.rsvd_sec_cnt as u64 + (bpb.num_fats as u64 * fat_size) + root_dir_sectors;
  266. // 创建文件系统的根节点
  267. let root_inode: Arc<LockedFATInode> = Arc::new(LockedFATInode(SpinLock::new(FATInode {
  268. parent: Weak::default(),
  269. self_ref: Weak::default(),
  270. children: BTreeMap::new(),
  271. fs: Weak::default(),
  272. inode_type: FATDirEntry::UnInit,
  273. metadata: Metadata {
  274. dev_id: 0,
  275. inode_id: generate_inode_id(),
  276. size: 0,
  277. blk_size: bpb.bytes_per_sector as usize,
  278. blocks: if let FATType::FAT32(_) = bpb.fat_type {
  279. bpb.total_sectors_32 as usize
  280. } else {
  281. bpb.total_sectors_16 as usize
  282. },
  283. atime: TimeSpec::default(),
  284. mtime: TimeSpec::default(),
  285. ctime: TimeSpec::default(),
  286. file_type: FileType::Dir,
  287. mode: ModeType::from_bits_truncate(0o777),
  288. nlinks: 1,
  289. uid: 0,
  290. gid: 0,
  291. raw_dev: 0,
  292. },
  293. special_node: None,
  294. })));
  295. let result: Arc<FATFileSystem> = Arc::new(FATFileSystem {
  296. partition: partition,
  297. bpb,
  298. first_data_sector,
  299. fs_info: Arc::new(LockedFATFsInfo::new(fs_info)),
  300. root_inode: root_inode,
  301. });
  302. // 对root inode加锁,并继续完成初始化工作
  303. let mut root_guard: SpinLockGuard<FATInode> = result.root_inode.0.lock();
  304. root_guard.inode_type = FATDirEntry::Dir(result.root_dir());
  305. root_guard.parent = Arc::downgrade(&result.root_inode);
  306. root_guard.self_ref = Arc::downgrade(&result.root_inode);
  307. root_guard.fs = Arc::downgrade(&result);
  308. // 释放锁
  309. drop(root_guard);
  310. return Ok(result);
  311. }
  312. /// @brief 计算每个簇有多少个字节
  313. #[inline]
  314. pub fn bytes_per_cluster(&self) -> u64 {
  315. return (self.bpb.bytes_per_sector as u64) * (self.bpb.sector_per_cluster as u64);
  316. }
  317. /// @brief 读取当前簇在FAT表中存储的信息
  318. ///
  319. /// @param cluster 当前簇
  320. ///
  321. /// @return Ok(FATEntry) 当前簇在FAT表中,存储的信息。(详情见FATEntry的注释)
  322. /// @return Err(SystemError) 错误码
  323. pub fn get_fat_entry(&self, cluster: Cluster) -> Result<FATEntry, SystemError> {
  324. let current_cluster = cluster.cluster_num;
  325. if current_cluster < 2 {
  326. // 0号簇和1号簇是保留簇,不允许用户使用
  327. return Err(SystemError::EINVAL);
  328. }
  329. let fat_type: FATType = self.bpb.fat_type;
  330. // 获取FAT表的起始扇区(相对分区起始扇区的偏移量)
  331. let fat_start_sector = self.fat_start_sector();
  332. let bytes_per_sec = self.bpb.bytes_per_sector as u64;
  333. // cluster对应的FAT表项在分区内的字节偏移量
  334. let fat_bytes_offset =
  335. fat_type.get_fat_bytes_offset(cluster, fat_start_sector, bytes_per_sec);
  336. // FAT表项所在的LBA地址
  337. // let fat_ent_lba = self.get_lba_from_offset(self.bytes_to_sector(fat_bytes_offset));
  338. let fat_ent_lba = self.partition.lba_start + fat_bytes_offset / LBA_SIZE as u64;
  339. // FAT表项在逻辑块内的字节偏移量
  340. let blk_offset = self.get_in_block_offset(fat_bytes_offset);
  341. let mut v = Vec::<u8>::new();
  342. v.resize(self.bpb.bytes_per_sector as usize, 0);
  343. self.partition
  344. .disk()
  345. .read_at(fat_ent_lba as usize, 1 * self.lba_per_sector(), &mut v)?;
  346. let mut cursor = VecCursor::new(v);
  347. cursor.seek(SeekFrom::SeekSet(blk_offset as i64))?;
  348. let res: FATEntry = match self.bpb.fat_type {
  349. FATType::FAT12(_) => {
  350. let mut entry = cursor.read_u16()?;
  351. // 由于FAT12文件系统的FAT表,每个entry占用1.5字节,因此奇数的簇需要取高12位的值。
  352. if (current_cluster & 1) > 0 {
  353. entry >>= 4;
  354. } else {
  355. entry &= 0x0fff;
  356. }
  357. if entry == 0 {
  358. FATEntry::Unused
  359. } else if entry == 0x0ff7 {
  360. FATEntry::Bad
  361. } else if entry >= 0x0ff8 {
  362. FATEntry::EndOfChain
  363. } else {
  364. FATEntry::Next(Cluster {
  365. cluster_num: entry as u64,
  366. parent_cluster: current_cluster,
  367. })
  368. }
  369. }
  370. FATType::FAT16(_) => {
  371. let entry = cursor.read_u16()?;
  372. if entry == 0 {
  373. FATEntry::Unused
  374. } else if entry == 0xfff7 {
  375. FATEntry::Bad
  376. } else if entry >= 0xfff8 {
  377. FATEntry::EndOfChain
  378. } else {
  379. FATEntry::Next(Cluster {
  380. cluster_num: entry as u64,
  381. parent_cluster: current_cluster,
  382. })
  383. }
  384. }
  385. FATType::FAT32(_) => {
  386. let entry = cursor.read_u32()? & 0x0fffffff;
  387. match entry {
  388. _n if (current_cluster >= 0x0ffffff7 && current_cluster <= 0x0fffffff) => {
  389. // 当前簇号不是一个能被获得的簇(可能是文件系统出错了)
  390. kerror!("FAT32 get fat entry: current cluster number [{}] is not an allocatable cluster number.", current_cluster);
  391. FATEntry::Bad
  392. }
  393. 0 => FATEntry::Unused,
  394. 0x0ffffff7 => FATEntry::Bad,
  395. 0x0ffffff8..=0x0fffffff => FATEntry::EndOfChain,
  396. _n => FATEntry::Next(Cluster {
  397. cluster_num: entry as u64,
  398. parent_cluster: current_cluster,
  399. }),
  400. }
  401. }
  402. };
  403. return Ok(res);
  404. }
  405. /// @brief 读取当前簇在FAT表中存储的信息(直接返回读取到的值,而不加处理)
  406. ///
  407. /// @param cluster 当前簇
  408. ///
  409. /// @return Ok(u64) 当前簇在FAT表中,存储的信息。
  410. /// @return Err(SystemError) 错误码
  411. pub fn get_fat_entry_raw(&self, cluster: Cluster) -> Result<u64, SystemError> {
  412. let current_cluster = cluster.cluster_num;
  413. let fat_type: FATType = self.bpb.fat_type;
  414. // 获取FAT表的起始扇区(相对分区起始扇区的偏移量)
  415. let fat_start_sector = self.fat_start_sector();
  416. let bytes_per_sec = self.bpb.bytes_per_sector as u64;
  417. // cluster对应的FAT表项在分区内的字节偏移量
  418. let fat_bytes_offset =
  419. fat_type.get_fat_bytes_offset(cluster, fat_start_sector, bytes_per_sec);
  420. // FAT表项所在的LBA地址
  421. let fat_ent_lba = self.get_lba_from_offset(self.bytes_to_sector(fat_bytes_offset));
  422. // FAT表项在逻辑块内的字节偏移量
  423. let blk_offset = self.get_in_block_offset(fat_bytes_offset);
  424. let mut v = Vec::<u8>::new();
  425. v.resize(self.bpb.bytes_per_sector as usize, 0);
  426. self.partition
  427. .disk()
  428. .read_at(fat_ent_lba, 1 * self.lba_per_sector(), &mut v)?;
  429. let mut cursor = VecCursor::new(v);
  430. cursor.seek(SeekFrom::SeekSet(blk_offset as i64))?;
  431. let res = match self.bpb.fat_type {
  432. FATType::FAT12(_) => {
  433. let mut entry = cursor.read_u16()?;
  434. entry = if (current_cluster & 0x0001) > 0 {
  435. entry >> 4
  436. } else {
  437. entry & 0x0fff
  438. };
  439. entry as u64
  440. }
  441. FATType::FAT16(_) => {
  442. let entry = (cursor.read_u16()?) as u64;
  443. entry
  444. }
  445. FATType::FAT32(_) => {
  446. let entry = cursor.read_u32()? & 0x0fff_ffff;
  447. entry as u64
  448. }
  449. };
  450. return Ok(res);
  451. }
  452. /// @brief 获取当前文件系统的root inode,在磁盘上的字节偏移量
  453. pub fn root_dir_bytes_offset(&self) -> u64 {
  454. match self.bpb.fat_type {
  455. FATType::FAT32(s) => {
  456. let first_sec_cluster: u64 = (s.root_cluster as u64 - 2)
  457. * (self.bpb.sector_per_cluster as u64)
  458. + self.first_data_sector;
  459. return (self.get_lba_from_offset(first_sec_cluster) * LBA_SIZE) as u64;
  460. }
  461. _ => {
  462. let root_sec = (self.bpb.rsvd_sec_cnt as u64)
  463. + (self.bpb.num_fats as u64) * (self.bpb.fat_size_16 as u64);
  464. return (self.get_lba_from_offset(root_sec) * LBA_SIZE) as u64;
  465. }
  466. }
  467. }
  468. /// @brief 获取当前文件系统的根目录项区域的结束位置,在磁盘上的字节偏移量。
  469. /// 请注意,当前函数只对FAT12/FAT16生效。对于FAT32,返回None
  470. pub fn root_dir_end_bytes_offset(&self) -> Option<u64> {
  471. match self.bpb.fat_type {
  472. FATType::FAT12(_) | FATType::FAT16(_) => {
  473. return Some(
  474. self.root_dir_bytes_offset() + (self.bpb.root_entries_cnt as u64) * 32,
  475. );
  476. }
  477. _ => {
  478. return None;
  479. }
  480. }
  481. }
  482. /// @brief 获取簇在磁盘内的字节偏移量(相对磁盘起始位置。注意,不是分区内偏移量)
  483. pub fn cluster_bytes_offset(&self, cluster: Cluster) -> u64 {
  484. if cluster.cluster_num >= 2 {
  485. // 指定簇的第一个扇区号
  486. let first_sec_of_cluster = (cluster.cluster_num - 2)
  487. * (self.bpb.sector_per_cluster as u64)
  488. + self.first_data_sector;
  489. return (self.get_lba_from_offset(first_sec_of_cluster) * LBA_SIZE) as u64;
  490. } else {
  491. return 0;
  492. }
  493. }
  494. /// @brief 获取一个空闲簇
  495. ///
  496. /// @param prev_cluster 簇链的前一个簇。本函数将会把新获取的簇,连接到它的后面。
  497. ///
  498. /// @return Ok(Cluster) 新获取的空闲簇
  499. /// @return Err(SystemError) 错误码
  500. pub fn allocate_cluster(&self, prev_cluster: Option<Cluster>) -> Result<Cluster, SystemError> {
  501. let end_cluster: Cluster = self.max_cluster_number();
  502. let start_cluster: Cluster = match self.bpb.fat_type {
  503. FATType::FAT32(_) => {
  504. let next_free: u64 = match self.fs_info.0.lock().next_free() {
  505. Some(x) => x,
  506. None => 0xffffffff,
  507. };
  508. if next_free < end_cluster.cluster_num {
  509. Cluster::new(next_free)
  510. } else {
  511. Cluster::new(RESERVED_CLUSTERS as u64)
  512. }
  513. }
  514. _ => Cluster::new(RESERVED_CLUSTERS as u64),
  515. };
  516. // 寻找一个空的簇
  517. let free_cluster: Cluster = match self.get_free_cluster(start_cluster, end_cluster) {
  518. Ok(c) => c,
  519. Err(_) if start_cluster.cluster_num > RESERVED_CLUSTERS as u64 => {
  520. self.get_free_cluster(Cluster::new(RESERVED_CLUSTERS as u64), end_cluster)?
  521. }
  522. Err(e) => return Err(e),
  523. };
  524. self.set_entry(free_cluster, FATEntry::EndOfChain)?;
  525. // 减少空闲簇计数
  526. self.fs_info.0.lock().update_free_count_delta(-1);
  527. // 更新搜索空闲簇的参考量
  528. self.fs_info
  529. .0
  530. .lock()
  531. .update_next_free((free_cluster.cluster_num + 1) as u32);
  532. // 如果这个空闲簇不是簇链的第一个簇,那么把当前簇跟前一个簇连上。
  533. if let Some(prev_cluster) = prev_cluster {
  534. // kdebug!("set entry, prev ={prev_cluster:?}, next = {free_cluster:?}");
  535. self.set_entry(prev_cluster, FATEntry::Next(free_cluster))?;
  536. }
  537. // 清空新获取的这个簇
  538. self.zero_cluster(free_cluster)?;
  539. return Ok(free_cluster);
  540. }
  541. /// @brief 释放簇链上的所有簇
  542. ///
  543. /// @param start_cluster 簇链的第一个簇
  544. pub fn deallocate_cluster_chain(&self, start_cluster: Cluster) -> Result<(), SystemError> {
  545. let clusters: Vec<Cluster> = self.clusters(start_cluster);
  546. for c in clusters {
  547. self.deallocate_cluster(c)?;
  548. }
  549. return Ok(());
  550. }
  551. /// @brief 释放簇
  552. ///
  553. /// @param 要释放的簇
  554. pub fn deallocate_cluster(&self, cluster: Cluster) -> Result<(), SystemError> {
  555. let entry: FATEntry = self.get_fat_entry(cluster)?;
  556. // 如果不是坏簇
  557. if entry != FATEntry::Bad {
  558. self.set_entry(cluster, FATEntry::Unused)?;
  559. self.fs_info.0.lock().update_free_count_delta(1);
  560. // 安全选项:清空被释放的簇
  561. #[cfg(feature = "secure")]
  562. self.zero_cluster(cluster)?;
  563. return Ok(());
  564. } else {
  565. // 不能释放坏簇
  566. kerror!("Bad clusters cannot be freed.");
  567. return Err(SystemError::EFAULT);
  568. }
  569. }
  570. /// @brief 获取文件系统的根目录项
  571. pub fn root_dir(&self) -> FATDir {
  572. match self.bpb.fat_type {
  573. FATType::FAT32(s) => {
  574. return FATDir {
  575. first_cluster: Cluster::new(s.root_cluster as u64),
  576. dir_name: String::from("/"),
  577. root_offset: None,
  578. short_dir_entry: None,
  579. loc: None,
  580. };
  581. }
  582. _ => FATDir {
  583. first_cluster: Cluster::new(0),
  584. dir_name: String::from("/"),
  585. root_offset: Some(self.root_dir_bytes_offset()),
  586. short_dir_entry: None,
  587. loc: None,
  588. },
  589. }
  590. }
  591. /// @brief 获取FAT表的起始扇区(相对分区起始扇区的偏移量)
  592. pub fn fat_start_sector(&self) -> u64 {
  593. let active_fat = self.active_fat();
  594. let fat_size = self.fat_size();
  595. return self.bpb.rsvd_sec_cnt as u64 + active_fat * fat_size;
  596. }
  597. /// @brief 获取当前活动的FAT表
  598. pub fn active_fat(&self) -> u64 {
  599. if self.mirroring_enabled() {
  600. return 0;
  601. } else {
  602. match self.bpb.fat_type {
  603. FATType::FAT32(bpb32) => {
  604. return (bpb32.ext_flags & 0x0f) as u64;
  605. }
  606. _ => {
  607. return 0;
  608. }
  609. }
  610. }
  611. }
  612. /// @brief 获取当前文件系统的每个FAT表的大小
  613. pub fn fat_size(&self) -> u64 {
  614. if self.bpb.fat_size_16 != 0 {
  615. return self.bpb.fat_size_16 as u64;
  616. } else {
  617. match self.bpb.fat_type {
  618. FATType::FAT32(bpb32) => {
  619. return bpb32.fat_size_32 as u64;
  620. }
  621. _ => {
  622. panic!("FAT12 and FAT16 volumes should have non-zero BPB_FATSz16");
  623. }
  624. }
  625. }
  626. }
  627. /// @brief 判断当前文件系统是否启用了FAT表镜像
  628. pub fn mirroring_enabled(&self) -> bool {
  629. match self.bpb.fat_type {
  630. FATType::FAT32(bpb32) => {
  631. return (bpb32.ext_flags & 0x80) == 0;
  632. }
  633. _ => {
  634. return false;
  635. }
  636. }
  637. }
  638. /// @brief 根据分区内的扇区偏移量,获得在磁盘上的LBA地址
  639. #[inline]
  640. pub fn get_lba_from_offset(&self, in_partition_sec_offset: u64) -> usize {
  641. return (self.partition.lba_start
  642. + in_partition_sec_offset * (self.bpb.bytes_per_sector as u64 / LBA_SIZE as u64))
  643. as usize;
  644. }
  645. /// @brief 获取每个扇区占用多少个LBA
  646. #[inline]
  647. pub fn lba_per_sector(&self) -> usize {
  648. return self.bpb.bytes_per_sector as usize / LBA_SIZE;
  649. }
  650. /// @brief 将分区内字节偏移量转换为扇区偏移量
  651. #[inline]
  652. pub fn bytes_to_sector(&self, in_partition_bytes_offset: u64) -> u64 {
  653. return in_partition_bytes_offset / (self.bpb.bytes_per_sector as u64);
  654. }
  655. /// @brief 根据磁盘上的字节偏移量,获取对应位置在分区内的字节偏移量
  656. #[inline]
  657. pub fn get_in_partition_bytes_offset(&self, disk_bytes_offset: u64) -> u64 {
  658. return disk_bytes_offset - (self.partition.lba_start * LBA_SIZE as u64);
  659. }
  660. /// @brief 根据字节偏移量计算在逻辑块内的字节偏移量
  661. #[inline]
  662. pub fn get_in_block_offset(&self, bytes_offset: u64) -> u64 {
  663. return bytes_offset % LBA_SIZE as u64;
  664. }
  665. /// @brief 获取在FAT表中,以start_cluster开头的FAT链的所有簇的信息
  666. ///
  667. /// @param start_cluster 整个FAT链的起始簇号
  668. pub fn clusters(&self, start_cluster: Cluster) -> Vec<Cluster> {
  669. return self.cluster_iter(start_cluster).collect();
  670. }
  671. /// @brief 获取在FAT表中,以start_cluster开头的FAT链的长度(总计经过多少个簇)
  672. ///
  673. /// @param start_cluster 整个FAT链的起始簇号
  674. pub fn num_clusters_chain(&self, start_cluster: Cluster) -> u64 {
  675. return self
  676. .cluster_iter(start_cluster)
  677. .fold(0, |size, _cluster| size + 1);
  678. }
  679. /// @brief 获取一个簇迭代器对象
  680. ///
  681. /// @param start_cluster 整个FAT链的起始簇号
  682. fn cluster_iter(&self, start_cluster: Cluster) -> ClusterIter {
  683. return ClusterIter {
  684. current_cluster: Some(start_cluster),
  685. fs: self,
  686. };
  687. }
  688. /// @brief 获取从start_cluster开始的簇链中,第n个簇的信息。(请注意,下标从0开始)
  689. #[inline]
  690. pub fn get_cluster_by_relative(&self, start_cluster: Cluster, n: usize) -> Option<Cluster> {
  691. return self.cluster_iter(start_cluster).skip(n).next();
  692. }
  693. /// @brief 获取整个簇链的最后一个簇
  694. #[inline]
  695. pub fn get_last_cluster(&self, start_cluster: Cluster) -> Option<Cluster> {
  696. return self.cluster_iter(start_cluster).last();
  697. }
  698. /// @brief 判断FAT文件系统的shut bit是否正常。
  699. /// shut bit 表示文件系统是否正常卸载。如果这一位是1,则表示这个卷是“干净的”
  700. /// 参考资料:https://thestarman.pcministry.com/DOS/DirtyShutdownFlag.html
  701. ///
  702. /// @return Ok(true) 正常
  703. /// @return Ok(false) 不正常
  704. /// @return Err(SystemError) 在判断时发生错误
  705. pub fn is_shut_bit_ok(&mut self) -> Result<bool, SystemError> {
  706. match self.bpb.fat_type {
  707. FATType::FAT32(_) => {
  708. // 对于FAT32, error bit位于第一个扇区的第8字节。
  709. let bit = self.get_fat_entry_raw(Cluster::new(1))? & 0x0800_0000;
  710. return Ok(bit > 0);
  711. }
  712. FATType::FAT16(_) => {
  713. let bit = self.get_fat_entry_raw(Cluster::new(1))? & 0x8000;
  714. return Ok(bit > 0);
  715. }
  716. _ => return Ok(true),
  717. }
  718. }
  719. /// @brief 判断FAT文件系统的hard error bit是否正常。
  720. /// 如果此位为0,则文件系统驱动程序在上次安装卷时遇到磁盘 I/O 错误,这表明
  721. /// 卷上的某些扇区可能已损坏。
  722. /// 参考资料:https://thestarman.pcministry.com/DOS/DirtyShutdownFlag.html
  723. ///
  724. /// @return Ok(true) 正常
  725. /// @return Ok(false) 不正常
  726. /// @return Err(SystemError) 在判断时发生错误
  727. pub fn is_hard_error_bit_ok(&mut self) -> Result<bool, SystemError> {
  728. match self.bpb.fat_type {
  729. FATType::FAT32(_) => {
  730. let bit = self.get_fat_entry_raw(Cluster::new(1))? & 0x0400_0000;
  731. return Ok(bit > 0);
  732. }
  733. FATType::FAT16(_) => {
  734. let bit = self.get_fat_entry_raw(Cluster::new(1))? & 0x4000;
  735. return Ok(bit > 0);
  736. }
  737. _ => return Ok(true),
  738. }
  739. }
  740. /// @brief 设置文件系统的shut bit为正常状态
  741. /// 参考资料:https://thestarman.pcministry.com/DOS/DirtyShutdownFlag.html
  742. ///
  743. /// @return Ok(()) 设置成功
  744. /// @return Err(SystemError) 在设置过程中,出现错误
  745. pub fn set_shut_bit_ok(&mut self) -> Result<(), SystemError> {
  746. match self.bpb.fat_type {
  747. FATType::FAT32(_) => {
  748. let raw_entry = self.get_fat_entry_raw(Cluster::new(1))? | 0x0800_0000;
  749. self.set_entry(Cluster::new(1), FATEntry::Next(Cluster::new(raw_entry)))?;
  750. return Ok(());
  751. }
  752. FATType::FAT16(_) => {
  753. let raw_entry = self.get_fat_entry_raw(Cluster::new(1))? | 0x8000;
  754. self.set_entry(Cluster::new(1), FATEntry::Next(Cluster::new(raw_entry)))?;
  755. return Ok(());
  756. }
  757. _ => return Ok(()),
  758. }
  759. }
  760. /// @brief 设置文件系统的hard error bit为正常状态
  761. /// 参考资料:https://thestarman.pcministry.com/DOS/DirtyShutdownFlag.html
  762. ///
  763. /// @return Ok(()) 设置成功
  764. /// @return Err(SystemError) 在设置过程中,出现错误
  765. pub fn set_hard_error_bit_ok(&mut self) -> Result<(), SystemError> {
  766. match self.bpb.fat_type {
  767. FATType::FAT32(_) => {
  768. let raw_entry = self.get_fat_entry_raw(Cluster::new(1))? | 0x0400_0000;
  769. self.set_entry(Cluster::new(1), FATEntry::Next(Cluster::new(raw_entry)))?;
  770. return Ok(());
  771. }
  772. FATType::FAT16(_) => {
  773. let raw_entry = self.get_fat_entry_raw(Cluster::new(1))? | 0x4000;
  774. self.set_entry(Cluster::new(1), FATEntry::Next(Cluster::new(raw_entry)))?;
  775. return Ok(());
  776. }
  777. _ => return Ok(()),
  778. }
  779. }
  780. /// @brief 执行文件系统卸载前的一些准备工作:设置好对应的标志位,并把缓存中的数据刷入磁盘
  781. pub fn umount(&mut self) -> Result<(), SystemError> {
  782. self.fs_info.0.lock().flush(&self.partition)?;
  783. self.set_shut_bit_ok()?;
  784. self.set_hard_error_bit_ok()?;
  785. self.partition.disk().sync()?;
  786. return Ok(());
  787. }
  788. /// @brief 获取文件系统的最大簇号
  789. pub fn max_cluster_number(&self) -> Cluster {
  790. match self.bpb.fat_type {
  791. FATType::FAT32(s) => {
  792. // FAT32
  793. // 数据扇区数量(总扇区数-保留扇区-FAT占用的扇区)
  794. let data_sec: u64 = self.bpb.total_sectors_32 as u64
  795. - (self.bpb.rsvd_sec_cnt as u64
  796. + self.bpb.num_fats as u64 * s.fat_size_32 as u64);
  797. // 数据区的簇数量
  798. let total_clusters: u64 = data_sec / self.bpb.sector_per_cluster as u64;
  799. // 返回最大的簇号
  800. return Cluster::new(total_clusters + RESERVED_CLUSTERS as u64 - 1);
  801. }
  802. _ => {
  803. // FAT12 / FAT16
  804. let root_dir_sectors: u64 = (((self.bpb.root_entries_cnt as u64) * 32)
  805. + self.bpb.bytes_per_sector as u64
  806. - 1)
  807. / self.bpb.bytes_per_sector as u64;
  808. // 数据区扇区数
  809. let data_sec: u64 = self.bpb.total_sectors_16 as u64
  810. - (self.bpb.rsvd_sec_cnt as u64
  811. + (self.bpb.num_fats as u64 * self.bpb.fat_size_16 as u64)
  812. + root_dir_sectors);
  813. let total_clusters = data_sec / self.bpb.sector_per_cluster as u64;
  814. return Cluster::new(total_clusters + RESERVED_CLUSTERS as u64 - 1);
  815. }
  816. }
  817. }
  818. /// @brief 在文件系统中寻找一个簇号在给定的范围(左闭右开区间)内的空闲簇
  819. ///
  820. /// @param start_cluster 起始簇号
  821. /// @param end_cluster 终止簇号(不包含)
  822. ///
  823. /// @return Ok(Cluster) 寻找到的空闲簇
  824. /// @return Err(SystemError) 错误码。如果磁盘无剩余空间,或者簇号达到给定的最大值,则返回-ENOSPC.
  825. pub fn get_free_cluster(
  826. &self,
  827. start_cluster: Cluster,
  828. end_cluster: Cluster,
  829. ) -> Result<Cluster, SystemError> {
  830. let max_cluster: Cluster = self.max_cluster_number();
  831. let mut cluster: u64 = start_cluster.cluster_num;
  832. let fat_type: FATType = self.bpb.fat_type;
  833. let fat_start_sector: u64 = self.fat_start_sector();
  834. let bytes_per_sec: u64 = self.bpb.bytes_per_sector as u64;
  835. match fat_type {
  836. FATType::FAT12(_) => {
  837. let part_bytes_offset: u64 =
  838. fat_type.get_fat_bytes_offset(start_cluster, fat_start_sector, bytes_per_sec);
  839. let in_block_offset = self.get_in_block_offset(part_bytes_offset);
  840. let lba = self.get_lba_from_offset(self.bytes_to_sector(part_bytes_offset));
  841. // 由于FAT12的FAT表不大于6K,因此直接读取6K
  842. let num_lba = (6 * 1024) / LBA_SIZE;
  843. let mut v: Vec<u8> = Vec::new();
  844. v.resize(num_lba * LBA_SIZE, 0);
  845. self.partition.disk().read_at(lba, num_lba, &mut v)?;
  846. let mut cursor: VecCursor = VecCursor::new(v);
  847. cursor.seek(SeekFrom::SeekSet(in_block_offset as i64))?;
  848. let mut packed_val: u16 = cursor.read_u16()?;
  849. loop {
  850. let val = if (cluster & 0x1) > 0 {
  851. packed_val >> 4
  852. } else {
  853. packed_val & 0x0fff
  854. };
  855. if val == 0 {
  856. return Ok(Cluster::new(cluster as u64));
  857. }
  858. cluster += 1;
  859. // 磁盘无剩余空间,或者簇号达到给定的最大值
  860. if cluster == end_cluster.cluster_num || cluster == max_cluster.cluster_num {
  861. return Err(SystemError::ENOSPC);
  862. }
  863. packed_val = match cluster & 1 {
  864. 0 => cursor.read_u16()?,
  865. _ => {
  866. let next_byte = cursor.read_u8()? as u16;
  867. (packed_val >> 8) | (next_byte << 8)
  868. }
  869. };
  870. }
  871. }
  872. FATType::FAT16(_) => {
  873. // todo: 优化这里,减少读取磁盘的次数。
  874. while cluster < end_cluster.cluster_num && cluster < max_cluster.cluster_num {
  875. let part_bytes_offset: u64 = fat_type.get_fat_bytes_offset(
  876. Cluster::new(cluster),
  877. fat_start_sector,
  878. bytes_per_sec,
  879. );
  880. let in_block_offset = self.get_in_block_offset(part_bytes_offset);
  881. let lba = self.get_lba_from_offset(self.bytes_to_sector(part_bytes_offset));
  882. let mut v: Vec<u8> = Vec::new();
  883. v.resize(self.lba_per_sector() * LBA_SIZE, 0);
  884. self.partition
  885. .disk()
  886. .read_at(lba, self.lba_per_sector(), &mut v)?;
  887. let mut cursor: VecCursor = VecCursor::new(v);
  888. cursor.seek(SeekFrom::SeekSet(in_block_offset as i64))?;
  889. let val = cursor.read_u16()?;
  890. // 找到空闲簇
  891. if val == 0 {
  892. return Ok(Cluster::new(val as u64));
  893. }
  894. cluster += 1;
  895. }
  896. // 磁盘无剩余空间,或者簇号达到给定的最大值
  897. return Err(SystemError::ENOSPC);
  898. }
  899. FATType::FAT32(_) => {
  900. // todo: 优化这里,减少读取磁盘的次数。
  901. while cluster < end_cluster.cluster_num && cluster < max_cluster.cluster_num {
  902. let part_bytes_offset: u64 = fat_type.get_fat_bytes_offset(
  903. Cluster::new(cluster),
  904. fat_start_sector,
  905. bytes_per_sec,
  906. );
  907. let in_block_offset = self.get_in_block_offset(part_bytes_offset);
  908. let lba = self.get_lba_from_offset(self.bytes_to_sector(part_bytes_offset));
  909. let mut v: Vec<u8> = Vec::new();
  910. v.resize(self.lba_per_sector() * LBA_SIZE, 0);
  911. self.partition
  912. .disk()
  913. .read_at(lba, self.lba_per_sector(), &mut v)?;
  914. let mut cursor: VecCursor = VecCursor::new(v);
  915. cursor.seek(SeekFrom::SeekSet(in_block_offset as i64))?;
  916. let val = cursor.read_u32()? & 0x0fffffff;
  917. if val == 0 {
  918. return Ok(Cluster::new(cluster));
  919. }
  920. cluster += 1;
  921. }
  922. // 磁盘无剩余空间,或者簇号达到给定的最大值
  923. return Err(SystemError::ENOSPC);
  924. }
  925. }
  926. }
  927. /// @brief 在FAT表中,设置指定的簇的信息。
  928. ///
  929. /// @param cluster 目标簇
  930. /// @param fat_entry 这个簇在FAT表中,存储的信息(下一个簇的簇号)
  931. pub fn set_entry(&self, cluster: Cluster, fat_entry: FATEntry) -> Result<(), SystemError> {
  932. // fat表项在分区上的字节偏移量
  933. let fat_part_bytes_offset: u64 = self.bpb.fat_type.get_fat_bytes_offset(
  934. cluster,
  935. self.fat_start_sector(),
  936. self.bpb.bytes_per_sector as u64,
  937. );
  938. match self.bpb.fat_type {
  939. FATType::FAT12(_) => {
  940. // 计算要写入的值
  941. let raw_val: u16 = match fat_entry {
  942. FATEntry::Unused => 0,
  943. FATEntry::Bad => 0xff7,
  944. FATEntry::EndOfChain => 0xfff,
  945. FATEntry::Next(c) => c.cluster_num as u16,
  946. };
  947. let in_block_offset = self.get_in_block_offset(fat_part_bytes_offset);
  948. let lba = self.get_lba_from_offset(self.bytes_to_sector(fat_part_bytes_offset));
  949. let mut v: Vec<u8> = Vec::new();
  950. v.resize(LBA_SIZE, 0);
  951. self.partition.disk().read_at(lba, 1, &mut v)?;
  952. let mut cursor: VecCursor = VecCursor::new(v);
  953. cursor.seek(SeekFrom::SeekSet(in_block_offset as i64))?;
  954. let old_val: u16 = cursor.read_u16()?;
  955. let new_val: u16 = if (cluster.cluster_num & 0x1) > 0 {
  956. (old_val & 0x000f) | (raw_val << 4)
  957. } else {
  958. (old_val & 0xf000) | raw_val
  959. };
  960. // 写回数据到磁盘上
  961. cursor.seek(SeekFrom::SeekSet(in_block_offset as i64))?;
  962. cursor.write_u16(new_val)?;
  963. self.partition.disk().write_at(lba, 1, cursor.as_slice())?;
  964. return Ok(());
  965. }
  966. FATType::FAT16(_) => {
  967. // 计算要写入的值
  968. let raw_val: u16 = match fat_entry {
  969. FATEntry::Unused => 0,
  970. FATEntry::Bad => 0xfff7,
  971. FATEntry::EndOfChain => 0xfdff,
  972. FATEntry::Next(c) => c.cluster_num as u16,
  973. };
  974. let in_block_offset = self.get_in_block_offset(fat_part_bytes_offset);
  975. let lba = self.get_lba_from_offset(self.bytes_to_sector(fat_part_bytes_offset));
  976. let mut v: Vec<u8> = Vec::new();
  977. v.resize(LBA_SIZE, 0);
  978. self.partition.disk().read_at(lba, 1, &mut v)?;
  979. let mut cursor: VecCursor = VecCursor::new(v);
  980. cursor.seek(SeekFrom::SeekSet(in_block_offset as i64))?;
  981. cursor.write_u16(raw_val)?;
  982. self.partition.disk().write_at(lba, 1, cursor.as_slice())?;
  983. return Ok(());
  984. }
  985. FATType::FAT32(_) => {
  986. let fat_size: u64 = self.fat_size();
  987. let bound: u64 = if self.mirroring_enabled() {
  988. 1
  989. } else {
  990. self.bpb.num_fats as u64
  991. };
  992. // kdebug!("set entry, bound={bound}, fat_size={fat_size}");
  993. for i in 0..bound {
  994. // 当前操作的FAT表在磁盘上的字节偏移量
  995. let f_offset: u64 = fat_part_bytes_offset + i * fat_size;
  996. let in_block_offset: u64 = self.get_in_block_offset(f_offset);
  997. let lba = self.get_lba_from_offset(self.bytes_to_sector(f_offset));
  998. // kdebug!("set entry, lba={lba}, in_block_offset={in_block_offset}");
  999. let mut v: Vec<u8> = Vec::new();
  1000. v.resize(LBA_SIZE, 0);
  1001. self.partition.disk().read_at(lba, 1, &mut v)?;
  1002. let mut cursor: VecCursor = VecCursor::new(v);
  1003. cursor.seek(SeekFrom::SeekSet(in_block_offset as i64))?;
  1004. // FAT32的高4位保留
  1005. let old_bits = cursor.read_u32()? & 0xf0000000;
  1006. if fat_entry == FATEntry::Unused
  1007. && cluster.cluster_num >= 0x0ffffff7
  1008. && cluster.cluster_num <= 0x0fffffff
  1009. {
  1010. kerror!(
  1011. "FAT32: Reserved Cluster {:?} cannot be marked as free",
  1012. cluster
  1013. );
  1014. return Err(SystemError::EPERM);
  1015. }
  1016. // 计算要写入的值
  1017. let mut raw_val: u32 = match fat_entry {
  1018. FATEntry::Unused => 0,
  1019. FATEntry::Bad => 0x0FFFFFF7,
  1020. FATEntry::EndOfChain => 0x0FFFFFFF,
  1021. FATEntry::Next(c) => c.cluster_num as u32,
  1022. };
  1023. // 恢复保留位
  1024. raw_val |= old_bits;
  1025. // kdebug!("sent entry, raw_val={raw_val}");
  1026. cursor.seek(SeekFrom::SeekSet(in_block_offset as i64))?;
  1027. cursor.write_u32(raw_val)?;
  1028. self.partition.disk().write_at(lba, 1, cursor.as_slice())?;
  1029. }
  1030. return Ok(());
  1031. }
  1032. }
  1033. }
  1034. /// @brief 清空指定的簇
  1035. ///
  1036. /// @param cluster 要被清空的簇
  1037. pub fn zero_cluster(&self, cluster: Cluster) -> Result<(), SystemError> {
  1038. // 准备数据,用于写入
  1039. let zeros: Vec<u8> = vec![0u8; self.bytes_per_cluster() as usize];
  1040. let offset: usize = self.cluster_bytes_offset(cluster) as usize;
  1041. self.partition
  1042. .disk()
  1043. .write_at_bytes(offset, zeros.len(), zeros.as_slice())?;
  1044. return Ok(());
  1045. }
  1046. }
  1047. impl Drop for FATFileSystem {
  1048. fn drop(&mut self) {
  1049. let r = self.umount();
  1050. if r.is_err() {
  1051. kerror!(
  1052. "Umount FAT filesystem failed: errno={:?}, FS detail:{self:?}",
  1053. r.unwrap_err()
  1054. );
  1055. }
  1056. }
  1057. }
  1058. impl FATFsInfo {
  1059. const LEAD_SIG: u32 = 0x41615252;
  1060. const STRUC_SIG: u32 = 0x61417272;
  1061. const TRAIL_SIG: u32 = 0xAA550000;
  1062. const FS_INFO_SIZE: u64 = 512;
  1063. /// @brief 从磁盘上读取FAT文件系统的FSInfo结构体
  1064. ///
  1065. /// @param partition 磁盘分区
  1066. /// @param in_disk_fs_info_offset FSInfo扇区在磁盘内的字节偏移量(单位:字节)
  1067. /// @param bytes_per_sec 每扇区字节数
  1068. pub fn new(
  1069. partition: Arc<Partition>,
  1070. in_disk_fs_info_offset: u64,
  1071. bytes_per_sec: usize,
  1072. ) -> Result<Self, SystemError> {
  1073. let mut v = Vec::<u8>::new();
  1074. v.resize(bytes_per_sec, 0);
  1075. // 计算fs_info扇区在磁盘上的字节偏移量,从磁盘读取数据
  1076. partition
  1077. .disk()
  1078. .read_at(in_disk_fs_info_offset as usize / LBA_SIZE, 1, &mut v)?;
  1079. let mut cursor = VecCursor::new(v);
  1080. let mut fsinfo = FATFsInfo::default();
  1081. fsinfo.lead_sig = cursor.read_u32()?;
  1082. cursor.seek(SeekFrom::SeekCurrent(480))?;
  1083. fsinfo.struc_sig = cursor.read_u32()?;
  1084. fsinfo.free_count = cursor.read_u32()?;
  1085. fsinfo.next_free = cursor.read_u32()?;
  1086. cursor.seek(SeekFrom::SeekCurrent(12))?;
  1087. fsinfo.trail_sig = cursor.read_u32()?;
  1088. fsinfo.dirty = false;
  1089. fsinfo.offset = Some(in_disk_fs_info_offset);
  1090. if fsinfo.is_valid() {
  1091. return Ok(fsinfo);
  1092. } else {
  1093. kerror!("Error occurred while parsing FATFsInfo.");
  1094. return Err(SystemError::EINVAL);
  1095. }
  1096. }
  1097. /// @brief 判断是否为正确的FsInfo结构体
  1098. fn is_valid(&self) -> bool {
  1099. self.lead_sig == Self::LEAD_SIG
  1100. && self.struc_sig == Self::STRUC_SIG
  1101. && self.trail_sig == Self::TRAIL_SIG
  1102. }
  1103. /// @brief 根据fsinfo的信息,计算当前总的空闲簇数量
  1104. ///
  1105. /// @param 当前文件系统的最大簇号
  1106. pub fn count_free_cluster(&self, max_cluster: Cluster) -> Option<u64> {
  1107. let count_clusters = max_cluster.cluster_num - RESERVED_CLUSTERS as u64 + 1;
  1108. // 信息不合理,当前的FsInfo中存储的free count大于计算出来的值
  1109. if self.free_count as u64 > count_clusters {
  1110. return None;
  1111. } else {
  1112. match self.free_count {
  1113. // free count字段不可用
  1114. 0xffffffff => return None,
  1115. // 返回FsInfo中存储的数据
  1116. n => return Some(n as u64),
  1117. }
  1118. }
  1119. }
  1120. /// @brief 更新FsInfo中的“空闲簇统计信息“为new_count
  1121. ///
  1122. /// 请注意,除非手动调用`flush()`,否则本函数不会将数据刷入磁盘
  1123. pub fn update_free_count_abs(&mut self, new_count: u32) {
  1124. self.free_count = new_count;
  1125. }
  1126. /// @brief 更新FsInfo中的“空闲簇统计信息“,把它加上delta.
  1127. ///
  1128. /// 请注意,除非手动调用`flush()`,否则本函数不会将数据刷入磁盘
  1129. pub fn update_free_count_delta(&mut self, delta: i32) {
  1130. self.free_count = (self.free_count as i32 + delta) as u32;
  1131. }
  1132. /// @brief 更新FsInfo中的“第一个空闲簇统计信息“为next_free.
  1133. ///
  1134. /// 请注意,除非手动调用`flush()`,否则本函数不会将数据刷入磁盘
  1135. pub fn update_next_free(&mut self, next_free: u32) {
  1136. // 这个值是参考量,不一定要准确,仅供加速查找
  1137. self.next_free = next_free;
  1138. }
  1139. /// @brief 获取fs info 记载的第一个空闲簇。(不一定准确,仅供参考)
  1140. pub fn next_free(&self) -> Option<u64> {
  1141. match self.next_free {
  1142. 0xffffffff => return None,
  1143. 0 | 1 => return None,
  1144. n => return Some(n as u64),
  1145. };
  1146. }
  1147. /// @brief 把fs info刷入磁盘
  1148. ///
  1149. /// @param partition fs info所在的分区
  1150. pub fn flush(&self, partition: &Arc<Partition>) -> Result<(), SystemError> {
  1151. if let Some(off) = self.offset {
  1152. let in_block_offset = off % LBA_SIZE as u64;
  1153. let lba = off as usize / LBA_SIZE;
  1154. let mut v: Vec<u8> = Vec::new();
  1155. v.resize(LBA_SIZE, 0);
  1156. partition.disk().read_at(lba, 1, &mut v)?;
  1157. let mut cursor: VecCursor = VecCursor::new(v);
  1158. cursor.seek(SeekFrom::SeekSet(in_block_offset as i64))?;
  1159. cursor.write_u32(self.lead_sig)?;
  1160. cursor.seek(SeekFrom::SeekCurrent(480))?;
  1161. cursor.write_u32(self.struc_sig)?;
  1162. cursor.write_u32(self.free_count)?;
  1163. cursor.write_u32(self.next_free)?;
  1164. cursor.seek(SeekFrom::SeekCurrent(12))?;
  1165. cursor.write_u32(self.trail_sig)?;
  1166. partition.disk().write_at(lba, 1, cursor.as_slice())?;
  1167. }
  1168. return Ok(());
  1169. }
  1170. /// @brief 读取磁盘上的Fs Info扇区,将里面的内容更新到结构体中
  1171. ///
  1172. /// @param partition fs info所在的分区
  1173. pub fn update(&mut self, partition: Arc<Partition>) -> Result<(), SystemError> {
  1174. if let Some(off) = self.offset {
  1175. let in_block_offset = off % LBA_SIZE as u64;
  1176. let lba = off as usize / LBA_SIZE;
  1177. let mut v: Vec<u8> = Vec::new();
  1178. v.resize(LBA_SIZE, 0);
  1179. partition.disk().read_at(lba, 1, &mut v)?;
  1180. let mut cursor: VecCursor = VecCursor::new(v);
  1181. cursor.seek(SeekFrom::SeekSet(in_block_offset as i64))?;
  1182. self.lead_sig = cursor.read_u32()?;
  1183. cursor.seek(SeekFrom::SeekCurrent(480))?;
  1184. self.struc_sig = cursor.read_u32()?;
  1185. self.free_count = cursor.read_u32()?;
  1186. self.next_free = cursor.read_u32()?;
  1187. cursor.seek(SeekFrom::SeekCurrent(12))?;
  1188. self.trail_sig = cursor.read_u32()?;
  1189. }
  1190. return Ok(());
  1191. }
  1192. }
  1193. impl IndexNode for LockedFATInode {
  1194. fn read_at(
  1195. &self,
  1196. offset: usize,
  1197. len: usize,
  1198. buf: &mut [u8],
  1199. _data: &mut FilePrivateData,
  1200. ) -> Result<usize, SystemError> {
  1201. let mut guard: SpinLockGuard<FATInode> = self.0.lock();
  1202. match &guard.inode_type {
  1203. FATDirEntry::File(f) | FATDirEntry::VolId(f) => {
  1204. let r = f.read(
  1205. &guard.fs.upgrade().unwrap(),
  1206. &mut buf[0..len],
  1207. offset as u64,
  1208. );
  1209. guard.update_metadata();
  1210. return r;
  1211. }
  1212. FATDirEntry::Dir(_) => {
  1213. return Err(SystemError::EISDIR);
  1214. }
  1215. FATDirEntry::UnInit => {
  1216. kerror!("FATFS: param: Inode_type uninitialized.");
  1217. return Err(SystemError::EROFS);
  1218. }
  1219. }
  1220. }
  1221. fn write_at(
  1222. &self,
  1223. offset: usize,
  1224. len: usize,
  1225. buf: &[u8],
  1226. _data: &mut FilePrivateData,
  1227. ) -> Result<usize, SystemError> {
  1228. let mut guard: SpinLockGuard<FATInode> = self.0.lock();
  1229. let fs: &Arc<FATFileSystem> = &guard.fs.upgrade().unwrap();
  1230. match &mut guard.inode_type {
  1231. FATDirEntry::File(f) | FATDirEntry::VolId(f) => {
  1232. let r = f.write(fs, &buf[0..len], offset as u64);
  1233. guard.update_metadata();
  1234. return r;
  1235. }
  1236. FATDirEntry::Dir(_) => {
  1237. return Err(SystemError::EISDIR);
  1238. }
  1239. FATDirEntry::UnInit => {
  1240. kerror!("FATFS: param: Inode_type uninitialized.");
  1241. return Err(SystemError::EROFS);
  1242. }
  1243. }
  1244. }
  1245. fn poll(&self) -> Result<PollStatus, SystemError> {
  1246. // 加锁
  1247. let inode: SpinLockGuard<FATInode> = self.0.lock();
  1248. // 检查当前inode是否为一个文件夹,如果是的话,就返回错误
  1249. if inode.metadata.file_type == FileType::Dir {
  1250. return Err(SystemError::EISDIR);
  1251. }
  1252. return Ok(PollStatus::READ | PollStatus::WRITE);
  1253. }
  1254. fn create(
  1255. &self,
  1256. name: &str,
  1257. file_type: FileType,
  1258. _mode: ModeType,
  1259. ) -> Result<Arc<dyn IndexNode>, SystemError> {
  1260. // 由于FAT32不支持文件权限的功能,因此忽略mode参数
  1261. let mut guard: SpinLockGuard<FATInode> = self.0.lock();
  1262. let fs: &Arc<FATFileSystem> = &guard.fs.upgrade().unwrap();
  1263. match &mut guard.inode_type {
  1264. FATDirEntry::File(_) | FATDirEntry::VolId(_) => {
  1265. return Err(SystemError::ENOTDIR);
  1266. }
  1267. FATDirEntry::Dir(d) => match file_type {
  1268. FileType::File => {
  1269. d.create_file(name, fs)?;
  1270. return Ok(guard.find(name)?);
  1271. }
  1272. FileType::Dir => {
  1273. d.create_dir(name, fs)?;
  1274. return Ok(guard.find(name)?);
  1275. }
  1276. FileType::SymLink => return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP),
  1277. _ => return Err(SystemError::EINVAL),
  1278. },
  1279. FATDirEntry::UnInit => {
  1280. kerror!("FATFS: param: Inode_type uninitialized.");
  1281. return Err(SystemError::EROFS);
  1282. }
  1283. }
  1284. }
  1285. fn fs(&self) -> Arc<dyn FileSystem> {
  1286. return self.0.lock().fs.upgrade().unwrap();
  1287. }
  1288. fn as_any_ref(&self) -> &dyn core::any::Any {
  1289. return self;
  1290. }
  1291. fn metadata(&self) -> Result<Metadata, SystemError> {
  1292. return Ok(self.0.lock().metadata.clone());
  1293. }
  1294. fn resize(&self, len: usize) -> Result<(), SystemError> {
  1295. let mut guard: SpinLockGuard<FATInode> = self.0.lock();
  1296. let fs: &Arc<FATFileSystem> = &guard.fs.upgrade().unwrap();
  1297. let old_size = guard.metadata.size as usize;
  1298. match &mut guard.inode_type {
  1299. FATDirEntry::File(file) | FATDirEntry::VolId(file) => {
  1300. // 如果新的长度和旧的长度相同,那么就直接返回
  1301. if len == old_size {
  1302. return Ok(());
  1303. } else if len > old_size {
  1304. // 如果新的长度比旧的长度大,那么就在文件末尾添加空白
  1305. let mut buf: Vec<u8> = Vec::new();
  1306. let mut remain_size = len - old_size;
  1307. let buf_size = remain_size;
  1308. // let buf_size = core::cmp::min(remain_size, 512 * 1024);
  1309. buf.resize(buf_size, 0);
  1310. let mut offset = old_size;
  1311. while remain_size > 0 {
  1312. let write_size = core::cmp::min(remain_size, buf_size);
  1313. file.write(fs, &buf[0..write_size], offset as u64)?;
  1314. remain_size -= write_size;
  1315. offset += write_size;
  1316. }
  1317. } else {
  1318. file.truncate(fs, len as u64)?;
  1319. }
  1320. guard.update_metadata();
  1321. return Ok(());
  1322. }
  1323. FATDirEntry::Dir(_) => return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP),
  1324. FATDirEntry::UnInit => {
  1325. kerror!("FATFS: param: Inode_type uninitialized.");
  1326. return Err(SystemError::EROFS);
  1327. }
  1328. }
  1329. }
  1330. fn list(&self) -> Result<Vec<String>, SystemError> {
  1331. let mut guard: SpinLockGuard<FATInode> = self.0.lock();
  1332. let fatent: &FATDirEntry = &guard.inode_type;
  1333. match fatent {
  1334. FATDirEntry::File(_) | FATDirEntry::VolId(_) => {
  1335. return Err(SystemError::ENOTDIR);
  1336. }
  1337. FATDirEntry::Dir(dir) => {
  1338. // 获取当前目录下的所有目录项
  1339. let mut ret: Vec<String> = Vec::new();
  1340. let dir_iter: FATDirIter = dir.to_iter(guard.fs.upgrade().unwrap());
  1341. for ent in dir_iter {
  1342. ret.push(ent.name());
  1343. // ====== 生成inode缓存,存入B树
  1344. let name: String = ent.name();
  1345. // kdebug!("name={name}");
  1346. if guard.children.contains_key(&name.to_uppercase()) == false
  1347. && name != "."
  1348. && name != ".."
  1349. {
  1350. // 创建新的inode
  1351. let entry_inode: Arc<LockedFATInode> = LockedFATInode::new(
  1352. guard.fs.upgrade().unwrap(),
  1353. guard.self_ref.clone(),
  1354. ent,
  1355. );
  1356. // 加入缓存区, 由于FAT文件系统的大小写不敏感问题,因此存入缓存区的key应当是全大写的
  1357. guard
  1358. .children
  1359. .insert(name.to_uppercase(), entry_inode.clone());
  1360. }
  1361. }
  1362. return Ok(ret);
  1363. }
  1364. FATDirEntry::UnInit => {
  1365. kerror!("FATFS: param: Inode_type uninitialized.");
  1366. return Err(SystemError::EROFS);
  1367. }
  1368. }
  1369. }
  1370. fn find(&self, name: &str) -> Result<Arc<dyn IndexNode>, SystemError> {
  1371. let mut guard: SpinLockGuard<FATInode> = self.0.lock();
  1372. let target = guard.find(name)?;
  1373. return Ok(target);
  1374. }
  1375. fn open(&self, _data: &mut FilePrivateData, _mode: &FileMode) -> Result<(), SystemError> {
  1376. return Ok(());
  1377. }
  1378. fn close(&self, _data: &mut FilePrivateData) -> Result<(), SystemError> {
  1379. return Ok(());
  1380. }
  1381. fn unlink(&self, name: &str) -> Result<(), SystemError> {
  1382. let mut guard: SpinLockGuard<FATInode> = self.0.lock();
  1383. let target: Arc<LockedFATInode> = guard.find(name)?;
  1384. // 对目标inode上锁,以防更改
  1385. let target_guard: SpinLockGuard<FATInode> = target.0.lock();
  1386. // 先从缓存删除
  1387. let nod = guard.children.remove(&name.to_uppercase());
  1388. // 若删除缓存中为管道的文件,则不需要再到磁盘删除
  1389. if let Some(_) = nod {
  1390. let file_type = target_guard.metadata.file_type;
  1391. if file_type == FileType::Pipe {
  1392. return Ok(());
  1393. }
  1394. }
  1395. let dir = match &guard.inode_type {
  1396. FATDirEntry::File(_) | FATDirEntry::VolId(_) => {
  1397. return Err(SystemError::ENOTDIR);
  1398. }
  1399. FATDirEntry::Dir(d) => d,
  1400. FATDirEntry::UnInit => {
  1401. kerror!("FATFS: param: Inode_type uninitialized.");
  1402. return Err(SystemError::EROFS);
  1403. }
  1404. };
  1405. // 检查文件是否存在
  1406. dir.check_existence(name, Some(false), guard.fs.upgrade().unwrap())?;
  1407. // 再从磁盘删除
  1408. let r = dir.remove(guard.fs.upgrade().unwrap().clone(), name, true);
  1409. drop(target_guard);
  1410. return r;
  1411. }
  1412. fn rmdir(&self, name: &str) -> Result<(), SystemError> {
  1413. let mut guard: SpinLockGuard<FATInode> = self.0.lock();
  1414. let target: Arc<LockedFATInode> = guard.find(name)?;
  1415. // 对目标inode上锁,以防更改
  1416. let target_guard: SpinLockGuard<FATInode> = target.0.lock();
  1417. // 先从缓存删除
  1418. guard.children.remove(&name.to_uppercase());
  1419. let dir = match &guard.inode_type {
  1420. FATDirEntry::File(_) | FATDirEntry::VolId(_) => {
  1421. return Err(SystemError::ENOTDIR);
  1422. }
  1423. FATDirEntry::Dir(d) => d,
  1424. FATDirEntry::UnInit => {
  1425. kerror!("FATFS: param: Inode_type uninitialized.");
  1426. return Err(SystemError::EROFS);
  1427. }
  1428. };
  1429. // 检查文件夹是否存在
  1430. dir.check_existence(name, Some(true), guard.fs.upgrade().unwrap())?;
  1431. // 再从磁盘删除
  1432. let r: Result<(), SystemError> =
  1433. dir.remove(guard.fs.upgrade().unwrap().clone(), name, true);
  1434. if r.is_ok() {
  1435. return r;
  1436. } else {
  1437. let r = r.unwrap_err();
  1438. if r == SystemError::ENOTEMPTY {
  1439. // 如果要删除的是目录,且不为空,则删除动作未发生,重新加入缓存
  1440. guard.children.insert(name.to_uppercase(), target.clone());
  1441. drop(target_guard);
  1442. }
  1443. return Err(r);
  1444. }
  1445. }
  1446. fn get_entry_name(&self, ino: InodeId) -> Result<String, SystemError> {
  1447. let guard: SpinLockGuard<FATInode> = self.0.lock();
  1448. if guard.metadata.file_type != FileType::Dir {
  1449. return Err(SystemError::ENOTDIR);
  1450. }
  1451. match ino.into() {
  1452. 0 => {
  1453. return Ok(String::from("."));
  1454. }
  1455. 1 => {
  1456. return Ok(String::from(".."));
  1457. }
  1458. ino => {
  1459. // 暴力遍历所有的children,判断inode id是否相同
  1460. // TODO: 优化这里,这个地方性能很差!
  1461. let mut key: Vec<String> = guard
  1462. .children
  1463. .keys()
  1464. .filter(|k| {
  1465. guard
  1466. .children
  1467. .get(*k)
  1468. .unwrap()
  1469. .metadata()
  1470. .unwrap()
  1471. .inode_id
  1472. .into()
  1473. == ino
  1474. })
  1475. .cloned()
  1476. .collect();
  1477. match key.len() {
  1478. 0=>{return Err(SystemError::ENOENT);}
  1479. 1=>{return Ok(key.remove(0));}
  1480. _ => panic!("FatFS get_entry_name: key.len()={key_len}>1, current inode_id={inode_id:?}, to find={to_find:?}", key_len=key.len(), inode_id = guard.metadata.inode_id, to_find=ino)
  1481. }
  1482. }
  1483. }
  1484. }
  1485. fn mknod(
  1486. &self,
  1487. filename: &str,
  1488. mode: ModeType,
  1489. _dev_t: crate::driver::base::device::DeviceNumber,
  1490. ) -> Result<Arc<dyn IndexNode>, SystemError> {
  1491. let mut inode = self.0.lock();
  1492. if inode.metadata.file_type != FileType::Dir {
  1493. return Err(SystemError::ENOTDIR);
  1494. }
  1495. // 判断需要创建的类型
  1496. if unlikely(mode.contains(ModeType::S_IFREG)) {
  1497. // 普通文件
  1498. return Ok(self.create(filename, FileType::File, mode)?);
  1499. }
  1500. let nod = LockedFATInode::new(
  1501. inode.fs.upgrade().unwrap(),
  1502. inode.self_ref.clone(),
  1503. FATDirEntry::File(FATFile::default()),
  1504. );
  1505. if mode.contains(ModeType::S_IFIFO) {
  1506. nod.0.lock().metadata.file_type = FileType::Pipe;
  1507. // 创建pipe文件
  1508. let pipe_inode = LockedPipeInode::new();
  1509. // 设置special_node
  1510. nod.0.lock().special_node = Some(SpecialNodeData::Pipe(pipe_inode));
  1511. } else if mode.contains(ModeType::S_IFBLK) {
  1512. nod.0.lock().metadata.file_type = FileType::BlockDevice;
  1513. unimplemented!()
  1514. } else if mode.contains(ModeType::S_IFCHR) {
  1515. nod.0.lock().metadata.file_type = FileType::CharDevice;
  1516. unimplemented!()
  1517. } else {
  1518. return Err(SystemError::EINVAL);
  1519. }
  1520. inode
  1521. .children
  1522. .insert(String::from(filename).to_uppercase(), nod.clone());
  1523. Ok(nod)
  1524. }
  1525. fn special_node(&self) -> Option<SpecialNodeData> {
  1526. self.0.lock().special_node.clone()
  1527. }
  1528. }
  1529. impl Default for FATFsInfo {
  1530. fn default() -> Self {
  1531. return FATFsInfo {
  1532. lead_sig: FATFsInfo::LEAD_SIG,
  1533. struc_sig: FATFsInfo::STRUC_SIG,
  1534. free_count: 0xFFFFFFFF,
  1535. next_free: RESERVED_CLUSTERS,
  1536. trail_sig: FATFsInfo::TRAIL_SIG,
  1537. dirty: false,
  1538. offset: None,
  1539. };
  1540. }
  1541. }
  1542. impl Cluster {
  1543. pub fn new(cluster: u64) -> Self {
  1544. return Cluster {
  1545. cluster_num: cluster,
  1546. parent_cluster: 0,
  1547. };
  1548. }
  1549. }
  1550. /// @brief 用于迭代FAT表的内容的簇迭代器对象
  1551. #[derive(Debug)]
  1552. struct ClusterIter<'a> {
  1553. /// 迭代器的next要返回的簇
  1554. current_cluster: Option<Cluster>,
  1555. /// 属于的文件系统
  1556. fs: &'a FATFileSystem,
  1557. }
  1558. impl<'a> Iterator for ClusterIter<'a> {
  1559. type Item = Cluster;
  1560. fn next(&mut self) -> Option<Self::Item> {
  1561. // 当前要返回的簇
  1562. let ret: Option<Cluster> = self.current_cluster;
  1563. // 获得下一个要返回簇
  1564. let new: Option<Cluster> = match self.current_cluster {
  1565. Some(c) => {
  1566. let entry: Option<FATEntry> = self.fs.get_fat_entry(c).ok();
  1567. match entry {
  1568. Some(FATEntry::Next(c)) => Some(c),
  1569. _ => None,
  1570. }
  1571. }
  1572. _ => None,
  1573. };
  1574. self.current_cluster = new;
  1575. return ret;
  1576. }
  1577. }