panda's tech note

Advent Calendar 2019: advfs

Day 16: 重複排除機能(5)

バグが混入した模様なので,スーパーブロックや inode を直接触らないようにしていきます。

スーパーブロックの読み書き

スーバーブロックは advfs_t 構造体から参照できるのですが,こちらを直接参照することはバグの元なので,こちらを変更する場合は,一度 advfs_superblock_t 構造体としてコピーし,書き戻すようにします。 実際のファイルシステムでもブロックデバイスを扱うときはこのように一度メモリにコピーする必要がありますが,性能を上げるために必要に応じてスーパーブロックのキャッシュを持っていることも多いと思います。今回はキャッシュなしで実装しています。

以下はスーパーブロックの読み込みです。単純にスーパーブロックの内容を第2引数の sb にコピーしているだけです。

int
advfs_read_superblock(advfs_t *advfs, advfs_superblock_t *sb)
{
    memcpy(sb, advfs->superblock, sizeof(advfs_superblock_t));

    return 0;
}

同様にスーパーブロックへの書き込みは以下のように実装します。こちらも単純に第2引数の sb をスーパーブロックに書き戻しているだけです。

int
advfs_write_superblock(advfs_t *advfs, advfs_superblock_t *sb)
{
    memcpy(advfs->superblock, sb, sizeof(advfs_superblock_t));

    return 0;
}

今日のまとめと明日の予定

(バグが取れない……ファイルを複数作ると同じファイル名のファイルができあがる……)

inode も直接触らないように改造します。大がかりな手術になってきました。。