dm era - arosh/arosh.github.com GitHub Wiki

dm-era

Documentation

https://www.kernel.org/doc/html/latest/admin-guide/device-mapper/era.html

source

era を記録しているのはここ

https://elixir.bootlin.com/linux/v4.15/source/drivers/md/dm-era-target.c#L1240

bitset_info は dm_disk_bitset である。これは dm_array を 64bit words 用に特殊化したものらしい。dm_array は永続二分木による永続配列の実装らしくディスクに書き出すと root が変わる。

name description
dm_bitset_del dm_disk_bitset を解放したことを宣言して dm_transaction_manager の領域を空ける
dm_disk_bitset_init dm_disk_bitset を初期化して dm_transaction_manager の領域を確保する
dm_bitset_flush dm_disk_bitset を root で示したディスク領域に書き出す。書き換え後の root を受け取るための第3引数があるが、dm-era では同じ md->current_writeset->md.root を使いまわしている

どれだけの大きさの metadata device が必要か調べたかったが、dm_array の実装に依存しそうということしか分からなかった。

thin-provisioning-tools

スーパーブロックは metadata device の先頭から始まる

https://github.com/jthornber/thin-provisioning-tools/blob/443b3c8f0b99086ead83f96c87d161341d05aa45/era/superblock.h#L40

メタデータのブロックサイズは 4096

https://github.com/jthornber/thin-provisioning-tools/blob/0372e689e5e29e1d2ed0efe5dbb212fe9adc12c8/persistent-data/block.h#L38

era::check_superblock に渡される nr_metadata_blocks は デバイスのファイル長 / MD_BLOCK_SIZE

https://github.com/jthornber/thin-provisioning-tools/blob/main/persistent-data/file_utils.cc#L29-L34

layout (super block)

bytes name note
4 csum
4 flags 0
8 blocknr
16 uuid 0x0000000000000000
8 magic #define SUPERBLOCK_MAGIC 2126579579
4 version #define MAX_ERA_VERSION 1
128 metadata_space_map_root
4 data_block_size dmsetup の第三引数の sectors_per_block
4 metadata_block_size DM_ERA_METADATA_BLOCK_SIZE(4096) >> SECTOR_SHIFT(9) = 4096/512 = 8
4 nr_blocks ⌈ti->len / sectors_per_block⌉
4 current_era
12 current_detail nr_bits:4 + writeset_root:8
8 writeset_tree_root
8 era_array_root
8 metadata_snap

btree

tm_.read_lock からは最終的に block_cache::lookup_or_read_block が呼ばれる。block_address は writeset_tree_root

References