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 が変わる。
- https://elixir.bootlin.com/linux/v4.15/source/drivers/md/persistent-data/dm-array.h#L14
- https://elixir.bootlin.com/linux/v4.15/source/drivers/md/persistent-data/dm-bitset.h#L14
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 の先頭から始まる
メタデータのブロックサイズは 4096
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)
- https://github.com/jthornber/thin-provisioning-tools/blob/443b3c8f0b99086ead83f96c87d161341d05aa45/era/superblock.cc#L22-L45
- https://elixir.bootlin.com/linux/v4.15/source/drivers/md/dm-era-target.c#L160
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
- https://github.com/jthornber/thin-provisioning-tools/blob/0372e689e5e29e1d2ed0efe5dbb212fe9adc12c8/persistent-data/data-structures/btree.tcc#L1033
- https://github.com/jthornber/thin-provisioning-tools/blob/443b3c8f0b99086ead83f96c87d161341d05aa45/block-cache/block_cache.cc#L471