pub struct SylFS {
pub device: MirroredBlockDevice<BackendDevice>,
pub superblock: Superblock,
next_bitmap_hint: u32,
}Fields§
§device: MirroredBlockDevice<BackendDevice>§superblock: Superblock§next_bitmap_hint: u32次に空きを探し始めるビットマップセクタ(allocate_sector 用)。
【2026-08-05】以前は毎回先頭から走査していた。
5.3MB のフォントを保存すると 1 万回以上 allocate_sector を呼ぶが、
前の方はもう埋まっているので、埋まるほど走査が長くなる。O(n²)。
実測: cache書=3636tick/14回(1 回 260 tick=2.6 秒)。
前回見つけた位置から再開すれば、連続確保が O(1) 近くになる。 見つからなければ 0 へ戻して一巡するので取りこぼしは無い。
Implementations§
Source§impl SylFS
impl SylFS
Sourcepub fn from_parts(
device: MirroredBlockDevice<BackendDevice>,
superblock: Superblock,
) -> Self
pub fn from_parts( device: MirroredBlockDevice<BackendDevice>, superblock: Superblock, ) -> Self
フォーマット済みのデバイスから SylFS を組み立てる。
内部状態(next_bitmap_hint)を持つようになったので、
構造体リテラルではなくこれを使う。
試験からも同じ経路で作れる(tests/src/test_fs_error_propagation.rs)。
Source§impl SylFS
impl SylFS
Sourcepub fn allocate_sector(&mut self) -> u32
pub fn allocate_sector(&mut self) -> u32
空きセクタをビットマップから探索・確保します (COWトランザクション用)
Sourcepub fn deallocate_sector(&mut self, sector: u32)
pub fn deallocate_sector(&mut self, sector: u32)
指定したセクタをビットマップで解放します
Sourcepub fn save_file(
&mut self,
filename: &str,
content: &[u8],
labels: &str,
) -> Result<(), &'static str>
pub fn save_file( &mut self, filename: &str, content: &[u8], labels: &str, ) -> Result<(), &'static str>
ファイルを新しく保存(または上書き)します (COWによる完全保護)
Sourcepub fn read_file(&mut self, filename: &str) -> Option<(FileMetadata, Vec<u8>)>
pub fn read_file(&mut self, filename: &str) -> Option<(FileMetadata, Vec<u8>)>
指定した名前のファイルの内容をロードして返します (チェックサム自動検証 & 自己修復付き、Overlay ROM フォールバック対応)。
§【2026-07-28】互換用のラッパーであること
戻り値が Option のため、「本当に存在しない」と「存在するが読めない」を
区別できない。とくに設定ファイルの読み出しでこれを「存在しない」と
解釈すると既定値で上書きしてしまい、読めなかっただけのファイルを
破棄することになる(実際に config.rs がその経路を持っていた)。
新規のコードは区別できる SylFS::read_file_checked を使うこと。
ここでは少なくとも失敗を無言にしないため、エラーをログへ出す。
Sourcepub fn read_file_checked(
&mut self,
filename: &str,
) -> Result<Option<(FileMetadata, Vec<u8>)>, &'static str>
pub fn read_file_checked( &mut self, filename: &str, ) -> Result<Option<(FileMetadata, Vec<u8>)>, &'static str>
ファイルを読み出す。「存在しない」と「読めない」を区別する版。
Ok(None)… ファイルが存在しない(正常な結果)Ok(Some(..))… 正常に読めたErr(e)… 存在するはずなのに読めない(デバイス異常・両系破損・ ハッシュ衝突・実体セクタの欠落)。呼び出し側はこれを「無い」と 扱ってはならない(上書きするとデータを失う)。
Sourcefn write_overflow_extents(
&mut self,
rest: &[Extent],
) -> Result<u64, &'static str>
fn write_overflow_extents( &mut self, rest: &[Extent], ) -> Result<u64, &'static str>
インラインに収まらないエクステント群を、セクタのチェーンへ書き出す。
各セクタは先頭 8 バイトが「次のセクタ番号(0 で終端)」、以降が
Extent の並び。戻り値はチェーン先頭のセクタ番号(不要なら 0)。
Sourcefn collect_extents(&mut self, meta: &FileMetadata) -> Option<Vec<Extent>>
fn collect_extents(&mut self, meta: &FileMetadata) -> Option<Vec<Extent>>
メタデータから全エクステントを論理順に集める(インライン+溢れチェーン)。
Sourcefn extents_to_sectors(extents: &[Extent]) -> Vec<u64>
fn extents_to_sectors(extents: &[Extent]) -> Vec<u64>
エクステント列を、論理順のセクタ番号列へ展開する。
Sourcepub fn find_by_label(&mut self, label: &str) -> Vec<FileMetadata>
pub fn find_by_label(&mut self, label: &str) -> Vec<FileMetadata>
特定のラベルが割り当てられているファイルをすべて列挙して検索します (メタデータ走査)
Sourcepub fn list_files(&mut self) -> Vec<FileMetadata>
pub fn list_files(&mut self) -> Vec<FileMetadata>
すべての通常ファイルを列挙します
Sourcepub fn delete_file(&mut self, filename: &str) -> Result<(), &'static str>
pub fn delete_file(&mut self, filename: &str) -> Result<(), &'static str>
指定した名前のファイルを削除します (メタデータとデータセクタの安全な解放)
Sourcepub fn list_dir(&mut self, prefix: &str) -> Vec<FileMetadata>
pub fn list_dir(&mut self, prefix: &str) -> Vec<FileMetadata>
プレフィックス(ディレクトリパス等)で始まるファイルを一覧取得します