fs.rs 69 KB

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