Skip to content

Commit 899aab4

Browse files
authored
Merge pull request #164 from rust-embedded-community/fix-dir-entry
Backport some fixes to 0.8 branch
2 parents 8a2bf64 + 169bb26 commit 899aab4

File tree

2 files changed

+46
-10
lines changed

2 files changed

+46
-10
lines changed

src/fat/volume.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ pub struct FatVolume {
5555
/// The block the FAT starts in. Relative to start of partition (so add
5656
/// `self.lba_offset` before passing to volume manager)
5757
pub(crate) fat_start: BlockCount,
58+
/// The block the second FAT starts in (if present). Relative to start of
59+
/// partition (so add `self.lba_offset` before passing to volume manager)
60+
pub(crate) second_fat_start: Option<BlockCount>,
5861
/// Expected number of free clusters
5962
pub(crate) free_clusters_count: Option<u32>,
6063
/// Number of the next expected free cluster
@@ -118,10 +121,15 @@ impl FatVolume {
118121
{
119122
let mut blocks = [Block::new()];
120123
let this_fat_block_num;
124+
let mut second_fat_block_num = None;
121125
match &self.fat_specific_info {
122126
FatSpecificInfo::Fat16(_fat16_info) => {
123127
let fat_offset = cluster.0 * 2;
124128
this_fat_block_num = self.lba_start + self.fat_start.offset_bytes(fat_offset);
129+
if let Some(fat_start) = self.second_fat_start {
130+
second_fat_block_num =
131+
Some(self.lba_start + fat_start.offset_bytes(fat_offset));
132+
}
125133
let this_fat_ent_offset = (fat_offset % Block::LEN_U32) as usize;
126134
block_device
127135
.read(&mut blocks, this_fat_block_num, "read_fat")
@@ -143,6 +151,10 @@ impl FatVolume {
143151
// FAT32 => 4 bytes per entry
144152
let fat_offset = cluster.0 * 4;
145153
this_fat_block_num = self.lba_start + self.fat_start.offset_bytes(fat_offset);
154+
if let Some(fat_start) = self.second_fat_start {
155+
second_fat_block_num =
156+
Some(self.lba_start + fat_start.offset_bytes(fat_offset));
157+
}
146158
let this_fat_ent_offset = (fat_offset % Block::LEN_U32) as usize;
147159
block_device
148160
.read(&mut blocks, this_fat_block_num, "read_fat")
@@ -166,6 +178,11 @@ impl FatVolume {
166178
block_device
167179
.write(&blocks, this_fat_block_num)
168180
.map_err(Error::DeviceError)?;
181+
if let Some(second_fat_block_num) = second_fat_block_num {
182+
block_device
183+
.write(&blocks, second_fat_block_num)
184+
.map_err(Error::DeviceError)?;
185+
}
169186
Ok(())
170187
}
171188

@@ -1098,6 +1115,13 @@ where
10981115
blocks_per_cluster: bpb.blocks_per_cluster(),
10991116
first_data_block: (first_data_block),
11001117
fat_start: BlockCount(u32::from(bpb.reserved_block_count())),
1118+
second_fat_start: if bpb.num_fats() == 2 {
1119+
Some(BlockCount(
1120+
u32::from(bpb.reserved_block_count()) + bpb.fat_size(),
1121+
))
1122+
} else {
1123+
None
1124+
},
11011125
free_clusters_count: None,
11021126
next_free_cluster: None,
11031127
cluster_count: bpb.total_clusters(),
@@ -1135,6 +1159,13 @@ where
11351159
blocks_per_cluster: bpb.blocks_per_cluster(),
11361160
first_data_block: BlockCount(first_data_block),
11371161
fat_start: BlockCount(u32::from(bpb.reserved_block_count())),
1162+
second_fat_start: if bpb.num_fats() == 2 {
1163+
Some(BlockCount(
1164+
u32::from(bpb.reserved_block_count()) + bpb.fat_size(),
1165+
))
1166+
} else {
1167+
None
1168+
},
11381169
free_clusters_count: info_sector.free_clusters_count(),
11391170
next_free_cluster: info_sector.next_free_cluster(),
11401171
cluster_count: bpb.total_clusters(),

src/volume_mgr.rs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
use byteorder::{ByteOrder, LittleEndian};
66
use core::convert::TryFrom;
77

8-
use crate::fat::{self, BlockCache, FatType, OnDiskDirEntry, RESERVED_ENTRIES};
8+
use crate::fat::{self, BlockCache, OnDiskDirEntry, RESERVED_ENTRIES};
99

1010
use crate::filesystem::{
1111
Attributes, ClusterId, DirEntry, DirectoryInfo, FileInfo, Mode, RawDirectory, RawFile,
@@ -324,6 +324,13 @@ where
324324
}
325325

326326
let volume_idx = self.get_volume_by_id(volume)?;
327+
328+
match &mut self.open_volumes[volume_idx].volume_type {
329+
VolumeType::Fat(fat_volume) => {
330+
fat_volume.update_info_sector(&self.block_device)?;
331+
}
332+
}
333+
327334
self.open_volumes.swap_remove(volume_idx);
328335

329336
Ok(())
@@ -978,16 +985,13 @@ where
978985
ctime: now,
979986
attributes: att,
980987
// point at our parent
981-
cluster: match fat_type {
982-
FatType::Fat16 => {
983-
// On FAT16, indicate parent is root using Cluster(0)
984-
if parent_directory_info.cluster == ClusterId::ROOT_DIR {
985-
ClusterId::EMPTY
986-
} else {
987-
parent_directory_info.cluster
988-
}
988+
cluster: {
989+
// On FAT16, indicate parent is root using Cluster(0)
990+
if parent_directory_info.cluster == ClusterId::ROOT_DIR {
991+
ClusterId::EMPTY
992+
} else {
993+
parent_directory_info.cluster
989994
}
990-
FatType::Fat32 => parent_directory_info.cluster,
991995
},
992996
size: 0,
993997
entry_block: new_dir_start_block,
@@ -1384,6 +1388,7 @@ mod tests {
13841388
blocks_per_cluster: 8,
13851389
first_data_block: BlockCount(15136),
13861390
fat_start: BlockCount(32),
1391+
second_fat_start: Some(BlockCount(32 + 0x0000_1D80)),
13871392
name: fat::VolumeName::new(*b"Pictures "),
13881393
free_clusters_count: None,
13891394
next_free_cluster: None,

0 commit comments

Comments
 (0)