pub struct Fat32FileSystem {
fs_id: FileSystemId,
block_device: Arc<dyn BlockDevice>,
boot_sector: Fat32BootSector,
root_cluster: u32,
sectors_per_cluster: u32,
bytes_per_sector: u32,
root: RwLock<Arc<Fat32Node>>,
name: String,
next_file_id: Mutex<u64>,
fat_cache: Mutex<BTreeMap<u32, u32>>,
}Expand description
FAT32 Filesystem implementation
This struct implements a FAT32 filesystem that can be mounted on block devices. It maintains the block device reference and provides filesystem operations through the VFS v2 interface.
Fields§
§fs_id: FileSystemIdUnique filesystem identifier
block_device: Arc<dyn BlockDevice>Reference to the underlying block device
boot_sector: Fat32BootSectorBoot sector information
root_cluster: u32Root directory cluster
sectors_per_cluster: u32Sectors per cluster
bytes_per_sector: u32Bytes per sector
root: RwLock<Arc<Fat32Node>>Root directory node
name: StringFilesystem name
next_file_id: Mutex<u64>Next file ID generator
fat_cache: Mutex<BTreeMap<u32, u32>>Cached FAT table entries
Implementations§
Source§impl Fat32FileSystem
impl Fat32FileSystem
Sourcepub fn new(
block_device: Arc<dyn BlockDevice>,
) -> Result<Arc<Self>, FileSystemError>
pub fn new( block_device: Arc<dyn BlockDevice>, ) -> Result<Arc<Self>, FileSystemError>
Create a new FAT32 filesystem from a block device
Sourcefn read_boot_sector(
block_device: &dyn BlockDevice,
) -> Result<Fat32BootSector, FileSystemError>
fn read_boot_sector( block_device: &dyn BlockDevice, ) -> Result<Fat32BootSector, FileSystemError>
Read boot sector from block device
Sourcefn validate_fat32(boot_sector: &Fat32BootSector) -> Result<(), FileSystemError>
fn validate_fat32(boot_sector: &Fat32BootSector) -> Result<(), FileSystemError>
Validate that this is a FAT32 filesystem
Sourcefn lookup_file_in_directory(
&self,
cluster: u32,
target_name: &str,
) -> Result<Fat32DirectoryEntryInternal, FileSystemError>
fn lookup_file_in_directory( &self, cluster: u32, target_name: &str, ) -> Result<Fat32DirectoryEntryInternal, FileSystemError>
Lookup a specific file in a directory cluster
Sourcefn read_cluster_data(&self, cluster: u32) -> Result<Vec<u8>, FileSystemError>
fn read_cluster_data(&self, cluster: u32) -> Result<Vec<u8>, FileSystemError>
Read complete cluster data
Sourcefn generate_file_id(&self) -> u64
fn generate_file_id(&self) -> u64
Generate next unique file ID
Sourcefn read_cluster(&self, cluster: u32) -> Result<Vec<u8>, FileSystemError>
fn read_cluster(&self, cluster: u32) -> Result<Vec<u8>, FileSystemError>
Read cluster data from the block device
Sourcefn read_fat_entry(&self, cluster: u32) -> Result<u32, FileSystemError>
fn read_fat_entry(&self, cluster: u32) -> Result<u32, FileSystemError>
Read FAT entry for a given cluster
Sourcefn write_fat_entry(
&self,
cluster: u32,
value: u32,
) -> Result<(), FileSystemError>
fn write_fat_entry( &self, cluster: u32, value: u32, ) -> Result<(), FileSystemError>
Write FAT entry for a given cluster
Sourcepub fn read_file_content(
&self,
start_cluster: u32,
size: usize,
) -> Result<Vec<u8>, FileSystemError>
pub fn read_file_content( &self, start_cluster: u32, size: usize, ) -> Result<Vec<u8>, FileSystemError>
Read file content by following cluster chain
Sourcepub fn read_page_content(
&self,
start_cluster: u32,
page_index: u64,
paddr: usize,
) -> Result<(), FileSystemError>
pub fn read_page_content( &self, start_cluster: u32, page_index: u64, paddr: usize, ) -> Result<(), FileSystemError>
Read a single page (4096 bytes) of file content into physical memory.
This is used by the page cache manager for demand paging.
Sourcepub fn write_file_content(
&self,
current_cluster: u32,
content: &[u8],
) -> Result<u32, FileSystemError>
pub fn write_file_content( &self, current_cluster: u32, content: &[u8], ) -> Result<u32, FileSystemError>
Write file content to disk and return the starting cluster
Sourcefn read_fat_entry_direct(&self, cluster: u32) -> Result<u32, FileSystemError>
fn read_fat_entry_direct(&self, cluster: u32) -> Result<u32, FileSystemError>
Read FAT entry directly from disk without caching
Sourcefn allocate_cluster(&self) -> Result<u32, FileSystemError>
fn allocate_cluster(&self) -> Result<u32, FileSystemError>
Allocate a free cluster from the FAT and mark it as allocated
Sourcefn initialize_directory(
&self,
dir_cluster: u32,
parent_cluster: u32,
) -> Result<(), FileSystemError>
fn initialize_directory( &self, dir_cluster: u32, parent_cluster: u32, ) -> Result<(), FileSystemError>
Initialize a new directory cluster with . and .. entries
Sourcefn update_fs_info_allocated_cluster(
&self,
_allocated_cluster: u32,
) -> Result<(), FileSystemError>
fn update_fs_info_allocated_cluster( &self, _allocated_cluster: u32, ) -> Result<(), FileSystemError>
Update FS Info sector when a cluster is allocated
Sourcefn update_fs_info_freed_cluster(
&self,
freed_count: u32,
) -> Result<(), FileSystemError>
fn update_fs_info_freed_cluster( &self, freed_count: u32, ) -> Result<(), FileSystemError>
Update FS Info sector to increment free cluster count
Sourcefn free_cluster_chain(&self, start_cluster: u32) -> Result<(), FileSystemError>
fn free_cluster_chain(&self, start_cluster: u32) -> Result<(), FileSystemError>
Free a cluster chain starting from the given cluster
Sourcefn write_cluster_data(
&self,
cluster: u32,
data: &[u8],
) -> Result<(), FileSystemError>
fn write_cluster_data( &self, cluster: u32, data: &[u8], ) -> Result<(), FileSystemError>
Read data to a cluster
Sourcefn cluster_to_sector(&self, cluster: u32) -> u32
fn cluster_to_sector(&self, cluster: u32) -> u32
Convert cluster number to first sector number
Sourcefn read_directory_entries(
&self,
cluster: u32,
entries: &mut Vec<Fat32DirectoryEntryInternal>,
) -> Result<(), FileSystemError>
fn read_directory_entries( &self, cluster: u32, entries: &mut Vec<Fat32DirectoryEntryInternal>, ) -> Result<(), FileSystemError>
Read directory entries from a cluster
Sourcefn write_directory_entry_with_name(
&self,
dir_cluster: u32,
filename: &str,
cluster: u32,
size: u32,
is_directory: bool,
) -> Result<(), FileSystemError>
fn write_directory_entry_with_name( &self, dir_cluster: u32, filename: &str, cluster: u32, size: u32, is_directory: bool, ) -> Result<(), FileSystemError>
Write a new directory entry with LFN support to the specified directory cluster
Sourcepub fn update_directory_entry(
&self,
dir_cluster: u32,
filename: &str,
entry: &Fat32DirectoryEntry,
) -> Result<(), FileSystemError>
pub fn update_directory_entry( &self, dir_cluster: u32, filename: &str, entry: &Fat32DirectoryEntry, ) -> Result<(), FileSystemError>
Update an existing directory entry in the specified directory cluster Supports both LFN and SFN matching
Sourcefn requires_lfn(filename: &str) -> bool
fn requires_lfn(filename: &str) -> bool
Check if a filename requires LFN (Long File Name) entries
Sourcefn generate_lfn_entries(filename: &str, sfn_checksum: u8) -> Vec<Fat32LFNEntry>
fn generate_lfn_entries(filename: &str, sfn_checksum: u8) -> Vec<Fat32LFNEntry>
Generate LFN entries for a given filename
Sourcefn calculate_sfn_checksum(sfn: &[u8; 11]) -> u8
fn calculate_sfn_checksum(sfn: &[u8; 11]) -> u8
Calculate checksum for SFN (used in LFN entries)
Sourcefn remove_directory_entry(
&self,
dir_cluster: u32,
filename: &str,
) -> Result<(), FileSystemError>
fn remove_directory_entry( &self, dir_cluster: u32, filename: &str, ) -> Result<(), FileSystemError>
Remove a directory entry from the specified directory cluster
Sourcefn generate_sfn(filename: &str, numeric_tail: Option<u32>) -> [u8; 11]
fn generate_sfn(filename: &str, numeric_tail: Option<u32>) -> [u8; 11]
Generate a FAT32-compliant SFN (Short File Name) from a long filename This implementation follows the Microsoft FAT32 specification
Sourcefn is_valid_sfn_char(ch: char) -> bool
fn is_valid_sfn_char(ch: char) -> bool
Check if a character is valid for SFN according to FAT32 specification
Sourcefn filename_needs_numeric_tail(&self, filename: &str) -> bool
fn filename_needs_numeric_tail(&self, filename: &str) -> bool
Check if filename needs numeric tail (Linux-style behavior) Returns true ONLY for filenames that cannot fit in 8.3 format or contain invalid characters
Sourcefn generate_unique_sfn(
&self,
dir_cluster: u32,
desired_filename: &str,
) -> Result<[u8; 11], FileSystemError>
fn generate_unique_sfn( &self, dir_cluster: u32, desired_filename: &str, ) -> Result<[u8; 11], FileSystemError>
Generate a unique SFN by checking for duplicates in the directory
Sourcefn sfn_exists_in_directory(
&self,
dir_cluster: u32,
sfn: &[u8; 11],
) -> Result<bool, FileSystemError>
fn sfn_exists_in_directory( &self, dir_cluster: u32, sfn: &[u8; 11], ) -> Result<bool, FileSystemError>
Check if an SFN already exists in the specified directory